Struct; Ausgabe mit Funktion



  • Hallo,

    Ich habe mein programm verwirklicht.
    Allerdings wird jetzt verlangt: "Schreiben Sie eine Funktion void printPerson(person_t pers) zum Ausgeben eines Objektes vom Typ person_t."

    Und mithilfe dieser soll ich Teil b und c verwirklichen.
    Hier der gesamte code, wie er ohne diese Funktion läuft.

    Die Funktion printPerson(person_t pers)liefert nur wahllose zZeichenketten zurück...

    [code="c"]
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    typedef struct {
    char name[30];
    char vorname[30];
    } person_t;

    typedef struct perslistelement {
    person_t pers_obj;
    struct perslistelement *next;
    } PersListElement;

    //a////////////////////////////Hier steht die Funktion, alelrdings funktioniert sie nicht, sondern gibt nur eine wahllose Zeichenfolge aus... was ich nicht verstehe///////////////////////////
    void printPerson(person_t pers)
    {
    printf("Element: %s\n", pers.vorname);
    printf("Element: %s\n", pers.name);

    }

    //b///////////////////////////////////////////////////////
    void printPersList(PersListElement *p)
    {
    if(p==NULL)
    return;

    printf("%s \n", p->pers_obj.vorname);
    printf("%s \n", p->pers_obj.name);
    p=p->next;
    printf("%s \n", p->pers_obj.vorname);
    printf("%s \n", p->pers_obj.name);

    }
    //c///////////////////////////////////////////////////////
    void printReversePersList(PersListElement *p)
    {

    if(p == NULL)
    return;

    printReversePersList(p->next);

    printf("Element: %s\n", p->pers_obj.vorname);
    printf("Element: %s\n", p->pers_obj.name);
    }

    //d//////////////////////////////////////////////////////

    void deletePersList(PersListElement *p)
    {
    PersListElement *q;
    while(p!=NULL)
    {
    q = p;
    p = p->next;
    free(q);
    }

    printf("Liste wurde geloescht!");
    //test
    printf("%s", p->pers_obj.name);
    }

    PersListElement *insertPerson(PersListElement *first, char name[], char vorname[])
    {

    PersListElement p;
    p = (PersListElement
    )malloc(sizeof(PersListElement));
    strcpy(p->pers_obj.name, name);
    strcpy(p->pers_obj.vorname, vorname);
    p->next = first;
    first = p;
    return first;

    }

    int main(void){

    PersListElement *p = NULL;

    printf("Testprogramm : Uebung 8 / Aufgabe 1");

    printf(" Schritt 1: Aufbau der Liste \n\n" );

    p = insertPerson(p, "Mustermann", "Manfred");

    p = insertPerson(p, "Musterfrau", "Melanie");

    printf("\nSchritt 2: Ausgabe der Liste\n\n");

    printPersList(p);

    printf("\n\nSchritt 3: Ausgabe in umgekeh. Reihenfolge\n\n");

    printReversePersList(p);

    printf("\n\nSchritt 4: Loeschen der Liste\n");

    deletePersList(p);

    return 0;
    }
    [/]



  • sorry für die schlechte Formatierung.. da habe ich wohl das [/code] vergessen.



  • Igl schrieb:

    Die Funktion printPerson(person_t pers)liefert nur wahllose zZeichenketten zurück...

    Die Funktion wird in deinem Code gar nicht benutzt.



  • Das weiß ich auch, deshalb Frage ich ja, was an der Funktion an sich falsch ist, da mir nur sinnlose Werte ausgegeben werden.



  • An der Funktion ist nichts falsch.

    Möglicherweise rufst du sie falsch auf.
    Aber gerade das hast du ja nicht gezeigt.

    Einen falschen Aufruf gibt der Compiler als Warnung aus. (Wenn die Warnung dafür aktiv ist)



  • Also aufrufen würde ich sie folgendermaßen:

    Bsp.:

    {
    
    person_t temp;
    
    printPerson(temp);
    
    }
    

    Aber wahrscheinlich ist das falsch?

    ich weiß einfach nicht, welchen Wert ich der Funktion mitgeben soll..



  • Igl schrieb:

    Also aufrufen würde ich sie folgendermaßen:

    Bsp.:

    {
    
    person_t temp;
    
    printPerson(temp);
        
    }
    

    Welchen Namen/Vornamen hat denn diese Person?



  • Ich stelle meine Frage mal explizit:

    Welchen Wert muss ich der Funktion denn mitgeben, damit sie so funktioniert wie ich das gerne hätte?

    Wenn mir das jemand sagen könnte, wäre ich sehr froh.



  • Zwischen der Definition der Variablen temp und dem Aufruf von printPerson passiert nichts.
    Was soll die Funktion also ausgeben?

    Meinst du, der Compiler schreibt automatisch bei Vornamen "Max" und bei Name "Mustermann" rein?



  • Natürlich glaube ich das nicht.
    Die Funktion gibt die Werte aus, die in dem struct stehen.
    Daher brauch sie natürlich auch eine Variable, durch die sie darauf zugreifen kann.
    Aber ich weiß halt leider nicht welche das sein soll...
    Deshalb frage ich ja. 😕



  • In uninitialisierten Variablen steht nur Müll. Bei der Ausgabe wirst du also nur Müll sehen (es sei denn das Programm stürzt bei der Ausgabe schon ab).



  • temp ist die Variable vom Typ person_t
    Das ist eine struct mit zwei Member vorname und name.

    Entweder du kopierst die mit strcpy rein. (so ähnlich wie in insertPerson)

    Oder du machst gleich eine Initialisierung. (Eine Wertezuweisung bei der Definition)

    Dein Problem sind die (fehlenden) Grundlagen der Programmierung (allgemein, nicht speziell C)



  • Hmm, okay.

    Also muss ich temp vorher einen passenden Wert zuordnen, indem ich z.B. mithilfe von strcpy() einfach den jeweiligen Namen zuordne.



  • In Ordnung, ich habe es jetzt folgendermaßen gemacht:

    person_t q,s;
    
        strcpy(q.vorname, "Manfred");
        strcpy(q.name, "Mustermann");
        strcpy(s.vorname, "Melanie");
        strcpy(s.name, "Musterfrau");
    
        printPerson(q);
        printPerson(s);
    

    Die namen werden mir auch ausgegeben.
    Alles schön und gut.

    Jetzt frage mich mich jedoch, wie ich mit

    void printPersList(PersListElement *p)
    

    darauf zugreifen soll?

    Bzw. mit:

    void printReversePersList(PersListElement *p)
    

    Außer natürlich oben angegebenes einfach rein zu schreiben..



  • typedef struct {
      char name[30];
      char vorname[30];
    } person_t;
    
    typedef struct perslistelement {
      person_t pers_obj;
      struct perslistelement *next;
    } PersListElement;
    

    PersListElement ist ein Typ für eine struct . Dieser Typ enthält als Member mit dem Namen pers_obj die struct person_t.

    Wenn du eine Variable q vom Typ PersListElement Element hast, dann kannst du darauf mit q.pers_obj zugreifen.

    Bei dir ist p aber ein Zeiger auf die struct. Darum https://www.c-plusplus.net/forum/p2457066#2457066
    (name willst du hier aber nicht haben, das soll ja printPerson machen)



  • Ja, okay.
    Das habe ich ja gewusst. ^^
    Nur klärt das meine Frage nicht, wie ich denn damit auf die Funktion PrintPerson zugreifen soll?
    Das ist das einzige, das ich hier nicht verstehe...



  • Igl schrieb:

    Nur klärt das meine Frage nicht, wie ich denn damit auf die Funktion PrintPerson zugreifen soll?

    Doch, das tut es.

    Igl schrieb:

    Das ist das einzige, das ich hier nicht verstehe...

    Das ist maßlos untertrieben.

    Das passt nicht zu

    Igl schrieb:

    Ja, okay.
    Das habe ich ja gewusst. ^^

    Und aus dem anderen Thread:

    Igl schrieb:

    Achso. 😃

    Ja gut, da hat es gerade "klick" gemacht.

    Du musst von der struct perslistelement, auf die p zeigt, den Member pers_obj an PrintPerson übergeben.

    Jetzt nimm dein Wissen und dein Klick und mach Klack daraus.


Log in to reply