[C/C++] Struktur mittels Zeiger an Funktion übergeben

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Affje800, 2. Januar 2011 .

  1. 2. Januar 2011
    Struktur mittels Zeiger an Funktion übergeben

    Hallo,

    ich soll bis Semesterende einen kleinen Sudoku-Löser programmieren. Da wir bei "größeren" Datenmengen Call-by-Value vermeiden sollen, will ich das ganze SUdoku-Feld mittels Zeiger an die Funktion übergeben, allerdings will das einfach nicht so, wie ich das gerne hätte.

    Ich habe oben meine Struktur:

    Code:
    struct Sudoku {
     int Feld[9][9];
    } S;
    
    Prototyp für Funktion Einlesen:
    Code:
    int Einlesen(char *, struct Sudoku *); 
    Aufruf der Funktion:
    Code:
    Einlesen(Pfad, &S);
    Funktion:
    Code:
    int Einlesen(char *Dateiname, struct Sudoku *S){
     
     FILE *Datei;
     int i, j;
     Datei = fopen(Dateiname, "r");
     
     if (Datei != NULL){
     char Buffer[100];
     printf("Datei %s erfolgreich ge%cffnet.", Dateiname, char(148));
     
     for (i = 0; i < 9; i++){
     //In Buffer zwischenspeichern, 100 Zeichen lesen, aus Stream "Datei" auslesen.
     fgets(Buffer, 100, Datei);
     for (j = 0; j < 9; j++){
     Temp[i][j] = Buffer[j] - '0'; //- '0' um in ASCII umzuwandeln 
     }
     }
     fclose(Datei);
     printf("\nSudoku erfolgreich geladen.\n\n");
     }
     else {
     printf("Datei %s konnte nicht ge%cffnet werden.", Dateiname, char(148));
     return 0;
     }
     
     return 1;
    }
    
    Wenn ich jetzt aber auf S zugreifen will, findet er die Komponente Feld nicht, d.h. ich habs falsch übergeben oder sonst einen Fehler gemacht, nur welchen? Ich lese derzeit das Sudoku ein, speichere es in einem temporären Array und weise dann meinem Sudoku-Feld die Werte des temporären Feldes zu, was ja nicht sinnvoll ist

    Vielleicht kann mir ja hier jemand helfen, ich muss ja auch später das Sudoku in andere Funktionen übergeben.
    Danke schonmal im Vorraus.
     
  2. 2. Januar 2011
    AW: Struktur mittels Zeiger an Funktion übergeben

    Eine Struktur ist im Urzustand kein Zeiger. Wenn du also einen Zeiger einer Struktur übergibst musst du es ganz normal als Zeiger behandeln:

    (*S).Feld

    Weil das so häufig vorkommt wurde auch extra ein Operator dafür eingeführt:

    S->Feld
     
  3. 2. Januar 2011
    AW: Struktur mittels Zeiger an Funktion übergeben

    Es wäre gut zu wissen, wie du versucht hast die Werte in dein Struktur-Array zu schreiben...
    So wie N0S es gepostet hat, müsste es klappen..
    PHP:
    S -> Feld [ 0 ][ 0 ] =  2 //2 im Feld ganz oben links
    Zudem würde ich eher immer nur eine Char in den Buffer laden, diesen verarbeiten und dann in dein Array schreiben..
    Oder gleich mit fscanf() die Datei zeilenweise einlesen..
    Da kannst du dann auch zB eine CSV mit einlesen, was das Sudoku einfacher ausfüllbar machen würde (zB mit Excel und dann Speichern unter...)

    MfG
     
  4. 2. Januar 2011
    AW: Struktur mittels Zeiger an Funktion übergeben

    mal ne frage.

    du schreibst ja, dass du "oben" deine struktur hast:
    Code:
    struct Sudoku {
     int Feld[9][9];
    } S;
    also global definiert/deklariert? dann kannst du dir den parameter nämlich sparen, weil die variable "S" dann automatisch in deinen funktionen vorhanden ist.
     
  5. 2. Januar 2011
    AW: Struktur mittels Zeiger an Funktion übergeben

    Danke für die Antworten. Ich hab den Fehler entdeckt, ich habe die Struktur zwar richtig übergeben, aber falsch darauf zugegriffen, ich hab sie so behandelt, als wäre sie nicht als zeiger übergebe worden.

    Habe das ganze jetzt mit Sud->Feld[j] gelöst, es klappt jetzt auch ohne dieses umständliche Temp[][] Array.

    Danke nochmals
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.