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?


  • Mod

    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

    Autocogito

    Bye, 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


Anmelden zum Antworten