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.)


Anmelden zum Antworten