Struct Übergabe
-
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