segmentation fault



  • Hallo ich habe folgende funktion:

    void init(Spielfeld* f)
    {
        int i,j;
        for(i=0; i<(f->myX) ; i++)
        {
            for(j=0; j<(f->myY) ; j++)
            {
    
                int i = rand()%100;
                if(i < 50)
                {
                    f->myElements[i][j].hasToChange = 1;
                }
                else
                {
                    f->myElements[i][j].hasToChange = 0;
                }
    
            }
        }
    }
    

    und irgendwie bekomme ich wegen der zeile i= rand() einen segmentation fault
    der aufruf der funktion erfolgt so:

    int main()
    {
       // int i;
        srand(time(NULL));          // Zufallszahlengenerator anwerfen
        Spielfeld Conway;           // Spielfeld anlegen
    
    // Spielfeld-Größe von Benutzer erfragen
        printf("bitte geben sie Breite und Höhe des Spielfelds an: ");
        scanf("%d %d", &Conway.myX, &Conway.myY);
    // Jetzt gehts los
        create(&Conway);            // create alloziiert den nötigen Speicherplatz und legt die Elemente an
        init(&Conway);              // init erzeugt die Startgeneration
    
        return 0;
    }
    

    was mach ich denn falsch?



  • Ich vermute, der Fehler wird eher in der vorigen Zeile sein. Ist f->myY gültig? Bist du mal mit dem Debugger Schritt für Schritt durchgegangen und hast alle Variablen überprüft?

    EDIT: Zeig doch mal die create-Funktion.



  • ^^am 'rand' liegts wohl nicht. ich schätze, du solltest der 'init' funktion die dimensionen übergeben, so etwa:

    void init (Spielfeld* f, int x, int y)
    {
       f->mX = x;
       f->my = y;
       ...
    

    🙂



  • also hier mal das komplette bisher:

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <time.h>               // für unsere Zufallszahlen
    
    typedef struct
    {
        int hasToChange;            // Muss der Status im nächsten Durchlauf geändert werden
        int isSet;                  // Der Momentane Status belebt oder nicht
    
    } Feldelement;
    
    typedef struct
    {
        int myX,myY;                // Spielfeld hat Breite und Höhe
        Feldelement** myElements;   // Spielfeld hat Elemente die oben definiert wurden
    
    } Spielfeld ;
    
    void create(Spielfeld* f)
    {
        int i;
        f->myElements = (Feldelement**) malloc(sizeof(Feldelement)* (f->myX));
        for(i=0; i< f->myX; i++)
        {
            f->myElements[i] = (Feldelement*) malloc(sizeof(Feldelement) * (f->myY));
        }
    }
    
    void init(Spielfeld* f)
    {
        int i,j;
        for(i=0; i<(f->myX) ; i++)
        {
            for(j=0; j<(f->myY) ; j++)
            {
    
                int i = rand()%100;
                if(i < 50)
                {
                    f->myElements[i][j].hasToChange = 1;
                }
                else
                {
                    f->myElements[i][j].hasToChange = 0;
                }
    
            }
        }
    }
    
    int main()
    {
       // int i;
        srand(time(NULL));          // Zufallszahlengenerator anwerfen
        Spielfeld Conway;           // Spielfeld anlegen
    
    // Spielfeld-Größe von Benutzer erfragen
        printf("bitte geben sie Breite und Höhe des Spielfelds an: ");
        scanf("%d %d", &Conway.myX, &Conway.myY);
    // Jetzt gehts los
        create(&Conway);            // create alloziiert den nötigen Speicherplatz und legt die Elemente an
        init(&Conway);              // init erzeugt die Startgeneration
    
        return 0;
    }
    

    da myX und myY Member von f sind dürfte die funktion myX und myY auslesen können oder?



  • Hm, du benutzt das i zweimal, durch die Kapselung sollte das eigentlich kein Problem sein da du das i der Schleife nicht überschreibst...
    Aber! Wenn du dann mit f->myElements[i][j] kommst und i 100 ist, liegt das dann noch im gültigen Bereich? Wenn nicht würde das den SegFault erklären.
    Vielleicht also für das 2. i nen anderen Namen wählen? (k zum Beispiel 😉 )



  • ohne es jetzt ausprobieren zu können - das klingt vernünftig^^

    das kommt von den vielen i's 🙂

    naja dann kommt eben mein favorit int dummy wieder zum einsatz 🙂



  • Hab es eben mal fix kompiliert und getestet:
    Mit i stürzt es bei myX und myY ab wenn dieses 10 sind.
    Wenn ich als Variablennamen dummy nehme gibt es keine Probleme.

    Es scheint also wie Vermutet an der Überdeckung zu liegen. 🙂


Anmelden zum Antworten