übung listen



  • Berufspenner schrieb:

    Und

    aktuell= (struct daten*) malloc(sizeof(struct daten));
    

    statt

    aktuell= malloc(sizeof(struct daten));
    

    da malloc dir sonst nur void-Pointer bastelt.

    du kannst aber den rückgabewert von malloc (void*) einem anderen pointer ohne cast zuweisen. das ist kein problem.
    🙂



  • fricky schrieb:

    Berufspenner schrieb:

    Und

    aktuell= (struct daten*) malloc(sizeof(struct daten));
    

    statt

    aktuell= malloc(sizeof(struct daten));
    

    da malloc dir sonst nur void-Pointer bastelt.

    du kannst aber den rückgabewert von malloc (void*) einem anderen pointer ohne cast zuweisen. das ist kein problem.
    🙂

    Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?



  • Berufspenner schrieb:

    Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?

    ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
    🙂



  • fricky schrieb:

    Berufspenner schrieb:

    Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?

    ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
    🙂

    Wieso "weglassen sollte" (persönliche Neugierde 😉 )? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet 😉



  • Berufspenner schrieb:

    fricky schrieb:

    Berufspenner schrieb:

    Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?

    ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
    🙂

    Wieso "weglassen sollte" (persönliche Neugierde 😉 )? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet 😉

    was ein c++, ada, java, c# oder sonstwas-compiler zu dem code sagt, ist doch völlig bedeutungslos. zum casten von malloc: http://c-faq.com/malloc/mallocnocast.html
    🙂



  • fricky schrieb:

    Berufspenner schrieb:

    fricky schrieb:

    Berufspenner schrieb:

    Solange der Code auch wirklich mit einem C-Compiler und nicht mit einem C++-Compiler übersetzt wird. Oder was meinst du damit genau?

    ich meine damit, dass er den cast weglassen kann, ja sogar besser weglassen sollte.
    🙂

    Wieso "weglassen sollte" (persönliche Neugierde 😉 )? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet 😉

    was ein c++, ada, java, c# oder sonstwas-compiler zu dem code sagt, ist doch völlig bedeutungslos. zum casten von malloc: http://c-faq.com/malloc/mallocnocast.html
    🙂

    Danke, endlich mal eine sinnvolle und verständliche Erklärung 🙂





  • Berufspenner schrieb:

    Wieso "weglassen sollte" (persönliche Neugierde 😉 )? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn er das ganze nicht castet 😉

    Wieso "weglassen sollte" (persönliche Neugierde 😉 )? Und ein C++-Compiler haut ihm wie gesagt eins um die Ohre, wenn SIE das ganze nicht castet 😉 😉



  • Hallo stoeoe,

    so wie ich deine Aufgabe verstehe, möchtest du eine Liste programmieren,
    die ein Objekt bestehend aus einem Namen (höchstens 9 Zeichen) und einem
    Alter verwaltet.

    Hierfür würde ich dann vielleicht einen solchen Struct definieren:

    struct Person {
        char *name;
        int   alter;
    };
    

    Und als Liste dann:

    struct Liste {
        struct Person *person;
        struct Liste  *next;
    };
    

    Um die Liste ein wenig allgemeiner zu definieren, kannst du auch soetwas
    machen:

    struct Liste {
        void *obj;
        struct Liste *next;
    };
    

    Dazu kann man dann Funktionen schreiben, die ein Element in die Liste einfügt,
    ein Element löscht, oder vielleicht ein Element ausgibt:

    struct Person *new_person(char *name, int alter);
    
    struct Liste *add_person(struct Liste *l, struct Person *p);
    ...
    

    Zum Einlesen des Namen würde ich die Funktion fgets() verwenden.
    Ihr übergibst ein Array, die Größe des Arrays und woher eingegeben wird.
    Bsp:

    char name[100];
       fgets(name, 100, stdin);
    

    fgets speichert das '\n' mit im Array. Das solltest du dann vielleicht noch
    entfernen, bevor du damit weiterarbeitest.

    Gruß mcr

    PS: deine weiteren Fehler werde ich nachher noch ansprechen.



  • Ok, dann nun zu ein paar Fehlern, die mir aufgefallen sind.

    In Zeile 43:

    } while (alter[i-1]=32);
    

    Wird die while-schleife nie abgebrochen, da du hier eine
    Zuweisung stehen hast, und eine Zuweisung immer true zurückliefert.

    Richtiger wäre:

    } while (alter[i-1]==32);
    

    Hier gibt es ein weiteres Problem:
    scanf liefert dir das Zeichen 32 (' ') nicht zurück:
    Auszug aus den Man-Pages:

    ...
     [b]Leerräume[/b] (wie [b]Leerzeichen[/b], Tabulatoren oder Zeilenumbrüche)  im  String 
     format  passen  zu  einem Freiraum  jeder  Größe,  eingeschlossen keinem 
     Freiraum, der Eingabe.
     ...
    
           s      Findet  eine  Folge von Zeichen, die [b]keinen Leerraum[/b] darstellen;
                  der nächste Zeiger muss Zeiger auf char sein, und das Feld  muss
                  groß  genug  sein um die Folge und das abschließende NUL Zeichen
                  aufzunehmen.  Der Eingabestring [b]stoppt an Leerräumen[/b] oder an der
                  maximalen Feldgrößen, je nachdem, was zuerst auftritt.
    

    Somit ist die gewollte Abbruchbedingung nicht erfüllt.

    Ein ähnliches Problem findet sich in Zeile 55. Hier weist zu dem Pointer
    die NULL zu, anstelle der Abfrage auf NULL.

    Eine mögliche Verbesserung habe ich ja schon in meinem vorangegangem Post
    beschrieben.

    Gruß mcr

    PS: ich habe nicht nach weiteren Fehlern geschaut.


Anmelden zum Antworten