Speicherzugriffsfehler
-
Moin Leute,
Zu allererst mal: Frohe Weihnachten!
Ich habe ein Problem bei der Lösung eines Rätsels mit C. Bin nebenbei noch Anfänger in C. Es geht um folgendes: Man habe ein Schachbrett und möchte 8 Damen darauf platzieren, sodass diese sich gegenseitig nicht schlagen.
Das Programm hierfür sieht jetzt so aus (das ist nur der Teil, welcher zu den "koordinaten" einer Dame die betroffenen Felder auf "besetzt" setzt).#include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> int main (void) { enum boolean { false, true } array_fields[8][8]; //variablen deklarieren int i_1, i_2, i_3, i_4, i_5, i_6, i_7, i_8; //Durchlauf: Main int set_true_x, set_true_y; //Durchlauf: alle Felder auf true setzen int damen[1][2]; //Damen-Array int ausgabe_zeichen = 89; //Ausgabe oberer und unterer Rand int ausgabe_x, ausgabe_y; //Für Asugabe des Schachbretts int update; //Durchlauf: Damen beim updaten int update_x, update_y; //X-undY-Werte der Damen beim updaten int update_durchlauf_x, update_durchlauf_y; //Durchlauf: Updaten von Damen für eine Richtung int update_if; for (set_true_y = 0; set_true_y <= 7; set_true_y++) { for (set_true_x = 0; set_true_x <= 7; set_true_x++) { array_fields[set_true_x][set_true_y] = true; } } damen[0][0] = 6; //hier werden die damen gesetzt (x-richtung) damen[0][1] = 5; //hier werden die damen gesetzt (y-richtung) //Felder updaten for (update = 0; update <= 0; update++) { update_x = damen[update][0]; update_y = damen[update][1]; for (update_durchlauf_x = 0; update_durchlauf_x <= 7; update_durchlauf_x++) { //in x-richtung array_fields[update_durchlauf_x][update_y] = false; } for (update_durchlauf_y = 0; update_durchlauf_y <= 7; update_durchlauf_y++) { //in y-richtung array_fields[update_x][update_durchlauf_y] = false; } if (update_x == 7 && update_y == 7) { //diagonal fallend continue; } if (update_x == 0 && update_y == 0) { continue; } //Berechne Startwert update_if = update_x + update_y - 8; if (update_if <= 7) { update_durchlauf_y = 0; update_durchlauf_x = update_x + update_y; printf ("%d", update_x + update_y - 8); } else { update_durchlauf_x = 7; update_durchlauf_y = fabs (update_x + update_y - 7); } for (update_durchlauf_x = update_durchlauf_x, update_durchlauf_y = update_durchlauf_y; update_durchlauf_x >= 0 && update_durchlauf_y <= 7; update_durchlauf_x--, update_durchlauf_y++) { array_fields[update_durchlauf_x][update_durchlauf_y] = false; } } //Ausgabe der belegungen printf ("- - - - - - - - - - - - - -\n"); for (ausgabe_y = 7; ausgabe_y >= 0; ausgabe_y--) { printf ("| "); for (ausgabe_x = 0; ausgabe_x <= 7; ausgabe_x++) { if (array_fields[ausgabe_x][ausgabe_y] == true) { printf(" * "); } else { printf(" X "); } } printf (" |\n"); } printf ("- - - - - - - - - - - - - -\n"); }
Ich habe keine Ahnung woran das liegt. Feststeht folgenes: Ich setze eine Dame auf 5,5. dann läuft alles prima. Dann setze ich auf 6,5, kompiliere neu und es kommt "speicherzugriffsfehler" (nur ein Beispiel, da ich denke, dass es bei anderen Werten ähnlich ist.
-
Noch eine Info nebenbei: Wenn ich update_x + update_y - 8 direkt in die if-abfrage schreibe (Zeile 43), dann dreht der total am Rad und gibt murks aus.
und wenn ich das ganze ohne update_if mache (wie oben beschrieben), dann scheint die Abfrage nicht ganz richtig zu funktionieren. Beispielsweise bei 5,5=>5+5=20; 10-7=3 3 <= 7. Müsste er also eigentlich durchlaufen Stattdessen wird der else-zweig ausgeführt.
noch eine Info: Das Problm scheint aufzutreten, wenn update_x + update_y = 11 sind! Bei update_x + update_y > 11 passiert gar nichts mehr.
Ich kompiliere unter Ubuntu 10.10 LTS
Bei -Wall beim kompilieren finde ich auch keine Hinweise.
-
Debuggen und Du wirst sehen wo es knallt
-
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()Das gibt der Debugger aus. Nur was heist das?
-
pilleee schrieb:
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()Das gibt der Debugger aus. Nur was heist das?
Kompiliere mal mit "-O0" und "-g", und dann nochmal.
-
genau das selbe!
-
Komisch, mit -g sollte gdb was schöneressagen. Tipp doch mal "backtrace" in den gdb ein, sobald es gecrasht hat.
-
Mit dem Dbugger durch das Programm steppen. Dann wirst Du exakt an die Stelle geführt, wo Du versuchst irgentwas an Speicherstelle 0 zu schreiben oder von dort zu lesen.
-
` for (set_true_y = 0; set_true_y <= 7; set_true_y++) {
for (set_true_x = 0; set_true_x <= 7; set_true_x++) { array_fields[set_true_x][set_true_y] = true; } }`
Sieht ziemlich sinnfrei aus, zumal danach alle Elemente wieder auf false gesetzt werden.
for (update = 0; update <= 0; update++) {
Ebenso ziemlich sinnfrei.update_durchlauf_y = fabs (update_x + update_y - 7);
Wieso fabs statt abs?for (update_durchlauf_x = update_durchlauf_x, update_durchlauf_y = update_durchlauf_y;
Sinnfrei.` for (update_durchlauf_x = update_durchlauf_x, update_durchlauf_y = update_durchlauf_y; update_durchlauf_x >= 0 && update_durchlauf_y <= 7; update_durchlauf_x--, update_durchlauf_y++) {
array_fields[update_durchlauf_x][update_durchlauf_y] = false; }`
Hier läufst du über Arraygrenzen hinweg, deshalb der Fehler.
:xmas1: http://ideone.com/mj39C :xmas1:
-
Spielverderber