![]() |
|
Allocation, resize and exiting issues [A5] |
m4rcdbk
Member #14,386
June 2012
|
Hello all. I've done a bit of research through the site and have found very little conclusive, so I figured I'd make a post to address a few issues I'm having with some code. The first thing I'll note, is that I've stepped away from Allegro for a fair amount of time (about 2 years or so), so when I saw that Allegro 5 had dropped I went for the download. Right now, I'm using GCC version 4.4.1, and Allegro 5.0.0 RC3. My IDE is code::blocks. My First 3 issues: When running the executable, I had to run in compatibility mode with windows XP SP2 in order for it to successfully allocate memory without heap fragmentation. Is this an issue with just the version of allegro I'm using, or one with windows 7? (Code provided below other questions). Secondly, I get another similar issue when trying to open a file. The file has been verified to exist at the path given, and the access rights to the file are everyone. Which, just as an added precaution I allowed it to run as administrator. Lastly, when I exit the code with the al_uninstall_system(); it crashes with (yet again) another sigserv. I attribute these issues to either myself with a bad programming practice somewhere along the way, or with me using an early version of Allegro 5. The code: 1int main()
2{
3 al_init();
4 al_init_image_addon();
5
6 bmp = al_create_bitmap(100, 100); //Crashes here with SIGSERV, when run in compatibility mode this succeeds
7
8 if(bmp)
9 {
10 bmp = al_load_bitmap("B:\\d.bmp"); // it crashes here with a sigserv. debugger points to the DLL itself, unless run in compatibility mode
11 if(bmp)
12 {
13 //All is well
14 float width = al_get_bitmap_width(bmp);
15 float height = al_get_bitmap_height(bmp);
16 al_draw_scaled_bitmap(bmp, 0, 0, width, height, 0, 0, 100, 100, 0); //Crashes here, with or without the compatibility mode. SIGSERV, debugger points to this function call
17 al_save_bitmap("B:\\temp.bmp", bt);
18 }
19 }
20
21 al_shutdown_image_addon();
22
23 al_uninstall_system(); //Crashes here, no matter what kind of compatibility settings I have.
24 return 0;
25}
Lastly, When I tried to update to the latest Allegro (5.0.6) it'd get a Missing DLL error, which through research on here says to link with -static-gcc, and 2 other things. Since I've since removed the linking's and reverted to 5.0.0 again I don't have them to copy and paste back. But I did attempt them. Any and all information, questions, comments or thoughts to help me out would be greatly appreciated. |
jmasterx
Member #11,410
October 2009
|
What about creating a display, it is pretty important to Allegro that you have one. Agui GUI API -> https://github.com/jmasterx/Agui |
Matthew Leverton
Supreme Loser
January 1999
![]() |
Your code isn't doing what you think it is. I don't even know what bt is. You need to call this al_set_target_bitmap(bmp); after creating your first bitmap. Then you need to give your second bitmap a different variable. al_draw_scaled_bitmap() will need to be called with your second bitmap. Then call al_save_bitmap(bmp) (with your first bitmap). Nothing should be crashing if you do that. If it still crashes (particularly with the latest 5.0.x release), then I suspect you're linking against Allegro libraries that are incompatible with your compiler or something. |
m4rcdbk
Member #14,386
June 2012
|
Thanks for the replies, and hopefully I can clear up some confusion. The code provided was a scaled down snippet of the main project in and of itself. I do understand the reasoning for a display, but I figured since what I was using allegro for which is gathering pixel data, and resizing an image. Displaying a picture would be partially irrelevant, granted I didn't take into consideration as far as what's working behind the scenes. I have modified my code to include the al_set_target_bitmap(bmp), as follows 1int main()
2{
3 al_init();
4 al_init_image_addon();
5
6 ALLEGRO_BITMAP *bmp = al_create_bitmap(100, 100); //Crashes here with SIGSERV, when run in compatibility mode this succeeds
7 ALLEGRO_BITMAP *bt; = al_create_bitmap(100, 100);
8 if(bmp)
9 {
10 bmp = al_load_bitmap("B:\\d.bmp"); // it crashes here with a sigserv. debugger points to the DLL itself, unless run in compatibility mode
11 if(bmp)
12 {
13 //All is well
14 al_set_target_bitmap(bt);
15 al_draw_bitmap(bmp, 0, 0, 0);
16 float width = al_get_bitmap_width(bmp);
17 float height = al_get_bitmap_height(bmp);
18 al_draw_scaled_bitmap(bt, 0, 0, width, height, 0, 0, 100, 100, 0);
19 al_save_bitmap("B:\\temp.bmp", bt);
20 }
21 }
22
23 al_shutdown_image_addon();
24 al_uninstall_system(); //Crashes here, no matter what kind of compatibility settings I have.
25 return 0;
26}
As for linking, as I said I've got GCC version 4.4.1, which I've downloaded the latest allegro binaries for. I get that stdc++6.dll error, even with different link options, so I've gone back a few releases. Which, again, if I knew how to resolve that I'd have 0 issues there with keeping most recent. I have not included the adding an allegro display yet, as I just wanted to give a quick update on the code to address Matthew's points, when I get back on later today I will include and update. As always, your time is very much appreciated as is every bit of help. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
Allegro 5.0.0rc3 is WAY OLD, update to the latest version - 5.0.6. Or use SVN 5.1.X if you like cutting edge stuff... Your latest code has a memory leak - don't store a loaded bitmap* in the same pointer you stored one you created without destroying the one you created first. Ex. al_init(); al_init_image_addon(); //ALLEGRO_DISPLAY* disp = al_create_display(640,480);// optional, but if you don't do this, any bitmaps created HAVE to be memory bitmaps ALLEGRO_BITMAP* disk_image = al_load_bitmap("myfile.png"); ALLEGRO_BITMAP* target = al_create_bitmap(100,100); al_set_target_bitmap(target); al_draw_scaled_bitmap(disk_image , 0 , 0 , al_get_bitmap_width(disk_image) , al_get_bitmap_height(disk_image), 0 , 0 , 100 , 100 , 0); al_save_bitmap("myfile_100x100.png" , target);
My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
m4rcdbk
Member #14,386
June 2012
|
Edgar Reynaldo said: Allegro 5.0.0rc3 is WAY OLD, update to the latest version - 5.0.6. Or use SVN 5.1.X if you like cutting edge stuff... I can't get it to execute on "run", or double click. Keeps mentioning stdc++6.dll (or whatever it is), yet I've tried other members linking methods to resolve it. That's the only reason I'm not using 5.0.6. As for the memory leak, I see what you're saying. |
bamccaig
Member #7,536
July 2006
![]() |
The latest code that you posted has a syntax error in it. Nonsensical indentation is generally a good indication that the author doesn't have the mental capacity for programming. al_load_bitmap allocates the bitmap data structure so there's no need to create one first. Even if you did have to, if you aren't passing it in then there's no way for it to be used by the function. Obviously, you are quite new to C. I would suggest learning the language better before trying to use a third party library. And encourage you to be less lazy (I infer laziness from your code). -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Matthew Leverton
Supreme Loser
January 1999
![]() |
bamccaig said: Even if you did have to, if you aren't passing it in then there's no way for it to be used by the function. Oh yeah? 1static ALLEGRO_BITMAP *last_bitmap = NULL;
2
3ALLEGRO_BITMAP *al_create_bitmap(int w, int h)
4{
5 last_bitmap = make_bitmap();
6 return last_bitmap;
7}
8
9ALLEGRO_BITMAP *al_load_bitmap(const char *filename)
10{
11 if (!last_bitmap) blow_up();
12
13 load_bitmap_into_global(last_bitmap);
14 return last_bitmap;
15}
|
Thomas Fjellstrom
Member #476
June 2000
![]() |
m4rcdbk said: I can't get it to execute on "run", or double click. Keeps mentioning stdc++6.dll Its the C++ standard library. You probably want to either copy that into your folder, or link it statically. --static-stdlibc++ or something. -- |
Trent Gamblin
Member #261
April 2000
![]() |
Thomas Fjellstrom said: or link it statically. -static-libstdc++ or something. FTFY. And if you get errors about some missing libgcc....dll, -static-libgcc.
|
Thomas Fjellstrom
Member #476
June 2000
![]() |
what he said. -- |
m4rcdbk
Member #14,386
June 2012
|
Alright. Got it guys. Much appreciated. The heap corruption was from the pointers, and then the linking resolved the uninstall_system issue as well. All's well. Thanks! |
|