SDL Programm Veriablenzurücksetzung
-
Hallo!
Ich habe folgendes Programm geschrieben:
#include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL/SDL_ttf.h> #include <SDL/SDL_net.h> #include <SDL/SDL_thread.h> using namespace std; bool ende; int server, xanz, yanz; SDL_Surface *bildschirm; TTF_Font *schriftart; SDL_mutex *mutex; int anz_txt(int x, int y, char* text) { SDL_Color farbe; farbe.r=255; farbe.b=255; farbe.g=255; SDL_Surface *tempsurf; SDL_Rect rechteck; tempsurf=TTF_RenderText_Blended(schriftart, text, farbe); rechteck.x=x; rechteck.y=y; SDL_BlitSurface(tempsurf, NULL, bildschirm, &rechteck); SDL_FreeSurface(tempsurf);} class raumschiff {[cpp] public: int besitzer; bool ex; raumschiff(); int mache(); ~raumschiff(); private: int x, y, punkte, ress, typ; }; class station { public: int besitzer; bool ex; station(); int berech(); ~station(); private: int x, y, punkte, ress, typ; }; class spieler { public: int gold, x, y; spieler(); int stdanz(int mausx, int mausy); ~spieler(); }; class sterne { public: int x,y; sterne(); int anz(); ~sterne(); }; sterne::sterne() { x=rand()%2000; y=rand()%2000; } int sterne::anz() { anz_txt(x+xanz,y+yanz,"X"); } sterne::~sterne() { } raumschiff::raumschiff() { x=0;y=0;ex=false;punkte=0;ress=0;} int raumschiff::mache() { } raumschiff::~raumschiff() { } station::station() { x=0;y=0;ex=false;punkte=0;ress=0;} station::~station() { } spieler::spieler() { gold=1000;x=0;y=0;} int spieler::stdanz(int mausx, int mausy) { if (mausx<20){x+=3;} if (mausx>620){x-=3;} if (mausy<20){y+=3;} if (mausy>460){y-=3;} if (x<0){x=0;} if (y<0){y=0;} if (x>2000){x=2000;} if (y>2000){y=2000;} char kette[12]; snprintf(kette, 25, "Gold: %i X: %i Y: %i", gold, x, y); anz_txt(1,1,kette); } spieler::~spieler() { } int netwerkthread(void *p) { while (ende==false) { SDL_Delay(1000); //ende=true; } } int main(int argc, char* argv[]) { int i, mausx, mausy; if (SDL_Init(SDL_INIT_EVERYTHING)!=0 or TTF_Init()!=0){return(0);} bildschirm=SDL_SetVideoMode(640,480,16,SDL_DOUBLEBUF); schriftart=TTF_OpenFont("Daten/Vera.ttf",18); if (bildschirm==NULL or schriftart==NULL){return(0);} raumschiff rs[200]; spieler sp[2]; station stat[50]; sterne stern[50]; SDL_Event ereigniss; ende=false; int spnummer; SDL_Thread *thread; thread=SDL_CreateThread(netwerkthread,0); bool tasten[6]; while (ende==false) { while (SDL_PollEvent(&ereigniss)) { if (ereigniss.type==SDL_QUIT){ende=true;} if (ereigniss.type==SDL_KEYDOWN) { if (ereigniss.key.keysym.sym==SDLK_ESCAPE){ende=true;} if (ereigniss.key.keysym.sym==SDLK_UP){tasten[1]=true;} if (ereigniss.key.keysym.sym==SDLK_DOWN){tasten[2]=true;} if (ereigniss.key.keysym.sym==SDLK_LEFT){tasten[3]=true;} if (ereigniss.key.keysym.sym==SDLK_RIGHT){tasten[4]=true;} } if (ereigniss.type==SDL_KEYUP) { if (ereigniss.key.keysym.sym==SDLK_UP){tasten[1]=false;} if (ereigniss.key.keysym.sym==SDLK_DOWN){tasten[2]=false;} if (ereigniss.key.keysym.sym==SDLK_LEFT){tasten[3]=false;} if (ereigniss.key.keysym.sym==SDLK_RIGHT){tasten[4]=false;} } } SDL_GetMouseState(&mausx, &mausy); if (tasten[1]==true){sp[spnummer].y+=5;} if (tasten[2]==true){sp[spnummer].y-=5;} if (tasten[3]==true){sp[spnummer].x+=5;} if (tasten[4]==true){sp[spnummer].x-=5;} SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format,0,0,255)); for (i=1;i<200;i++) { //raumschiffe if (rs[i].ex==true) { rs[i].mache(); } } for (i=1;i<20;i++) { stern[i].anz(); } sp[0].stdanz(mausx, mausy); xanz=sp[spnummer].x;yanz=sp[spnummer].y; SDL_Flip(bildschirm); SDL_Delay(30); } SDL_KillThread(thread); }Mein Problem: plötzlich, irgendwo in der Mitte des Programmes, während es läuft, wird das Gold auf 0 gesetzt, das Programm wartet kurz, und dann geht es einfach weiter. Kann mir jemand bitte sagen, wieso und wie ich das verhindern kann?
(mit dem Thread hat es wahrscheinlich nichts zu tun; wenn ich den rauskommentier, passiert das trotzdem)
-
Entferne den Code, der das unerwünschte Verhalten versursacht. f'`8k
Bye, TGGC (\-/ returns)
-
Du bist ja nen gaanz kluger. Hat jemand anderes vielleicht spezifischere Vorschläge?
-
das ist ein ganz normaler bug den du debuggen musst. was soll man hier im forum schon spezielles machen, das du nicht machen könntest?
find die stelle an der das passiert.
z.b. kannst du versuchen es reproduzierbar zu machen.
oder du lässt im debugger den wert mit nem memorybreakpoint auf ==0 testen.
oder du schreibst dir selbst nen kleines template um den wert, das bei jedem zugriff vergleicht ob 0 rauskommt mittels assert.
oder du gibst an jeder stelle an dem der wert geändert wird denselbigen im debugstream raus (wenn die variable in einer klasse ist, dürften das nicht viele stellen sein).
greets
rapso
-
DaGeRe schrieb:
Du bist ja nen gaanz kluger.
Richtig erkannt. BTW: "Kluger" gehört hier groß. f'`8k
AutocogitoBye, TGGC (\-/ returns)
-
ich behaupte mal das "char kette[12]" in "spieler::stdanz" nicht gross genug ist um den string, den du mit snprintf erzeugst, aufnehmen zu koennen und willkuerlich speicher ueberschrieben wird.
-
Du hast das alles gelesen? Respekt! Dafür würde ich mich bezahlen lassen. f'`8k
Bye, TGGC (\-/ returns)
-
Du hast das alles gelesen? Respekt!
natuerlich nicht - muesst' ich ja verrueckt sein!
die zeile sprang mir zufaellig beim durchscrollen ins auge...
-
TGGC schrieb:
Du hast das alles gelesen? Respekt! Dafür würde ich mich bezahlen lassen. f'`8k
Bye, TGGC (\-/ returns)

-
char kette[12]; snprintf(kette, 25, "Gold: %i X: %i Y: %i", gold, x, y);pfui
stringstream kette; kette << "Gold: " << gold << " X: " << x << " Y: " << y ;so geht das ... ^^
-
Und wenn man KingOfTheBlueScreen ist? f'`8k
Bye, TGGC (\-/ returns)
-
@TGGC
es ist noch kein meister vom himmel gefallen
foren sind zum erfahrungsaustausch und um anregungen zu sammeln da.TravisG schrieb:
TGGC schrieb:
Du hast das alles gelesen? Respekt! Dafür würde ich mich bezahlen lassen. f'`8k
du scheinst ja auch viel zu lesen und dann doch nichts zu sagen zu haben
also fang du mal nich an von dummheit zu reden