Permalänk

C++, "has stopped working"

Tja, har här en riktigt vacker kod med mycket blommor och rabarber i, MEN!

Den krashar när den körs. Är någon här snäll nog att hjälpa mig?

#include "SDL/SDL.h" #include "SDL/SDL_image.h" #include <string> const int SCREEN_WIDTH = 800; const int SCREEN_HEIGHT = 600; const int SCREEN_BPP = 32; SDL_Surface *co[9] = { NULL }; SDL_Surface *screen = NULL; SDL_Event event; SDL_Surface *load_image( std::string filename ) { SDL_Surface* loadedImage = NULL; SDL_Surface* optimizedImage = NULL; loadedImage = IMG_Load( filename.c_str() ); if ( loadedImage != NULL ) { optimizedImage = SDL_DisplayFormat( loadedImage ); SDL_FreeSurface( loadedImage); } return optimizedImage; } void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface( source, NULL, destination, &offset ); } bool init() { if( SDL_Init(SDL_INIT_EVERYTHING) == -1 ) { return false; } screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); if( screen == NULL ) { return false; } SDL_WM_SetCaption( "TTT", NULL ); return true; } bool load_files() { for( int i = 0; i < 9; i++ ) { co[i] = load_image("./images/empty.png"); } } void clean_up() { for( int i = 0; i < 9; i++ ) { SDL_FreeSurface( co[i] ); } SDL_Quit(); } int main( int argc, char* args[] ) { bool quit = false; if( init == false ) { return 1; } if( load_files() == false ) { return 1; } apply_surface( 0, 0, co[0], screen ); if( SDL_Flip( screen ) == -1 ) { return 1; } while( quit == false ) { while( SDL_PollEvent( &event )) { if( event.type == SDL_QUIT ) { quit = true; } } } clean_up(); return 0; }

EDIT: Detta ska vara början på "Tic-Tac-Toe", håller på att lära mig C++, är fortfarande inte bekant med alla koncept.

För lite info
Visa signatur

Programmerande får mig att tänka friskt och klart! Mitt nya liv blir underbart!

Permalänk
Medlem

får man göra så?

SDL_Surface *co[9] = { NULL };

Betyder inte det att första elementet blir NULL?

Det enklaste i ditt fall är väll att debugga, dvs hoppar från rad till rad och ser vart det krashar, lite svårt att se så här mitt i natten

För det andra så är sdl kingigt om man har ddl-filer i rätt mappar, ev i windowskatalogen, vad får du för fel?
Vilken utvecklingsmiljö?

Permalänk
Medlem

SDL_Surface *co[9] = { NULL }; //reagerade jag på.

Annars skulle jag tro att det bara är snurrigt med alla lib och .h. Satt för ca 2 år sedan och försökte göra ett spel i SDL. Hoppade snart över till Allegro, det är lättare. Kanske kan vara något att prova för dig.

Visa signatur

åhoj

Permalänk
Skrivet av Dalton Sleeper:

får man göra så?

SDL_Surface *co[9] = { NULL };

Betyder inte det att första elementet blir NULL?

Det enklaste i ditt fall är väll att debugga, dvs hoppar från rad till rad och ser vart det krashar, lite svårt att se så här mitt i natten

För det andra så är sdl kingigt om man har ddl-filer i rätt mappar, ev i windowskatalogen, vad får du för fel?
Vilken utvecklingsmiljö?

Utvecklingsmiljön är Bloodshed Dev C++ och error-meddelandet är:

"Training_1.exe has stopped working"
Fault module name är SDL.dll så någonstans har du nog rätt... kan det hända att jag har en gammal version av SDL men en ny version av SDL_image som är inkompatibla med varandra då jag tankade dem med ett långt mellanrum?

EDIT: Den raden du hänvisade betyder att alla element i *co[9] blir NULL, inte bara det första. Jag ville ha alla på samma värde men visste inte hur, så jag googlade upp "array define c++" och hittade det tipset.

Visa signatur

Programmerande får mig att tänka friskt och klart! Mitt nya liv blir underbart!

Permalänk
Medlem

kör du 64 bitars os? använder sdl till mitt examensarbete i datorgrafik, så vet att man ställer in kompilatorn på 32 bit så allt blir kompatibelt med sdl 32, vet inte hur det fungerar i antika dev c++ heller då jag kört visual studio i många många år...

Permalänk
Medlem
Skrivet av Slacker89:

EDIT: Den raden du hänvisade betyder att alla element i *co[9] blir NULL, inte bara det första. Jag ville ha alla på samma värde men visste inte hur, så jag googlade upp "array define c++" och hittade det tipset.

Yepp, testade det, funkade gallant har aldrig skrivit på det sättet förr...

