Segmentation fault beim Matrosenspiel
-
Hallo!
Ziel des Spiels ist es, dass von einem Matrosen an, den der Kapitän ausgewählt hat jeder 7. über Bord springen muss. Also wenn bei 3 angefangen wird zu zählen, der 10. dann der 17. und so weiter. 30 Matrosen sind an Bord.
Dafür bekommt die Funktion ein Array [30] in dem 1,2,3,4,...seht.Das Auszählen erfolgt in der Funktion ZAELEN.
Compilieren lässt es sich, doch wenn ich es ausführen möchte, wirft er einen Segmentation Fault!
Ich kann jetzt im Code allerdings nichts finden, das das über die "Arraygrenze" schreibt.
Wo ist der Fehler?#define CLS system("clear"); #include <stdio.h> #include <stdlib.h> int zaehlen(int *matr[], int nr); int main() { int anz[31]; int i,nr, ueber, test; //init array for(i=0;i<=29;i++) { anz[i]=i+1; } //eingabe printf("\nBei welchem Matrosen soll begonnen werden? "); scanf("%d", &nr); //zählen ueber = zaehlen(&anz, nr); CLS //ausgabe printf("\n\nDer %d Matrose bleibt uebrig!\n",ueber); } //Funktion ZAEHLEN int zaehlen(int *matr[], int nr) { int i=0,j=0,k=0,l=nr,ueber=0, max=7; //k zählt die 0er die ins Array geschrieben werden //l ist der Anfang des Zählvorganges und zählt danach das Array durch. //j zählt hoch bis max = 7 //i zählt //Solange mehr als 1 Stelle übrig ist, in der nicht 10 steht while (k<=29) { j++; //zähle bis 7 //wenn aktuelle stelle weg if(*matr[l]==0) { j--; //zähle nicht weiter auf 7 } //wenn 7.Stelle erreicht if (j==max) { *matr[l]=0; k++; } //wenn die letzte Stelle im Array erreicht ist, setze l auf 0 if(l==29) l=0; //wenn j=7 --> Setze zurück if(j==7) j=0; l++; } //wenn noch 1 übrig, suche Stelle und gib zurück for(i=0;i<=30;i++) { if(*matr[i]!=0) ueber=*matr[i]; } return(ueber); }
-
F1F1 schrieb:
int *matr[]
Das ist kein Zeiger auf ein Array, sondern ein Array von Zeigern. Warum überhaupt Zeiger an dieser Stelle?
-
dein prog macht auf jeden fall nicht was es soll,
ich denke mal die seg fault kommt daher, dass dein prog in der while schleife fest hängt
warum verlässt du die schleife nicht, wenn du einmal durch das array durch bist?
[EDIT]es sind auch fehler im code. lässt sich das etwa bei dir compilieren?[/EDIT]
-
#include <stdio.h> #define MATR_ANZ 30 void zaehlen(int *matr, int nr); void zaehlen(int *matr, int nr) { int i; for(i=nr;i<=MATR_ANZ;i+=7) printf("Matrose Nr. %d ist ueber Bord gegangen\n", i); } int main (void) { int matrosen[MATR_ANZ]; int i,nr; for(i=0;i<MATR_ANZ;i++) matrosen[i]=i+1; printf("Nr. fuer Matrosenspiel?: "); scanf("%d", &nr); while(getchar()!='\n'); zaehlen(matrosen,nr); return 0; }
-
Horst2 schrieb:
[EDIT]es sind auch fehler im code. lässt sich das etwa bei dir compilieren?[/EDIT]
Das Prog lässt sich einwandfrei compilieren. Er bringt nicht mal eine Fehlermeldung bzw Warnung.
-
Danke /bin/bash0R für den Code, aber ich möchte es doch lieber selber versuchen. Ausserdem ist das nicht ganz das was ich gebraucht hätte.
Du gehst die 30 "Matrosen" 1 mal durch und lässt jeden 7. springen.
Verlangt ist aber, dass so lange jeder 7. springt, bis nur noch einer da ist. und der soll dann ausgegeben werden.
Sowas wie "Ene mene muh und raus bist du!" für Programmierer