ISO C++ forbids comparison between pointer and integer|



  • Du hast jetzt 10 verkettete Listen. Warum?

    Der erste Eintrag jeder Liste enthält keine gültigen Daten.
    Das liegt an dem malloc in main.
    Was passiert wenn der Datenmüll darin gerade eine gültige Nummer ist?

    Was passiert in print_student wenn die Nummer nicht existiert?

    Und du gibst diese schöne Meldung aus, wenn du keinen Speicher bekommst: "ACHTUNG KEIN SPEICHER ÜBER"
    Danach benutzt du diesen Speicher aber trotzdem 😮



  • Wenn der Eintrag in list NULL ist, dann brauchst du nicht suchen und das ->next = New musst du auch anders lösen, da es bei list[] kein next gibt.

    Dazu brauchst du auch kein erstec , denn du musst das nur machen, wenn list[index] == NULL (Bitte vorher initialisieren)



  • DirkB schrieb:

    Du hast jetzt 10 verkettete Listen. Warum?

    Also Aufgabenstellung: Reihungen mit verketteten Listen

    Beispiel: jedem Studenten ist eine fünfstellige Matrikelnummer zugeordnet. Um nun alle denkbaren Matr i-kelnummern abzudecken, müßte man eine Zeigerreihung der Länge 100.000 erzeugen, auch wenn in der Praxis nur ein Bruchteil davon wirklich belegt ist. Eine speichereffizientere Alternative ist die sogenannte Hash-Tabelle. Anstatt für jede irgendwann einmal verwendete Matrikelnummer ein eigenes Reihungselement vorzusehen, wird eine deutlich kleinere Reihung
    verwendet (mit z.B. nur 10 Elementen). Um zu einer gegebenen Matrikelnummer matnr den Index des Reihungselementes zu finden, unter dem die gesuchte Information gespeichert ist, wird eine sogenannte Hash-Funktion h verwendet, z.B.10 % ) ( matnr matnr  hDiese Hash-Funktion liefert zu jeder Matrikelnummer einen Index, unter dem sich die gesuchte Information
    finden lässt. Nun kann es allerdings passieren, dass zwei verschiedene Matrikelnummern auf den gleichen Index abge-bildet werden – es kommt zu einer sogenannten Kollision. Eine Möglichkeit, diese Kollisionen zu beha n-deln, besteht darin, als Element der Zeigerreihung nicht eine einzelne Information, sondern eine Liste von Informationen zu speichern.

    Matrikelnr. Name Hash-Index
    11296 Meier 6
    15407 Müller 7
    17864 Schulze 4
    17985 Lehmann 5
    18126 Kohl 6
    18374 Schneider 4
    18621 Bauer 1
    18737 Strauss 7
    18786 Hoffmann 6

    Definieren Sie Strukturen für
    - einen Studenten (struct student mit Matrikelnummer und Name), die eine Verkettung zulässt
    - eine Reihung mit 10 Zeigern auf verkettete Listen vom Typ struct student
    b. Schreiben Sie eine Prozedur insert_student, die einen neuen Studenten erzeugt und in die Rei-hung einfügt. Parameter der Prozedur sind die Matrikelnummer und der Name des einzufügenden Stu-denten.
    c. Schreiben Sie eine Prozedur print_student, die für eine gegebene Matrikelnummer den Namen
    des Studenten ausgibt.
    d. Schreiben Sie eine main-Funktion, in der Sie so lange Matrikelnummer und Name von Studenten ein-geben und in die Hash-Tabelle einfügen, bis eine 0 als Matrikelnummer eingegeben wird. Lassen Sie
    anschließend Matrikelnummern eingeben, und geben Sie jeweils den zugehörigen Namen aus. Das Pr o-gramm endet, wenn eine 0 als Matrikelnummer eingegeben wird.

    DirkB schrieb:

    Der erste Eintrag jeder Liste enthält keine gültigen Daten.
    Das liegt an dem malloc in main.
    Was passiert wenn der Datenmüll darin gerade eine gültige Nummer ist?

    Das ist ja genau mein Problem 😉

    DirkB schrieb:

    Was passiert in print_student wenn die Nummer nicht existiert?

    Die existiert weil ich diese ja anlege und die Funktion sonst nicht genutzt wird.

    DirkB schrieb:

    Und du gibst diese schöne Meldung aus, wenn du keinen Speicher bekommst: "ACHTUNG KEIN SPEICHER ÜBER"
    Danach benutzt du diesen Speicher aber trotzdem 😮

    exit mag mein Compilier irgendwie nicht...



  • DirkB schrieb:

    Wenn der Eintrag in list NULL ist, dann brauchst du nicht suchen und das ->next = New musst du auch anders lösen, da es bei list[] kein next gibt.

    Dazu brauchst du auch kein erstec , denn du musst das nur machen, wenn list[index] == NULL (Bitte vorher initialisieren)

    Ne der Eintrag ist ja nie NULL weil ich ja schon überall ein Struct -> damit Adresse in der main anlege.


    Zeiger <- Adresse des ersten Listenelements(welches ja next beinhaltet)

    Wieso geht das nicht?



  • LukeStriker schrieb:

    Das ist ja genau mein Problem 😉

    Lösung habe ich vorgeschlagen. Dazu brauchst du in insert ein paar Vergleich mehr.
    Aber das hast du immer beim ersten Element einer Liste.

    LukeStriker schrieb:

    Die existiert weil ich diese ja anlege und die Funktion sonst nicht genutzt wird.

    Es ist eine Fehlerquelle.

    LukeStriker schrieb:

    exit mag mein Compilier irgendwie nicht...

    Ob das Programm nun ein exit macht oder abstürzt, ist dem User egal. Die Daten sind weg.
    Zumindest die Zugriffe kannst du in einen else-Zweig packen und der Funktion einen Rückgabewert spendieren, damit die Ruferfunktion auch etwas davon mitbekommt und darauf reagieren kann.
    Denn die Meldung "Geht nicht" hat in der Funktion nichts zu suchen.
    Die soll keine Interaktion mit dem User machen.

    LukeStriker schrieb:

    Ne der Eintrag ist ja nie NULL weil ich ja schon überall ein Struct -> damit Adresse in der main anlege.

    Dann lass das malloc in main weg und schreib stattdessen ein NULL dahin.



  • DirkB schrieb:

    LukeStriker schrieb:

    Das ist ja genau mein Problem 😉

    Lösung habe ich vorgeschlagen. Dazu brauchst du in insert ein paar Vergleich mehr.
    Aber das hast du immer beim ersten Element einer Liste.

    LukeStriker schrieb:

    Die existiert weil ich diese ja anlege und die Funktion sonst nicht genutzt wird.

    Es ist eine Fehlerquelle.

    LukeStriker schrieb:

    exit mag mein Compilier irgendwie nicht...

    Ob das Programm nun ein exit macht oder abstürzt, ist dem User egal. Die Daten sind weg.
    Zumindest die Zugriffe kannst du in einen else-Zweig packen und der Funktion einen Rückgabewert spendieren, damit die Ruferfunktion auch etwas davon mitbekommt und darauf reagieren kann.
    Denn die Meldung "Geht nicht" hat in der Funktion nichts zu suchen.
    Die soll keine Interaktion mit dem User machen.

    LukeStriker schrieb:

    Ne der Eintrag ist ja nie NULL weil ich ja schon überall ein Struct -> damit Adresse in der main anlege.

    Dann lass das malloc in main weg und schreib stattdessen ein NULL dahin.

    Habs vorhin nicht kapiert gehabt das du den Zeiger des Listenelements NULL setzten willst..Dachte next der liste.. Funktioniert! Danke!

    void insert_student(int M_No, char *Na){ // ohne 20
        struct student *New;
    
        int index = (M_No%10);
        struct student *Zeiger;
        Zeiger = list[index];
    
        if(Zeiger!=NULL) {
            while(Zeiger->next != NULL){
                Zeiger = Zeiger->next;
    
            }
        }
    
        New = (struct student*)malloc(sizeof(struct student));
    
        if(New == NULL){
            exit(1);
        }
        New->MartNo = M_No;
        strcpy(New->Name,Na);
        New->next = NULL;
    
        if(Zeiger == NULL){
            Zeiger=New;
    
        }else{
            Zeiger -> next = New;
        }
        list[index] = Zeiger;
    
    }
    

    Da hast du allgemein Recht aber ich kann in der Prüfung nicht alle Fehlerquellen ausschließen, dafür reicht die Zeit nicht. Fokus liegt auf funktionieren der Funktionen..



  • Zeile 30 gehört da nicht hin.



  • DirkB schrieb:

    Zeile 30 gehört da nicht hin.

    Stimmt, muss ich mir was anderes überlegen, sonst geht die print funktion nicht...



  • Ist schon spät 😉
    Die gehört nach Zeile 26
    Bzw gleich mit New

    list[index] = New;
    

    Du musst den Eintrag in list nur machen, wenn es noch keinen gibt.



  • So ich bins mal wieder^^ Wieso funktioniert hier tolower nicht? Ich will nicht mit den ASCII zeichen rumwerkeln...

    #include <stdio.h>
    #include <ctype.h>
    
    void ana(char *t1,char* t2){
        int i=0, j=0,next=0, kill = 0;
    
        while(t1 && kill == 0){
            j=0;
            t1[i] = tolower(t1[i]);
    
            while(t2[j] != '\0' && next == 0){
    
                t2[j] = tolower(t2[j]);
    
                if(t1[i] == t2[j]){
                    next=1;
                }
    
                j++;
            }
            if(next == 0){
                printf("Hier kann es sich nicht um ein Annagramm handeln \n");
                kill = 1;
            }
            else {
                i++;
                next = 0;
            }
        }
    
        if(next == 0&&kill==0){printf("Annagramm");}
    }
    
    main(){
        char *first;
        char *sec;
    
        first = "Hallo";
        sec = "ollah";
    
        ana(first,sec);
    }
    


  • Deine Zeiger (first und sec) zeigen auf Stringliterale.
    Du die darf man nicht verändern.

    Nimm Arrays:

    char first[] = "Hallo";  // So eine Initialisierung geht nur bei der Definition
        char sec[] = "ollah";
    

    oder noch besser, nutze das tolower nur beim Vergleich:

    if(tolower(t1[i]) == tolower(t2[j])){ // nur hier und nirgends anders in der Funktion
    

    Was soll eigentlich die Zeile 7?
    Wann ändert sich in deiner Funktion denn t1?
    Gar nicht. Dann brauchst du den Vergleich auch nicht im while.
    Willst du da wirklich überprüfen ob die Adresse von dem Zeiger ungleich NULL ist?



  • Mal wieder was neues

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_BESTELLUNGEN 100
    #define MAX_BESTELLPOSITIONEN 10
    
    struct Bestellposition {
        char artikelBezeichnung[50];
        float artikelPreis;
        int anzahlArtikel;
        };
    struct Bestellung {
        char kundenname[101];
        struct Bestellposition *positionen[10];
    };
    
    struct Bestellung *bestellungsListe[MAX_BESTELLUNGEN];
    
    int neueBestellPosition(int bi, char *p, float pr, int instanz){
        int i = 0;
    
        struct Bestellung *np;
        np = bestellungsListe[bi];
    
        while(np->positionen[i]!=NULL){
            i++;
        }
        struct Bestellposition *tmp;
        tmp = (struct Bestellposition*)malloc(sizeof(struct Bestellposition));
        strcpy(tmp -> artikelBezeichnung,p);
    
        tmp -> artikelPreis = pr;
        tmp -> anzahlArtikel = 1;
        np -> positionen[i++] = tmp;
        np -> positionen[i] = NULL;
    }
    
    void printBestellungen(){
        int i =0;
        int j=0;
    
        while (i <MAX_BESTELLUNGEN && bestellungsListe[i]->kundenname != "EMPTY") {
            printf("Name: %s",bestellungsListe[i]->kundenname);
            while(bestellungsListe[i]->positionen[j] != NULL){
                printf("ABez: %s",bestellungsListe[i]->positionen[j]->artikelBezeichnung); //hier müsste pointter reichen
                printf("APreis: %s",bestellungsListe[i]->positionen[j]->artikelPreis);
                printf("AAnzahl: %s",bestellungsListe[i]->positionen[j]->anzahlArtikel);
            }
            j=0;
        }
    }
    
    void initBestellListe(){
        int i = 0;
        for (i=0;i<MAX_BESTELLUNGEN;i++){
            bestellungsListe[i] = (struct Bestellung *) malloc(sizeof(struct Bestellung));
            strcpy(bestellungsListe[i]->kundenname,"EMPTY"); //NULL wäre besser
        }
    }
    
    int neueBestellung(char *n){
        struct Bestellung *lp;
        int i=0;
        while (i < MAX_BESTELLUNGEN && bestellungsListe[i]->kundenname != "EMPTY"){
            i++;
            printf("%d. %s\n",i,bestellungsListe[i]->kundenname);
        }
    
        if(i < MAX_BESTELLUNGEN){
            lp = bestellungsListe[i];
            strcpy(lp->kundenname,n);
            lp->positionen[0] = NULL;
            return i;
        } else {
            printf("ERROR max Bestellungen erreicht");
            return -1;
        }
    
    }
    
    int main(void) {
        int bestellungsID;
        initBestellListe();
        bestellungsID = neueBestellung("Müller");
        neueBestellPosition(bestellungsID, "Milch", 0.99, 1);
        neueBestellPosition(bestellungsID, "Butter", 1.50, 2);
        printBestellungen();
        return 0;
    }
    

    Das Problem kenne ich (Vergleich von ganzem String EMPTY), was natürlich schmarn ist aber mir ist nur keine Alternative eingefallen wie ich das sonst machen kann.
    1. Ich muss erst das Array initialisieren
    2. Den Kundennamen OHNE position
    3. die positionen
    -> Ich darf Structs, main nicht verändern
    Gibts nenn NULL Pointer auf ein StringArray? Wollte erst beim Array initialisieren die positionen auf NULL setzen allerdings würde ich dann beim Namen eintragen alles ins erste Feld schreiben weil da die position auch NULL bleibt



  • DirkB schrieb:

    Deine Zeiger (first und sec) zeigen auf Stringliterale.
    Du die darf man nicht verändern.

    Danke, das sollte man sich merken...

    DirkB schrieb:

    Was soll eigentlich die Zeile 7?
    Wann ändert sich in deiner Funktion denn t1?
    Gar nicht. Dann brauchst du den Vergleich auch nicht im while.
    Willst du da wirklich überprüfen ob die Adresse von dem Zeiger ungleich NULL ist?

    Da habe ich wohl ein [i] vergessen 😉
    Am Anfang habe ich das mit 2 Eingaben gemacht daher die \0, aber das zweimalige einlesen mit gets hat trotz getschar!='\0' nicht funktioniert daher hab ich dies dann hardgecodet bevor mir das Zeit frisst 😉

    #include <stdio.h>
    #include <ctype.h>
    
    void ana(char *t1,char* t2){
         int i=0, j=0,next=0, kill = 0;
    
         while(t1[i] && kill == 0){
             j=0;
    
             while(t2[j] != '\0' && next == 0){
    
                 if(tolower(t1[i]) == tolower(t2[j])){
                     next=1;
                 }
    
                 j++;
             }
             if(next == 0){
                 printf("Hier kann es sich nicht um ein Annagramm handeln \n");
                 kill = 1;
             }
             else {
                 i++;
                 next = 0;
             }
         }
    
         if(next == 0&&kill==0){printf("Annagramm");}
    }
    
     main(){
         char first[] = "Hallo";
         char sec[] = "ollah";
    
        ana(first,sec);
    }
    

    so funktioniert er



  • Statt "EMPTY" wäre ein Leerstring "" besser.
    NULL kannst du nicht nehmen, das du die Adresse eines Arrays nicht verändern kannst.

    Strings vergleicht man nicht mit != oder == oder .... Dafür gibt es eine Funktion.



  • Ups 😉 Danke 😉

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_BESTELLUNGEN 100
    #define MAX_BESTELLPOSITIONEN 10
    
    struct Bestellposition {
        char artikelBezeichnung[50];
        float artikelPreis;
        int anzahlArtikel;
        };
    struct Bestellung {
        char kundenname[101];
        struct Bestellposition *positionen[10];
    };
    
    struct Bestellung *bestellungsListe[MAX_BESTELLUNGEN];
    
    int neueBestellPosition(int bi, char *p, float pr, int instanz){
        int i = 0;
    
        struct Bestellung *np;
        np = bestellungsListe[bi];
    
        while(np->positionen[i]!=NULL){
            i++;
        }
        struct Bestellposition *tmp;
        tmp = (struct Bestellposition*)malloc(sizeof(struct Bestellposition));
        strcpy(tmp -> artikelBezeichnung,p);
    
        tmp -> artikelPreis = pr;
        tmp -> anzahlArtikel = instanz;
        np -> positionen[i] = tmp;
        i++;
        np -> positionen[i] = NULL;
    }
    
    void initBestellListe(){
        int i = 0;
        for (i=0;i<MAX_BESTELLUNGEN;i++){
            bestellungsListe[i] = (struct Bestellung *) malloc(sizeof(struct Bestellung));
            strcpy(bestellungsListe[i]->kundenname,""); //NULL wäre besser
        }
    }
    
    int neueBestellung(char *n){
        struct Bestellung *lp;
        int i=0;
        while (i < MAX_BESTELLUNGEN && strcmp(bestellungsListe[i]->kundenname,"")!=0){
            i++;
            printf("%d. %s\n",i,bestellungsListe[i]->kundenname);
        }
    
        if(i < MAX_BESTELLUNGEN){
            lp = bestellungsListe[i];
            strcpy(lp->kundenname,n);
            lp->positionen[0] = NULL;
            return i;
        } else {
            printf("ERROR max Bestellungen erreicht");
            return -1;
        }
    
    }
    
    void printBestellungen(){
        int i =0;
        int j=0;
    
        while (i <MAX_BESTELLUNGEN && strcmp(bestellungsListe[i]->kundenname,"")!=0) {
            printf("Name: %s\n",bestellungsListe[i]->kundenname);
            while(bestellungsListe[i]->positionen[j] != NULL){
    
                printf("Bez: %s\n",bestellungsListe[i]->positionen[j]->artikelBezeichnung); //hier müsste pointter reichen
                printf("Preis: %.2f\n",bestellungsListe[i]->positionen[j]->artikelPreis);
                printf("Anzahl: %d\n",bestellungsListe[i]->positionen[j]->anzahlArtikel);
                j++;
            }
            j=0;
            i++;
        }
    }
    
    int main(void) {
        int bestellungsID;
        initBestellListe();
        bestellungsID = neueBestellung("Mueller");
        neueBestellPosition(bestellungsID, "Milch", 0.99, 1);
        neueBestellPosition(bestellungsID, "Butter", 1.50, 2);
        printBestellungen();
        return 0;
    }
    

    Wann kann ich jetz eigentlich in ein Struct einen String einfach so kopieren
    z.B. Zeile 31 tmp->artikelBezeichnung = p;
    und wann nicht? Mache mittlerweile schon sicherheitshalber immer mit strcpy. Ich dachte das geht immer wenn es nicht als string pointer sondern als array deklariert ist!?



  • Kopieren kannst du einen String nicht "einfach so".
    Die einzige Stelle wo du einen String mit dem = füllen kannst ist die Initialisierung bei der Definition der Variable.

    char text[] = "Hallo"; // Definition mit Initialisierung
    

    Kopieren kannst du mit strcpy (oder gleichwertiges Verefahren). Dafür muss beim Ziel aber entsprechend Platz sein.

    Zeiger kannst du mit dem = zuweisen. Dann wird aber auch nichts kopiert.

    Zu deinem Programm:
    In initBestellListe solltest du das Array positionen mit sinnvollen Werten füllen. Da das ein Array of Pointer ist, bietet sich da NULL an.

    Wegen der ZEiger:
    Kennst du die Verknüpfungen vom Windows-Desktop?
    Was passiert wenn du nur die Verknüpfung kopierst und das Original löscht?



  • #include <stdio.h>
    
    void erstelleBaum(unsigned int);
    //WIE GEHT HIER ein entsprechender Prototyp zu baum2 -> void erstelleBaum2(char matrix[][],unsigned int) <-- funktioniert nicht **matrix auch nicht
    
    void ausgabe (char matrix[][]){ //diese Zeile ist mir vorgegeben, aber wie soll die Übername funktionieren?? kenne nur *matrix[] oder matrix[][spalten]
        int x=0,y=0,yn=1;
    
        for (x=0;x<20;x++){ //alle 20 Zeilen
            while(matrix[x][y] == ' ' || matrix[x][y] == 'x'){
                printf("%c",matrix[x][y]);
            }
        }
    }
    
    void erstelleBaum2(char matrix[20][20],unsigned int n){
        int zeile = n*2;
        if(zeile<=20){ //prüfen ob feste matrix groß genug, da zeilen =spalte max 10+9 =19
            int y=0,l=0,xl=0,xss=0,xs=0,z=0;
            //Zeile doppelt, Anzahl leerzeichen, pro leerzeichen, sterne
            int x = 0; //0 weil Array
    
            while(x<n){
    
                for(y=0;y<2;y++){//Zeile doppelt
                    l = 9-x+1; //Anzahl Leerzeichen, hälfte von 20 Feldern
                    for(xl=0;xl<l;xl++){
                        matrix[z][xl] = ' '; //z ist eigener Zähler da man alles doppelt schreiben muss ist dies mit xl nicht möglich
                    }
                    xl ++;
                    if(x==0){//erste Zeile
                        matrix[z][xl] = '*';
                    } else {
                        xs=x+x+1; //da beim x=1 eigentlich x=2
                        for(xss=0;xss<xs;xss++){
                            matrix[z][xl] = '*';
                            xl++;
                        }
                    }
                    z++;
                }
    
                x++;
            }
        }else{
            printf("n ist zu groß");
        }
    }
    
    void erstelleBaum(unsigned int n){
        int x=1,xl=0,l=0,xss=0,xs=0,y=0;
        while(x<=n){
            for(y=0;y<2;y++){
                l=10-x; //max 10 n kann man sicher besser lösen
                for(xl=0;xl<l;xl++){
                    printf(" ");
                }
    
                if(x==1){
                    printf("*\n");//beim ersten mal einzeln
                }else{
                    xs=x+x-1; //den vorgänger für die anzahl der sterne mitzählen
                    for(xss=0;xss<xs;xss++){
                        printf("*"); //pro Stern
                    }
                    printf("\n");
                }
    
            }
        x++;
        }
    }
    
    main(){
    
    char matrix[20][20];
    erstelleBaum(3);
    erstelleBaum2(matrix,3);
    ausgabe(matrix);
    
    }
    

    Fragen Zeile 4 und 6 kommentiert...



  • Die Variablennamen dürfen auch im Protyp stehen.
    Die Namen müssen nicht die selben wie bei der Definition sein.
    Wenn sie gut gewählt sind, weiß man auch gleich was für eine Variable erwartet wird.

    void erstelleBaum2(char matrix[20][20],unsigned int n);
    


  • DirkB schrieb:

    Die Variablennamen dürfen auch im Protyp stehen.
    Die Namen müssen nicht die selben wie bei der Definition sein.
    Wenn sie gut gewählt sind, weiß man auch gleich was für eine Variable erwartet wird.

    void erstelleBaum2(char matrix[20][20],unsigned int n);
    

    Ah okay danke da war ich mir noch nicht sicher, was die ausgabe betrifft denke ich des ist ein Fehler in der Aufgabenstellung... da kommt ja eig nur matrix[][spalten] in frage...



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct person {
    char *name;
    struct person *next;
    };
    
    void drucke(struct person * a){
        struct person *tmp;
        tmp = a;
        while (tmp != NULL){
            printf("%s ",tmp->name);
            tmp=tmp->next;
        }
    
    }
    
    struct person * invertiere (struct person *a){
        int i=0, j=0;
        struct person *b,*tmp, *tmp2,*ne,*b2;
        tmp = a;
        while(tmp != NULL){
            i++;
            tmp=tmp->next;
        }
        tmp = NULL;
        tmp2=a;
    
        for(j=0;j<i;j++){
            tmp2 = a;
            while(tmp2 != NULL && tmp2 != tmp){
                tmp2 = tmp2->next;
            }
    
            ne =(struct person*) malloc(sizeof(struct person));
            char *nam;
            nam = (char*)malloc(sizeof(char)*10);
            ne->name = nam;
    strcpy(ne->name,tmp2->name);
            ne->next = NULL;
            b2=b;
    
            while(b2 != NULL){
                b2=b2->next;
    
            }
    
            b2->next = ne;
            tmp = tmp2;
        }
        return b;
    }
    
    int main(void) {
    struct person p3 = {"Schulze", NULL};
    struct person p2 = {"Meier", &p3};
    struct person p1 = {"Kohl", &p2};
    struct person *liste = &p1;
    drucke(liste); /* Kohl Meier Schulze */
    drucke(invertiere(liste)); /* Schulze Meier Kohl */
    return 0;
    }
    

    wieso geht in Zeile 38 der strcpy nicht? Sind doch beides mal die adresse? Speicher auch angelegt... hmm


Anmelden zum Antworten