struct an funktion übergeben



  • Hi alles zusammen.

    Ich hab nen Problem bei einem Programm. Undzwar möchte ich ne mini Datenbank mit Strukturen realiesieren. Jedoch möchte ich nicht alles in die main schreiben. Die Eingaben sollen in einer Funktion, die Ausgabe an einer anderen Funktion erfolgen.

    Ich glaube ich rufe die Struktur in die Funktion falsch auf. Vielleicht stimmts auch wegen was anderem nicht. Wäre echt klasse, wenn ihr mir helfen könntet.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct adresse{
    
      char name[30];
      char vorname[30];
      char strasse[30];
      int plz;
      char ort[30];
    
    };
    
    void insert_adr(int *anzahl);
    void output(int *anzahl);
    
    int main(){
    
      struct adresse datensatz[10];
    
      int i, anzahl;
      char auswahl;
    
      do{
    
      printf("Adresse(n) in die Datenbank aufnehmen? Tippe 1\n");
      printf("Alle Datensätze anzeigen lassen? Tippe 2\n");
      printf("Programm beenden? Tippe q\n");
    
      printf("Auswahl= ");
      scanf("%c", &auswahl);
    
      if(auswahl == '1'){
    
        printf("\nWie viele Datensätze möchten Sie Aufnehmen?\nMehr als 10 sind nicht zulässig!\nAnzahl = ");
        scanf("%d", &anzahl);
    
        insert_adr(&anzahl);
      }
    
      else if(auswahl == '2'){
    
        output(&anzahl);
      }
    
      }
      while(auswahl != 'q');
    
        printf("\nBeendet\n");
    
    }
    
    void insert_adr(int *anzahl){
    
      int i;
      struct adresse datensatz[10];
    
      for(i=0; i<*anzahl; i++){
    
        printf("Name %d/%d = ", i, *anzahl);
        scanf("%s",&datensatz[i].name);
    
        printf("Vorname %d/%d = ", i, *anzahl);
        scanf("%s",&datensatz[i].vorname);
    
        printf("Straße %d/%d = ", i, *anzahl);
        scanf("%s",&datensatz[i].strasse);
    
        printf("PLZ %d/%d = ", i, *anzahl);
        scanf("%d",&datensatz[i].plz);
    
        printf("Ort %d/%d = ", i, *anzahl);
        scanf("%s",&datensatz[i].ort);
    
      }
    
    }
    
    void output(int *anzahl){
    
      struct adresse datensatz[10];
    
      int i;
    
      printf("\nFolgende Datensätze wurden soeben in die Datenbank Aufgenommen:\n\n");
    
      for(i=0; i<*anzahl; i++){
    
        printf("Name %d/%d = %s\n", i, *anzahl, datensatz[i].name);
    
        printf("Vorname %d/%d = %s\n", i, *anzahl, datensatz[i].vorname);
    
        printf("Straße %d/%d = %s\n", i, *anzahl, datensatz[i].strasse);
    
        printf("PLZ %d/%d = %d\n", i, *anzahl, datensatz[i].plz);
    
        printf("Ort %d/%d = %s\n\n", i, *anzahl, datensatz[i].ort);
    
      }
    
    }
    


  • Du übergibst die Struktur gar nicht an die Funktion, sondern erstellst eine lokale, VOLLKOMMEN UNABHÄNGIGE Struktur innerhalb der Funktion.
    Du musst so etwas schreiben wie:

    void func(struct foo *f);
    

    um die Struktur zu übergeben.
    Und warum übergibst du die Anzahl by reference? Das ist vollkommen unnötig.



  • Sry aba irgendwie mach ich das noch falsch.
    Ich hab übersichtshalbar mal nen kurzes Bsp geschrieben:

    #include <stdio.h>
    
    struct adresse{
      char name[20];
      char vorname[20];
    };
    
    void funktion(struct adresse *daten);
    
    int main(){
    
      struct adresse daten[3];
    
      funktion(struct adresse &daten); 
    }
    
    void funktion(struct adresse *daten){
    
        int i, max=1;
    
        for(i=0; i<=max; i++){
    
        printf("Name %d/%d = ", i, max);
        scanf("%s", &daten[i].name);
        printf("Vorname %d/%d = ", i, max);
        scanf("%s", &daten[i].vorname);
        }
    
      for(i=0; i<=max; i++){
        printf("Name %d/%d = %s\n", i, max, daten[i].name);
        printf("Name %d/%d = %s\n", i, max, daten[i].vorname);
      }
    
    }
    

    Nun meckert der Compiler in Zeile 14: " error: expected expression before ‘struct’ "

    Wie kann man es realisieren, das die Struktur an eine funktion übergeben wird?
    Wäre für weitere Hinweise sehr dankbar.



  • ...



  • emm nein



  • Warum machst du das dann bei structs?



  • ooman xD
    Diese Structs sind noch bisschen neu für mich & haben mich bisschen ausm Konzept gebracht. Ich habe die Strukturen nicht richtig als Variablentypen angesehen wie integer, float ect.

    Klasse, es funktioniert schon. Habe es mit

    funktion(&daten);
    

    in die main reingeholt.
    Der Compiler hat ne warnmeldung gegeben die lautet:
    14:3: warning: passing argument 1 of ‘funktion’ from incompatible pointer type [enabled by default]

    Kann ich die guten gewissen ignorieren oder sollte/kann ich noch was anderes machen?



  • daten wird zu einem Zeiger auf das erste Element von daten[3] . Äquivalent zu &daten[3] . &daten ist so gesehen ein Zeiger auf einen Zeiger auf das erste Element. Da der Zeigerwert (die Adresse) in diesem Fall gleich ist, ist das nicht tragisch, aber halt auch nicht wirklich korrekt.

    Allgemein zu Warnungen: Wenn man sie nicht versteht, dann sollte man sie auch nicht ignorieren 😉



  • Tim schrieb:

    daten wird zu einem Zeiger auf das erste Element von daten[3] .

    Soweit richtig

    Tim schrieb:

    Äquivalent zu &daten[3] .

    ⚠ Das stimmt nicht!.
    Das wäre &daten[0]

    &daten[3] wäre die Adresse vom vierten Element. Das existiert aber gar nicht, da nur 3 angelegt wurden.



  • Das war logischerweise ein Tippfehler.



  • dindong 💡 🙂
    Klasse, danke an euch alle für eure Antworten. Die haben mir alle geholfen. 👍 Habs nun verstanden.


Anmelden zum Antworten