int-Tabelle und Zeiger
-
Hallo
Ich habe eine int-Tabelle gegeben, muss darin Zeile für Zeile alle Werte auf 0 überprüfen, die Anzahl solcher Null-Werte pro Zeile zählen und am Ende jeder Zeile überprüfen, ob nur ein solcher vorhanden ist. Ist dem so, muss dieser geändert werden.
Meine Idee war, ein Zeiger(-Zeiger) auf den Null-Wert zu setzen, damit man ihn nachher einfach ändern kann.
int **sudoku, **field, ... ; for(row=0;row<NUMS;row++) //Zeilen durchgehen { num_empty_f = 0; // Anzahl 0-Felder for(col=0;col<NUMS;col++) //Spalte für Spalte { if(sudoku[row][col] == 0) // Wenn Feld 0, dann... { field = (int **)((sudoku[row])+col); // field zeigt auf das 0-Feld num_empty_f++; //Ein 0-Feld mehr... } } //Wenn Zeile row nur ein leeres Feld hat, dieses mit 5 besetzen if(num_empty_f == 1) { **field = 5; // PROBLEM: Hier gibts ein segmention fault... warum? } }
Ich hoffe, dass das Problem einigermassen verständlich wurde.
Danke,
anchor
-
Willst du jetzt auf einen Zeiger zeigen oder auf einen Feldinhalt??
Ich glaube du solltest das Thema Zeiger nochmal durchkauen und verinnerlichen.
-
Gut möglich
Ich will das 0-Feld per field "markieren", damit ich danach einfach auf dieses Feld zugreifen kann.
Eben **field = 5; oder ähnliches...
-
Wieso diese Zuweisung nicht funktioniert, verstehe ich schlichtweg nicht. Ich habe die Adresse, auf die field kontrolliert, und diese stimmt exakt mit sudoku[row][col] überein.... aber trotzdem kommt dieser segmention fault.
-
in deinem code hast du einen cast. der ist falsch.
dann hast du noch ein deref. auch falsch.warum? weil du operationen mit sudoku machst, die bloedsinn sind.
-
Du willst also auf den Feldinhalt zeigen.
Mit ** zeigst du aber auf einen Zeiger, der wiederrum auf deinen Feldinhalt zeigt.
So, wenn da jetzt 0 drinsteht in deinem Feld und du weißt deinen ** Zeiger auf die Adresse dieses Feldes, dann schreibst du durch die Anweisung **field = 5 auf die Adresse 0 (oder NULL).
Beispiel:
sudoku[row][col] = 0
sudoku[row]+col = 10000 (=> Speicheradresse)Durch die Anweisung field = (int **)((sudoku[row])+col); sieht das ganze dann so aus:
field = 10000 (=>Speicheradresse)
*field = 0 (=> Speicheradresse!)
**field = Wert, der an der Speicheradresse 0 steht!Und nun die Quizfrage: Was musst du anders machen? (Du solltest eigentlich selber drauf kommen können, ansonsten wirst du dich wohl nochmal durch das Kapitel Zeiger quälen müssen.)