Struct Übergabe



  • Guten Tag,

    ich bin ein absoluter Noob was c/c++ angeht. Ich hatte zwar 2 Jahre C in der Schule, aber es ging dort sehr langsam vorran und wie sind auch nicht sonderlich weit gekommen.

    Bitte verweißt nicht auf andere bereits existierende Beträge. Ich habe in diesem Forum schon einige Stunden verbracht, aber komme irgendwie nicht weiter...

    Ich soll eigentlich nur ein kleines Programm schreiben welches in einer Funktion ein leeres Struct als Parameter übergeben bekommt, dieses dann über die Komandozeile mit Daten gefüllt wird, das gefüllte Struct wieder zurück gibt und in einer weiteren Funktion "hübsch" ausgiebt.

    Ich wäre super glückllich über Eure Hilfe!
    Auch nett wäre eine Erklärung warum Ihr was, wie, machen würdet.
    Ich habe bis jetzt folgendes geschrieben:

    # include <stdio.h>
    # include <stdlib.h>
    
    struct kontaktdaten
    {
    	char *name;
    	char *vorname;
    	char *strasse;
    	int hausnummer;
    	int plz;
    	char *ort;
    	int telefon;
    	char *handy;
    	char *email;
    };
    
    void eingabe(struct kontaktdaten *daten1);
    void ausgabe(struct kontaktdaten *daten1);
    
    void main(){
    
    eingabe (kontaktdaten *daten1);
    ausgabe (kontaktdaten *daten1);
    
    }
    void eingabe (struct kontaktdaten daten1){
    
    struct kontaktdaten daten1;
    
    daten1.name = "Mustermann";
    daten1.vorname= "Peter";
    daten1.strasse = "Testweg";
    daten1.hausnummer = 10;
    daten1.plz = 12345;
    daten1.ort = "Hamburg";
    daten1.telefon = 1234567;
    daten1.handy = "12345678910";
    daten1.email = "peter@mustermann.de";
    
    //return kontaktdaten *daten1;
    }
    
    void ausgabe (struct kontaktdaten daten1){
    
    printf ("Name: %s\nVorname: %s\nStrasse: %s\nHausnummer: %d\nPLZ: %d\nOrt: %s\nTel.: %d\nHandy: %s\nE-Mail: %s",
    		 daten1.name,daten1.vorname,daten1.strasse,daten1.hausnummer,
    		 daten1.plz,daten1.ort,daten1.telefon,daten1.handy,daten1.email);
    
    }
    

    Ich sage schon mal vielen vielen Dank!!!

    Gruß

    Moritz



  • Es wäre nett, wenn du uns auch dein Problem mit deinem Quellcode verraten hättest. 😉

    Aber meine Kristallkugel zeigt mir, dass du nach typedef suchst. 😃

    Na? Richtig geraten? 🙂

    PS: Für reines C++ ist ein anderes Forum "zuständig", schau nochmal in die Liste...



  • Naja, wenn ich mein Problem wüsste wäre ich auch schon weiter... 🙄

    Ich habe einfach die oben stehende Aufgabe bekommen und erhalte Fehlermeldungen mit denen ich nichts anfangen kann 😞

    Ich muss die Aufgabe realisieren und weiß nicht was ich falsch mache...
    Geschweige denn was ich richtig mache.
    Ich weiß noch nicht einmal ob ich auf dem richtigen Weg bin...

    Aber schon mal vielen Dank für die schnelle Antwort!!!



  • Dann zeige uns doch mal die Fehlermeldungen - das ist doch auch ein Problem. 😃



  • Ok,

    die Fehlermeldungen sind folgende:

    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(23) : error C2065: 'daten1' : nichtdeklarierter Bezeichner
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(23) : error C2275: "kontaktdaten" : Ungültige Verwendung dieses Typs als Ausdruck
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(5) : Siehe Deklaration von 'kontaktdaten'
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(24) : error C2275: "kontaktdaten" : Ungültige Verwendung dieses Typs als Ausdruck
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(5) : Siehe Deklaration von 'kontaktdaten'
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(30) : error C2082: Neudefinition des formalen Parameters "daten1"
    Fehler beim Ausführen von cl.exe.

    Struct1_1.obj - 4 Fehler, 0 Warnung(en)



  • Also, zwei Fehler habe ich wohl gefunden:

    void eingabe (struct kontaktdaten daten1){ 
    
    struct kontaktdaten daten1; // Das meint er mit "Neudefinition", 
    // der Name ist schon vergeben durch den Parameter.
    // Lösch die Zeile, die ist Murks, wenn ich deinen Ansatz richtig durchschaue.
    
    // zweiter Fehler: du arbeitest mit einem ZEIGER, also nimm -> statt . 
    // Den Fehler hast du nochmal gemacht...
    daten1.name = "Mustermann"; 
    daten1.vorname= "Peter"; 
    daten1.strasse = "Testweg"; 
    daten1.hausnummer = 10; 
    daten1.plz = 12345; 
    daten1.ort = "Hamburg"; 
    daten1.telefon = 1234567; 
    daten1.handy = "12345678910"; 
    daten1.email = "peter@mustermann.de"; 
    
    //return kontaktdaten *daten1; 
    }
    


  • Schon mal vielen Dank!

    Ich habe jetzt nur noch 2 Fehler und mein code sieht wie folgt aus:

    # include <stdio.h>
    # include <stdlib.h>
    
    struct kontaktdaten
    {
    	char *name;
    	char *vorname;
    	char *strasse;
    	int hausnummer;
    	int plz;
    	char *ort;
    	int telefon;
    	char *handy;
    	char *email;
    };
    
    void eingabe(struct kontaktdaten *daten1);
    void ausgabe(struct kontaktdaten *daten1);
    
    void main(){
    
    eingabe (kontaktdaten);
    ausgabe (kontaktdaten);
    
    }
    void eingabe (struct kontaktdaten daten1){
    
    //struct kontaktdaten daten1;
    
    daten1.name = "Mustermann";
    daten1.vorname= "Peter";
    daten1.strasse = "Testweg";
    daten1.hausnummer = 10;
    daten1.plz = 12345;
    daten1.ort = "Hamburg";
    daten1.telefon = 1234567;
    daten1.handy = "12345678910";
    daten1.email = "peter@mustermann.de";
    
    //return kontaktdaten *daten1;
    }
    
    void ausgabe (struct kontaktdaten daten1){
    
    printf ("Name: %s\nVorname: %s\nStrasse: %s\nHausnummer: %d\nPLZ: %d\nOrt: %s\nTel.: %d\nHandy: %s\nE-Mail: %s",
    		 daten1.name,daten1.vorname,daten1.strasse,daten1.hausnummer,
    		 daten1.plz,daten1.ort,daten1.telefon,daten1.handy,daten1.email);
    
    }
    

    Das mit dem "->" habe ich nicht ganz gerafft! Wo soll ich das eintragen?
    Meine Fehler sind jetzt folgende:

    :\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(23) : error C2275: "kontaktdaten" : Ungültige Verwendung dieses Typs als Ausdruck
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(5) : Siehe Deklaration von 'kontaktdaten'
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(24) : error C2275: "kontaktdaten" : Ungültige Verwendung dieses Typs als Ausdruck
    D:\VisualStudio\MSDev98\MyProjects\Struct\Struct1_1.cpp(5) : Siehe Deklaration von 'kontaktdaten'
    Fehler beim Ausführen von cl.exe.

    Struct1_1.obj - 2 Fehler, 0 Warnung(en)



  • Sorry, da habe ich was gelesen, was da hin muss - aber nicht da ist... 😃

    Bei der Funktionsdeklaration ist der Parameter ein Zeiger.

    void eingabe(struct kontaktdaten *daten1);
    

    Bei der Definition nicht.

    void eingabe (struct kontaktdaten daten1){
    

    Wenn das kein Zeiger ist, dann wäre es logisch falsch - denk mal drüber nach. 🙂

    Mit ist noch etwas aufgefallen, da habe ich aber keine Lösung weil ich mit char* nicht fit bin.
    Du musst noch für die Zeichenketten Speicher reservieren bevor du was reinschreibst, sonst macht das Programm alles, aber nicht was es soll. ⚠



  • Stimmt, ist logisch!
    Habe bei der Definition jetzt auch einen Zeiger.
    Habe das gleiche noch einmal in dem "richtigen" C++ Forum gepostet und jetzt eine Version ohne Fehler erhalten.
    Für Deine Mühen vielen vielen Dank!!!
    Falls es dich interessiert füge ich noch einmal die Version ohne Fehler, mit Kommentaren ein.
    In diesem Sinne vielen Dank und einen schönen Tag noch!!!

    # include <stdio.h> 
    # include <stdlib.h> 
    
    struct kontaktdaten 
    { 
        char *name; 
        char *vorname; 
        char *strasse; 
        int hausnummer; 
        int plz; 
        char *ort; 
        int telefon; 
        char *handy; 
        char *email; 
    }; 
    
    void eingabe(struct kontaktdaten *daten1); 
    void ausgabe(struct kontaktdaten *daten1); 
    
    void main() 
    { 
    /* 
      eingabe (kontaktdaten); <- das kann so nicht gehen du übergibst keine Variable sondern einen Typ! 
      ausgabe (kontaktdaten); 
    */ 
    
      struct kontaktdaten daten; 
      eingabe (&daten); // Pointer bilden und an die Funktion übergeben 
      ausgabe (&daten); 
    
    } 
    /*void eingabe (struct kontaktdaten daten1) <- Fehlt das '*'  */ 
    void eingabe (struct kontaktdaten *daten1) 
    { 
      if(!daten1) return; // Speicherzugriffsfehler vermeiden 
    
    //struct kontaktdaten daten1; 
    // Zugriff nur über -> 
    daten1->name = "Mustermann"; 
    daten1->vorname= "Peter"; 
    daten1->strasse = "Testweg"; 
    daten1->hausnummer = 10; 
    daten1->plz = 12345; 
    daten1->ort = "Hamburg"; 
    daten1->telefon = 1234567; 
    daten1->handy = "12345678910"; 
    daten1->email = "peter@mustermann.de"; 
    
    } 
    // Der selbe fehler 1. fehlendes * 2. zugriff über -> 
    void ausgabe (struct kontaktdaten *daten1) 
    { 
      if(!daten1) return; // Speicherzugriffsfehler vermeiden 
    
    printf ("Name: %s\nVorname: %s\nStrasse: %s\nHausnummer: %d\nPLZ: %d\nOrt: %s\nTel.: %d\nHandy: %s\nE-Mail: %s", 
             daten1->name,daten1->vorname,daten1->strasse,daten1->hausnummer, 
             daten1->plz,daten1->ort,daten1->telefon,daten1->handy,daten1->email); 
    }
    


  • Mir macht noch Sorgen, dass du für die char* keinen Speicher reservierst. 😞

    Da muss doch irgendwo noch new oder malloc (und delete dazu) hin - oder stehe ICH jetzt auf dem Schlauch?

    Naja, wenn es so geht dann ist gut - wenn du komische Fehler hast, denke an meine Bedenken. 🙂



  • Joa, hattest anscheinend schon recht!!!
    Habe die Pointer jetzt komplett rausgeschmissen.
    Die Daten werden jetzt von der Konsole eingelesen und direkt im Struct gespeichert.
    Funktioniert soweit auch relativ gut, insofern ich nur in die char Variablen einlese. Sowie ich in int einlesen bekomme ich vom System folgende Fehlermeldung:

    Struct1_3.exe - Fehler in Anwendung

    Die Anweisung in "0x00402aa8" verweist auf Speicher in "0xcccccccc". Der
    Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden.

    Mein Code sieht folgendermaßen aus:

    # include <stdio.h> 
    # include <stdlib.h> 
    
    struct kontaktdaten 
    { 
        char name[40]; 
        char vorname[40]; 
        char strasse[60]; 
        int hausnummer; 
        int plz; 
        char ort[20]; 
        int telefon; 
        int handy; 
        char email[40]; 
    }; 
    
    void eingabe(struct kontaktdaten *daten1); 
    void ausgabe(struct kontaktdaten *daten1); 
    
    void main() 
    { 
    
      struct kontaktdaten daten; 
      eingabe (&daten);  
      ausgabe (&daten); 
    
    } 
    
    void eingabe (struct kontaktdaten *daten1) 
    { 
      if(!daten1) return;
    
    printf("Bitte Nachname eingeben\n");
    scanf ("%s",daten1->name);
    
    printf("Bitte Vorname eingeben\n");
    scanf ("%s",daten1->vorname);
    
    printf("Bitte Strasse eingeben\n");
    scanf ("%s",daten1->strasse);
    
    printf("Bitte Hausnummer eingeben\n");
    scanf ("%d",daten1->hausnummer);
    
    printf("Bitte Postleitzahl eingeben\n");
    scanf ("%d",daten1->plz);
    
    printf("Bitte Telefon-Nummer eingeben\n");
    scanf ("%d",daten1->telefon);
    
    printf("Bitte Handy-Nummer eingeben\n");
    scanf ("%d",daten1->handy);
    
    printf("Bitte E-Mail-Adresse eingeben\n");
    scanf ("%s",daten1->email);
    printf("\n\n");
    
    } 
    
    void ausgabe (struct kontaktdaten *daten1) 
    { 
      if(!daten1) return;
    
    printf ("Name: %s\nVorname: %s\nStrasse: %s\nHausnummer: %d\nPLZ: %d\nOrt: %s\nTel.: %d\nHandy: %d\nE-Mail: %s", 
             daten1->name,daten1->vorname,daten1->strasse,daten1->hausnummer, 
             daten1->plz,daten1->ort,daten1->telefon,daten1->handy,daten1->email); 
    }
    

    Für Hilfe jeglicher Art bin ich sehr Dankbar!!!



  • Jo,
    habe den Fehler selbst gefunden...
    Vielen Dank an alle und ein schönes Wochenende!!! 🙂

    MfG
    Moritz



  • wo lag denn der Fehler, würde mich auch interessieren 🙂


Anmelden zum Antworten