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.