Permalänk
Medlem

bool load_files() { for( int i = 0; i < 9; i++ ) { co[i] = load_image("./images/empty.png"); } }

Du har missat return satsen här!
return true eller false...

Permalänk
Medlem

Okey, hittade det "stora" felet, du hade inte initiera sdl, därav krashade det vid konvertering av bilderna (SDL_DisplayFormat), du skriver:

bool init() { if( SDL_Init(SDL_INIT_EVERYTHING) == -1 ) { return false; } screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE ); if( screen == NULL ) { return false; } SDL_WM_SetCaption( "TTT", NULL ); return true; }

I main skrev du sedan:

if( init == false ) { return 1; }

där det ska vara:

if( init() == false ) { return 1; }

dvs init i ditt fall är en funktion, inte en variabel, vet inte varför init gick igenom, kanske något internt i sdl för just nu kunde jag inte se att du hade en sådan med.

Sedan borde du göra något åt bildladdarfunktionen där du inte hade en retur, dvs om bilden misslyckas att laddas in eller inte, kan vara lite bökigt i början att ha bildmappen på rätt ställe...

Permalänk
Medlem
Skrivet av Dalton Sleeper:

får man göra så?

SDL_Surface *co[9] = { NULL };

Betyder inte det att första elementet blir NULL?

Alla element som inte explicit sätts i en initialiseringslista kommer implicit att sättas till 0 vilket i detta fall ger null-pekare konstanten.

Ett tydligare exempel:

int x[10] = {1, 2, 3}; // <=> {1, 2, 3, 0, 0, 0, 0, ...} double y[10] = {0.1, 0.2, 0.3} // <=> { 0.1, 0.2, 0.3, 0.0, 0.0, 0.0, ...}

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem
Skrivet av Weeblie:

Alla element som inte explicit sätts i en initialiseringslista kommer implicit att sättas till 0 vilket i detta fall ger null-pekare konstanten.

Ett tydligare exempel:

int x[10] = {1, 2, 3}; // <=> {1, 2, 3, 0, 0, 0, 0, ...} double y[10] = {0.1, 0.2, 0.3} // <=> { 0.1, 0.2, 0.3, 0.0, 0.0, 0.0, ...}

Okey, tackar

Permalänk
Skrivet av Dalton Sleeper:

Tack för hjälpen, detta löste problemet! Lite skumt dock att jag inte fick en tillsägelse, alternativt en bitchslap av kompilatorn när det nu inte FINNS en variabel som heter "init"...

Visa signatur

Programmerande får mig att tänka friskt och klart! Mitt nya liv blir underbart!

Permalänk
Medlem

Variabler och funktioner lever i samma "namespace", init där tolkas alltså som adressen funktionen init ligger på i minnet.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem
Skrivet av jdv:

Variabler och funktioner lever i samma "namespace", init där tolkas alltså som adressen funktionen init ligger på i minnet.

Kan du utveckla detta? Det blir väll inte så med andra funktioner förutom init i detta fall? Kompilatorn brukar nog klaga direkt har jag för mej, tror faktiskt inte jag har upplevt detta tidigare... Du menar tex som funktionspekare man brukar ange i diverse anrop?

Hur skulle init kunna ge jämförelsen 0 (noll) eller false?
Edit: init==false ger false för att init!=false :S

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Kan du utveckla detta? Det blir väll inte så med andra funktioner förutom init i detta fall? Kompilatorn brukar nog klaga direkt har jag för mej, tror faktiskt inte jag har upplevt detta tidigare... Du menar tex som funktionspekare man brukar ange i diverse anrop?

Hur skulle init kunna ge jämförelsen 0 (noll) eller false?
Edit: init==false ger false för att init!=false :S

Om du har en funktion som heter init så kommer init == false att betyda "adressen init ligger på == 0".
Det som gör att du kan skriva my_func_ptr = init; för att tilldela funktionspekare.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem
Skrivet av jdv:

Om du har en funktion som heter init så kommer init == false att betyda "adressen init ligger på == 0".
Det som gör att du kan skriva my_func_ptr = init; för att tilldela funktionspekare.

Hm, med både init & load_files ligger väll inte på adressen 0? Testade nyss med cleanup också...
Eller blir det nån fin avrundning?

Permalänk
Medlem

Ingen av dem ligger på noll, därför kommer den alltid tro att initialisering körts, trots att funktionerna inte exekverats

Därför man vill ha explicita casts från bool/pekare till int.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

Okey, nu är jag med, läste nog lite tokigt, kanske för att ögonen rullar över tangenterna
Dock har jag nog inte träffat på detta förut... men lär sig nått nytt varje dag, nu var det ju till slut ganska logiskt till slut men ändå.