[C] - Schwierigkeiten mit pointer, structs, etc.

Aus gegebenem Anlass: Sichert eure Backupcodes wenn ihr die Zwei-Faktor-Authentifizierung aktiviert habt!

Infos dazu findet ihr nochmal hier

  • Guten Abend,


    ich bekam von der Hochschule ein Übungsblatt mit mehreren Aufgaben. Bei einer stehe ich total auf dem Schlauch, diese beschäftigt sich mit stucts, pointer und ähnlichem. Für Wegweiser zur Lösung wäre ich sehr dankbar!


    Vorgaben:

    C
    1. typedef struct _kunDB {
    2. int num; // Kundennummer
    3. char *name; // Kundenname
    4. int plz; // Postleitzahl
    5. char *ort; // Wohnort
    6. } kunDB_t;
    7. #define MAX 50 // maximal 50 Kunden
    8. kunDB_t *feld[MAX]; // Feld von Pointern auf die Kundendaten [wurde von mir in "int main()" verlegt, der Rest ist außerhalb]


    Aufgabe: Eine Funktion "eingeben()" zu implementieren, welche die Daten nach dem Einlesen (mittels scanf) speichert.


    Meine Funktion "eingeben()":


    Das Problem: Die nächste Aufgabe fordert eine Funktion für die Ausgabe der eingegeben Daten. Ich habe sie wie unten zu sehen ist implementiert, nur kommt es bei der Ausgabe zu Fehler [wie im Spoiler zu sehen ist].


    C
    1. void ausgeben(kunDB_t feld[]) {
    2. for(int i = 0; feld[i].name != NULL; i++) { //solange durchlaufen, bis ein Feld.name "leer"/NULL ist.
    3. printf("\nKundenzaehler.. %d\n",i);
    4. printf("Kundenummer.... %d\n",feld[i].num);
    5. printf("Name........... %s\n",feld[i].name);
    6. printf("Postleitzahl... %d\n",feld[i].plz);
    7. printf("Wohnort........ %s\n",feld[i].ort);
    8. }
    9. }

    Konsole/Fehler:


    Wodurch könnte dieser Fehler erzeugt werden? Ich vermute, dass ich irgendwo bei der Übergabe vom feld Fehler gemacht habe bzw. mit dem Pointer falsch umgehe.


    Liebe Grüße

    Cooper

    Einmal editiert, zuletzt von DerCooper ()

  • feld[n].name = name;

    Ja, in C weist man so keine Strings zu :)


    http://www.c-howto.de/tutorial…ktionen/strings-kopieren/


    Nutze:


    C
    1. strcpy(feld[n].name, name);
    2. //und bei Ort auch:
    3. strcpy(feld[n].ort, ort);


    Theoretisch könnteste Quick & Dirty auch direkt alles vom scanf ins struct schreiben:


    C
    1. void eingeben(int n, kunDB_t feld[]) { //n startet bei 0, wird vor jedem Aufruf um 1 erhöht
    2. scanf("%d %s %d %s",&feld[n].num,&feld[n].name,&feld[n].plz,&feld[n].ort);
    3. }

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hallo,


    vielen Dank für deinen Lösungsvorschlag. Einen Weg hatte ich schon probiert zu gehen...


    Weg mit strcpy() -> Stürzt direkt beim Ausführen ab.


    Weg "Quick & Dirty" -> Habe daran gar nicht gedacht... funktioniert jedoch genauso wenig. :( Bei dem ersten printf() eines Strings stürzt das Programm ebenfalls ab. (Siehe Bild)



    PS: In meinem ersten Beitrag habe ich vergessen die Warnungen vom Compiler mitzugeben.. Diese verstärken meinen Verdacht auf einen falschen Umgang mit Pointern.


    C
    1. eingeben(n++, feld);
    2. //warning: passing argument 2 of 'eingeben' from incompatible pointer type [-Wincompatible-pointer-types]|
    3. void eingeben(int n, kunDB_t feld[])
    4. //note: expected 'kunDB_t *' {aka 'struct _kunDB *'} but argument is of type 'kunDB_t **' {aka 'struct _kunDB **'}|
    5. ausgeben(feld);
    6. //warning: passing argument 1 of 'ausgeben' from incompatible pointer type [-Wincompatible-pointer-types]|


    Edit:

    Zum Thema "Falscher Umgang mit Pointer": Kann es sein, dass ich mein Problem auf das in diesem Blog-Post übertragen kann?


    Sprich, mein kndDB_t *feld[MAX] ist die strucutre pointer variable student *ptr im Beispiel und ich müsste erst eine structure variable kndDB_t kndFeld[MAX] erstellen? Macht das Sinn?

    Block-Post: https://dyclassroom.com/c/c-pointers-and-array-of-structures


    Ich weiß nicht... wieso ist C bloß so viel komplizierter als Java :S

    Einmal editiert, zuletzt von DerCooper ()

  • Ahhh, mein Fehler, ich habe nicht genau geschaut, wie du das aufrufst.



    Da du in deinem struct nur einen Pointer hast, musst du mit Malloc erstmal Speicher reservieren und kannst dann erst darauf schreiben.


    Und du darfst kein [] im Parameter haben.


    So sollte es gehen :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • So sollte es gehen :)

    Suuuper, vielen vielen Dank! Konnte es gestern nicht mehr probieren, aber im Bett es sah schon vielversprechend aus. ^^ Nach entsprechender Änderung im Code hat es auch schon geklappt.


    Die zwei Warnungen mit dem "passing argument" sind aber immer noch da, kann man da spontan sagen wieso das Auftritt? - Gibt's bei der Übergabe von Pointern eine spezielle Notation?

    C
    1. case 1 : eingeben(n++, feld); break;
    2. case 2 : ausgeben(n, feld); break;


    Ansonsten habe ich bei der for-Schleife den << good old c style >> für die Nostalgiker übernommen und die Abbruchbedingung geändert. Da kam es beim Ausgeben in manchen fällen zum Crash. [Für die, die es interessiert: siehe Spoiler für mehr]



    Ich bedanke mich herzlich für die Wegweisung zur Lösung! :) Das hat mir gestern einen ganz schönen Kummer über mehrere Stunden gebracht, da ich gar keinen Ansatz für die Fehlersuche hatte. C bereitet mir mit den Pointern noch ein wenig Probleme :D


    VG und fehlerfreies Coden!

    ~ Cooper

  • Die zwei Warnungen mit dem "passing argument" sind aber immer noch da, kann man da spontan sagen wieso das Auftritt?

    Das liegt an folgender Zeile:


    kunDB_t *feld[MAX];


    Mach es einfach so:


    kunDB_t feld[MAX];

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S