SDL Programm bricht ab und gibt '3' zurück



  • Hallo.
    Ich ein kleines SDL Programm geschrieben,dieses soll eine Galaxie dynamisch, aus verschiedenen Grafiken zusammenpuzzeln.Außerdem soll man entweder mit der Maus,oder mit der Tastatur scrollen.Dabei sollen die hinteren Galaxien sich langsamer bewegen als die vorderen.

    Das Problem ist wenn ich das Programm complimiere klappt alles,keine Warnings,keine Errors nichts.Dann ploppt das SDL-Fenster auf und schließt sich sofort wieder.
    Mein Code::Blocks meldet dann "Process terminated with status 3 (0 minutes, 0 seconds)",ich vermute aber dass,das Problem in den Zeilen 52/53 liegt.
    Achja ich benutze XP Home Edition und ich hoffe es macht nichts das ich den Code abgekürtzt habe.
    Danke im Voraus^^

    #include<stdlib.h>
    #include<stdio.h>
    #include<time.h>
    #include<iostream>
    
    #include<SDL/SDL.h>
    
    SDL_Surface *win,*galax;
    
    Uint32 g_Black;
    
    #define NUM_GALAXIES 100
    
    struct galaxy
    {
        int x,y,type,depth;
    };
    static int g_DC[]={
        0,0,0,0,20,/*Full Speed*/34,45,55,64,/*1/2*/72,79,85,90,/*1/3*/94,97,99,100/*1/4*/
    };
    galaxy g_[NUM_GALAXIES];
    
    void RandBackground()
    {
        int i = 0;
        int num_types;
        int depth = 0;
    
        num_types = galax->w / 16;
        while(i = g_DC[depth])
        {
            depth++;
            g_[i].depth=depth;
        }
    }
    void DrawBackground(int scrollx, int scrolly)
    {
        int i;
        i=NUM_GALAXIES-1;
        while(i >= 0)
        {
            i--;
            SDL_Rect src,dest;
            src.x= g_[i].type * 16;
            src.y= 0;
            src.w= 16;
            src.h=16;
    
            dest.x = ((unsigned int)(g_[i].x - 4*scrollx/g_[i].depth) % 1024) - 16;
            dest.y = ((unsigned int)(g_[i].y - 4*scrolly/g_[i].depth) % 512) - 16;
    
            SDL_BlitSurface(galax, &src, win, &dest);
        }
    }
    int main(int argc, char *argv[])
    {[...]RandBackground();[...]DrawBackground(scrollx,scrolly);[...]return 0;}
    


  • Zum Einen wieso vermutest du dass der Fehler in 52/53 liegt?
    Benutz den Debugger.

    Zum Anderen:
    Die Loop in DrawBackground mit der Laufvariable i lässt ein Element des Arrays aus.
    Du beginnst mit NUM_GALAXIES-1 und ziehst mit i--; sofort nochmal eins ab...

    Aber wenn ich mir das nochmal genauer ansehe:
    das type element wird nirgends initialisiert aber du multiplizierst es mit 16
    num_types tut überhaupt nichts
    Das depth element wird auch nur bei bestimmten initialisiert und ist sonst unbestimmt

    Alles in allem gibts viele nicht initialisierte Variablen die dann aber doch verwendet werden.



  • Er lässt nicht nur in der Schleife ein Element aus, sondern verursacht auch einen Zugriffsfehler:

    int i;
        i=NUM_GALAXIES-1;
        while(i >= 0)
        {
            i--;
            SDL_Rect src,dest;
            src.x= g_[i].type * 16;
    

    --> Wenn i = 0 ist, wird die Schleife auch durchlaufen. Dann i--, macht i = -1 --> g_[-1].type wird dann nicht klappen

    Ersetz das Ganze mal durch eine for-Schleife:

    for (int i = NUM_GALAXIES - 1; i >= 0; --i) {
         [...]
      }
    


  • Powerpaule schrieb:

    Er lässt nicht nur in der Schleife ein Element aus, sondern verursacht auch einen Zugriffsfehler:

    int i;
        i=NUM_GALAXIES-1;
        while(i >= 0)
        {
            i--;
            SDL_Rect src,dest;
            src.x= g_[i].type * 16;
    

    --> Wenn i = 0 ist, wird die Schleife auch durchlaufen. Dann i--, macht i = -1 --> g_[-1].type wird dann nicht klappen

    Ersetz das Ganze mal durch eine for-Schleife:

    for (int i = NUM_GALAXIES - 1; i >= 0; --i) {
         [...]
      }
    

    Natürlich läuft er dann einmal mehr drüber als gewünscht und das wird ihn vermutlich eben rausschmeißen



  • Verschieb das "i--" ans Ende der while-Schleife, so ist es vermutlich auch gedacht ...

    Das mit dem Initialisieren sollte man auch mal überprüfen ...


Anmelden zum Antworten