Speicherzugriffsfehler Game of Life
-
Hallo,
ich bin noch relativ unerfahren im Thema C und soll für die Uni jetzt Game of Life in C programmieren.
Das Compilieren klappt mittlerweile ohne Probleme allerdings bekomm ich einen Speicherzugriffsfehler wenn ich versuche das Programm zu starten.Sowas hängt meist mit einem überlaufenden Array zusammen oder? Ich find meinen Fehler allerdings nicht.
main.c:
#include <stdio.h> #include <unistd.h> void objektwahl (int feld [20][40]); //Funktionsdeklaration void anzeigen (int feld [20][40],int k); void berechnen (int feld [20][40]); int feld [20][40]; int main (void) { int i,j,wahl,k; // Variablendeklaration char buffer [100]; printf("Hallo."); for (i=1; i <= 20; i++) // Feld mit 0 initialisieren { for (j=1; i<=40; i++) { feld[i][j]=0; } } do { printf("Wählen sie einen Menüpunkt:\n 1. Objekt platzieren \n 2. Simulation starten \n 3. Beenden"); fgets(buffer, 100, stdin); sscanf(buffer, "%i",&wahl); switch (wahl) // Menü { case 1: objektwahl (feld); break; case 2: for (k=1; k<=100;k++) { anzeigen(feld,k); berechnen(feld); } break; case 3: printf("Auf Wiedersehen"); break; default: printf ("Fehler"); } } while(wahl!=3); return 0; }
anzeigen.c:
void anzeigen (int feld[20][40], int k) { int i,j; system ("clear"); printf ("/----------------------------------------\\ "); for (j=1; j<=40; j++) { printf ("|"); for (i=1; i<=20; i++); { if (feld[i][j]==1) { printf ("X"); } else { printf (" "); } } printf ("|"); } printf ("\\----------------------------------------/ "); printf (" Aktueller Zeitschritt: %i", k); usleep (500000); return; }
berechnen.c:
#include <stdio.h> int finde_nachbarn (int i,int j, int feld[20][40]); void berechnen (int feld[20][40]) { int i,j,feld_neu[20][40],nachbarn; for (j=1; j<=40; j++) { for (i=1; i<=20; i++) { nachbarn=finde_nachbarn(i,j,feld); if (feld[i][j] == 1) { if (nachbarn == 3 || nachbarn == 2) { feld_neu[i][j]=1; } else { feld_neu[i][j]=0; } } else { if (nachbarn == 3) { feld_neu[i][j]=1; } else { feld_neu[i][j]=0; } } } } for(j=1;j<=40;j++) { for(i=1;i<=20;i++) { feld[i][j]=feld_neu[i][j]; } } }
finde_nachbarn.c:
int anzahl; anzahl=0; if (0<(j-1) && (j-1)<=39 && 0<(i-1) && (i-1)<=19 && feld[i-1][j-1]==1) { anzahl=anzahl+1; } else { } if (0<(j-1) && (j-1)<=39 && 0<i && i<=20 && feld[i-1][j]==1) { anzahl=anzahl+1; } else { } if (0<(j-1) && (j-1)<=39 && 1<(i+1) &&(i+1)<=20 && feld[i+1][j-1]==1) { anzahl=anzahl+1; } else { } if (0<j && j<=40 && 1<(i+1) && (i+1)<=20 && feld[i+1][j]==1) { anzahl=anzahl+1; } else { } if (1<(j+1) && (j+1)<=40 && 1<(i+1)&& (i+1)<=20 && feld[i+1][j+1]==1) { anzahl=anzahl+1; } else { } if (0<i && i<=20 && 1<(j+1) && (j+1)<=40 && feld[i][j+1]==1) { anzahl=anzahl+1; } else { } if (1<(i-1) && (i-1)<=20 && 1<(j+1) && (j+1)<=40 && feld[i-1][j+1]==1) { anzahl=anzahl+1; } else { } if (0<(i-1) && (i-1)<=19 && 0<j && j<=40 && feld[i-1][j]==1)
objekte_c.c ist als Objektdatei vorgegeben, seh den Quellcode also leider nicht.
Ich hoffe ihr könnt mir helfen.
-
Die Indizierung für dein Feld:
int feld [20][40];
geht von 0 bis 19 bzw. 0 bis 39 (Ist halt so)
Du greift aber mit
for (i=1; i <= 20; i++) // Feld mit 0 initialisieren { for (j=1; i<=40; i++) { feld[i][j]=0; } }
auf Indizes 20 bzw. 40 zu welche nicht existieren.
Außerdem hast du hier wohl i und j durcheinandergeworfen:
for (j=1; i<=40; i++)
Solche Fehler kommen eventuell noch häufiger vor... weiter habe ich aber nicht nachgesehen.
-
Was mir aufgefallen ist, dass du das Array feld global deklarierst.
Dann brauchst du es aber nicht als Argument an deine Funktionen uebergeben.
Es ist eh in jeder Funktion sichtbar.Gruesse
-
Die Indizes der Arrays gehen in C
immer
von 0 bis Definitionswert-1
Also beiint feld [20][40];
geht der erste Index von 0 bis 109 und der zweite von 0 bis 39.
Mach deine Schleifen stattfor (i=1; i <= 20; i++)
for (i=0; i < 20; i++) // ^ ^ hier nur ein kleiner // hier die 0
Schau auch mal http://www.c-plusplus.net/forum/304211 wegen der Berechnung der Nachbarn.
Und schau mal in die Forensuche. Game of Life gibt es häufiger.
-
Danke für die schnellen Antworten.
An die Indexverschiebung bei Arrays hab ich gar nicht mehr gedacht.Ich habe es jetzt in allen Schleifen korrigiert. Leider kommt immer noch Speicherzugriffsfehler.
Der Fehler müsste ja auch vor dem Hauptmenü liegen oder? Sonst würde es ja zumindest angezeigt werden, ich bekomme allerdings sofort eine Fehlermeldung wenn ich versuche das Programm zu starten.
-
Schmeiss den Debugger an.
Sonst schreib in deinen printf mal ein \n am Ende Und gib mal in deiner Löschschleife mal die Werte i und j aus.
Ein
memset(feld,0,sizeof(feld));
löscht auch dein Feld.