ISO C++ forbids comparison between pointer and integer|



  • DirkB schrieb:

    Arrays zerfallen bei der Übergabe an Funktionen in einen Pointer auf ihre Anfangsadresse.
    Das sizeof innerhalb der Funktion bezieht sich dann auf die Größe vom Zeiger und nicht auf das Array (Zeile 5).

    Bekannt, aber durch die ganzen Zeiger etc bin ich durcheinander gekommen. Habe das geändert in

    while(satz[sizesatz]){
            sizesatz++;
        }
    
        if (sizesatz>(ze*s)){
            printf("Matrix zu klein");
    

    Geht das noch einfacher?
    Am Ende einer Matrixzeile gibt es kein '\0' soweit ich weiß oder? Daher kein +/-1.

    DirkB schrieb:

    char *satz[100] ist eine Array von 100 Zeigern auf char. Das geht als char **satz durch (Doppelzeiger).
    text ist ein char-Array. Das geht als char* durch (Einfachzeiger).

    Wieder falsch geschaltet, ich hatte irgendwie gedacht ich kann damit die größe des Feldes beschränken was ziemlich humbug ist da dies ja schon in der main() passiert.

    also 100 Zeiger auf jeweils ein char Feld??
    Wenn ich in der main nur einen String deklariere z.B. char feld[100]; und übergebe die erste Adreses des feldes mit funktion(feld) oder funktion(&feld[0]). Was initialisiere ich dann mit funktion(char *feld[100])?

    DirkB schrieb:

    m ist ein echtes 2D-Array und das geht auch als char* durch.

    Du darfst ein char *feld[] nicht mit einem char feld[][] verwechseln.

    Was heißt echt? In der Main als Feld und nicht als Zeiger bzw. dynamisch mit malloc generiert?

    Meine Interpretation war so:
    char *feld[] -> call by reference daher ich verändere das ursprüngliche Array der main was ja später wieder in der funktion ausgabe verwendet wird
    char feld[][] -> call by value daher wäre es nach Funktionsabschluss weggewesen.

    Für was steht jetzt was? Ich tu mich da echt schwer durchzublicken bei Array/String Array.

    -> Ich übergebe also nur die Adresse des 2D Feldes und als Initialisierung char m[][] und arbeite im Endeffekt mit dem ursprünglichen Array aus der Main.
    Und das hier: *feld[] hat gar nichts mit mehrdimensionalen Arrays zu tun sondern wird eher verwendet wenn man Pointer auf irgendwas setzen möchte.

    DirkB schrieb:

    Das rumgerate mit den * nützt dir nichts. Du musst schon wissen was du tust.
    GRUNDLAGEN

    Du tust ja so als ob ich das mit Absicht mache^^ Ich kannte bisher nur Perl und da funktioniert das alles automatisch, da muss man für ein dynamisches Feld nicht ewig lang Sachen mit malloc rumschnitzeln oder großartig differenzieren bei Funktionsübergaben. Bin für ein gutes Tutorium immer offen, versuch mir das schon irgendwie mit Büchern etc reinzuwürgen aber bisher ist das mehr Rätzel raten^^
    Daher versuche ich learning by doing durch Aufgaben was eig m.M.n. bei Programmiersprachen am besten klappt- viel Zeit raubt und manchmal zum verzweifeln ist^^ Und zu meiner Verteidigung, ich habe alles aufs Blatt programmiert und dann abgetippt. Die normalen "Zwischen-checks" wie beim normalen Programmieren um Flüchtigkeitsfehler zu beheben sind also weggefallen...

    DirkB schrieb:

    void hebrae (char m[][10], char *satz, int ze, int s){
    

    passt zu dem Aufruf von hebrae in main.

    LukeStriker schrieb:

    int x=0,y=0,z=0;
    ... 
          while(x<z &&(satz[z] != '\0')){
    

    Das while wird gar nicht erst durchlaufen, da schon das x<z fehlschlägt.

    Was soll das eigentlich machen?

    while(x<ze &&(satz[z] != '\0')){
    

    -> ze statt z ist richtig; habs übersehen zu ändern da ich ausversehen z zu einer Laufvariable gemacht hatte und z als Parameter initialisiert hatte. Dann hab ich den Parameter von z auf ze geändert...

    Also:
    a) Erstellen Sie für diese sog. hebräische Verschlüsselungsmethode eine Prozedur hebrae, der eine Matrix mit einer maximalen Zeilen- und Spaltenlänge von 10, die zu verschlüsselnde Nachricht (Satz mit max. 100 Zeichen) sowie eine Zeilen- und Spaltenzahl für die Eintragung des zu verschlüsselndes Satzes übergeben wird. Prüfen Sie vorab, ob die Matrix genügend Platz für die Verschlüsselung der Nachricht bietet und geben Sie ggf. eine entsprechende Fehlermeldung aus. Ist der zu verschlüsselnde Satz kürzer als der vorhandene Speicherplatz der Matrix, sind nicht ausgefüllte Matrixelemente mit Leerzeichen aufzufüllen.
    b) Schreiben Sie eine Prozedur ausgabe, die die verschlüsselte Nachricht spaltenweise am Bildschirm ausgibt.

    UPDATE: Sehe gerade was ich da eig für'n Mist gemacht habe. Hatte das zurücksetzten der Zeilen/Spalten verplant. Jetzt funktioniert das schonmal einwandfrei.

    #include <stdio.h>
    
    void hebrae (char m[][10], char *satz,int ze, int s){
    
        int x=0,y=0,z=0,sizesatz = 0;
    
        while(satz[sizesatz]){
            sizesatz++;
        }
    
        if (sizesatz>(ze*s)){
            printf("Matrix zu klein");
        } else {
            while(x<ze){
                y=0;
                while(y < s){
                    if (satz[z] != '\0'){
                        printf("x: %d y:%d Buchstabe: %c\n",x,y,satz[z]);
                        m[x][y] = satz[z++];
                    } else {
                        m[x][y]= ' ';
                    }
                    y++;
                }
                x++;
            }
        }
    
    }
    
    void ausgabe(char m[][10],int z, int s){
        int x=0, y=0;
        while(y<s){
            x=0;
            while(x<z){
                printf("%c",m[x][y]);
    
                x++;
            }
            y++;
        }
    }
    
    main(){
    
        char text[100];
        char m[10][10];
        gets(text);
    
        hebrae(m,text,2,2);
        ausgabe(m,2,2);
    }
    


  • LukeStriker schrieb:

    Was heißt echt? In der Main als Feld und nicht als Zeiger bzw. dynamisch mit malloc generiert?

    Ein Array ist kein Zeiger, ein Zeiger ist kein Array.
    Ein Array ist nicht "dynamisch", das gilt auch für mehrdimensionale Arrays.
    Manche begreifen das nie.

    LukeStriker schrieb:

    Meine Interpretation war so:
    char *feld[] -> call by reference daher ich verändere das ursprüngliche Array der main was ja später wieder in der funktion ausgabe verwendet wird
    char feld[][] -> call by value daher wäre es nach Funktionsabschluss weggewesen.

    Nix mit call by reference. In C gibt es kein call by reference, ausschließlich call by value. Manche begreifen das nie.

    LukeStriker schrieb:

    Für was steht jetzt was? Ich tu mich da echt schwer durchzublicken bei Array/String Array.

    Ja das merkt man. Das Verständnis hierfür ist für C aber essentiell. Manche begreifen das nie.
    Und deswegen ist dein "learning by doing" für C eine schlechte Wahl, es gibt hier wenig, was "automatisch" passiert.



  • Wutz schrieb:

    Ein Array ist kein Zeiger, ein Zeiger ist kein Array.
    Ein Array ist nicht "dynamisch", das gilt auch für mehrdimensionale Arrays.
    Manche begreifen das nie.

    Das manche das nie begreifen liegt evtl. an solchen ausführlichen Hilfen wie deiner^^

    Okay Array - kann dynamisch angelegt werden ist aber nicht dynamisch. okay falsch ausgedrückt.

    Wutz schrieb:

    Nix mit call by reference. In C gibt es kein call by reference, ausschließlich call by value. Manche begreifen das nie.

    Wenn ich eine Adresse übergebe und in einer Funktion diese als Zeiger einlese ist das call by reference. Hört sich logisch an, steht überall so. CbV? Wie ist das gemeint? Kläre mich bitte etwas ausführlicher auf bzw. poste nenn Link die deine Aussage bestätigt.

    Wutz schrieb:

    Ja das merkt man. Das Verständnis hierfür ist für C aber essentiell. Manche begreifen das nie. Und deswegen ist dein "learning by doing" für C eine schlechte Wahl, es gibt hier wenig, was "automatisch" passiert.

    Registriert, allerdings bleibt einem selbst erarbeites Wissen erhalten im Gegensatz zum "auswendig" gelernten. Ist ja nicht so als ob ich alles via Try und Error versuche...



  • Ein Array kann nach der Definition nicht mehr in der Größe geöndert werden.
    Ein Array ist ein Speicherbereich mit einem Namen.
    Ein Array erzeugst du durch die [] bei der Variablendefinition

    Bei dynamischen Speicher hast du kein Array sondern einen Zeiger, der auf einen Speicherbereich zeigt. Den Zeiger kannst du auch auf anderen Speicher zeigen lassen. - Kein Array -

    Bei C werden nur Werte (Value) an Funktionen übergeben. Wenn du von Call by Reference sprichst übergibst du als Wert die Adresse/Zeiger der Variablen.
    Du als Programmierer machst das aktiv z.B. durch den Adressoperator.
    Also ist es ein Call by Value mit dem Pointer als Wert.
    Komplette Arrays kannst du in C nicht direkt als Wert übergeben.
    Darum geht man über den Zeiger.

    Ein String ist in C eine Vereinbarung alle Zeichen bis zum '\0' als Text zu nehmen.

    Wenn du einen Zeiger auf ein char hast, können damit auch noch die nachfolgenden Zeichen gemeint sein.

    Ach und wegen Perl. Man sollte nie einfach so von einer Programmiersprache auf eine andere schließen.
    In der Hinsicht kannst du C mehr als Universal-Assembler ansehen.



  • Arrays klappen mittlerweile, Listen eig auch ganz ok - es hackt allerdings noch an Zeigerarrays auf Structs

    Wieso kann ich in Zeile 12 den Zeiger auf das Struct nicht zurückgeben? Der Fehler mit dem Anitdown zieht sich dann durch bei Zeile 41+43
    "return new_o;"

    #include <stdlib.h>
    
    struct elementarteilchen {
        double ladung, spin;
    };
    
    struct elementarteilchen anti(struct elementarteilchen alt){
        struct elementarteilchen *new_o; //struct Pointer
        new_o = (struct elementarteilchen*)malloc(sizeof(struct elementarteilchen)); //Speicher reservieren für Adresse von Pointer
        new_o -> ladung = (alt.ladung)*(-1);
        new_o -> spin = alt.spin;
        return new_o; //Pointer(und somit Adresse) zurückgeben
    }
    
    int ist_boson (struct elementarteilchen *test){
        int x=0,r=0;
        float summe=0,rest=0;
        while(test != NULL){
            summe=summe+test->spin;
            test++;
        }
    
        while (summe > 1){ //eigene Modulo Funktion für float
            summe = summe -1;
        }
    
        if(summe < 1 && summe > 0){
            r=1;
        }
        return r;
    }
    
    int main(){
    struct elementarteilchen elektron = {- 1.0, 0.5};
    struct elementarteilchen up = {+ 2.0 / 3.0, 0.5};
    struct elementarteilchen down = {- 1.0 / 3.0, 0.5};
    struct elementarteilchen photon = {0.0, 1.0};
    
    struct elementarteilchen strange = {-1.0 /3.0,0}; //a
    struct elementarteilchen *antidown;
    antidown = anti(down); //Zeiger auf das AntidownTeilchen zurück
    struct elementarteilchen *proton[] = {&down, &up, &up, NULL};
    struct elemenatrteilchen *pion[]={&up,antidown,NULL};
    }
    

    Hoffe ich nerve nicht zu arg^^

    P.S.: Klappt meine Idee in zeile 23 klappen? Ich muss schauen ob die Zahl eine nachkommastelle besitzt und modulo für float geht ja nicht. Andere Funktionen/Libarys darf ich nicht verwenden.



  • Deine Funktion ist so definiert, das sie eine struct zurückgibt. Keinen Pointer.
    (Da fehlet ein * in der Definition).

    Schon mal daran gedacht, den Vorkommateil in einem int zu speichern?
    Für den Nachkommateil musst du dann den int abziehen.



  • Mal wieder ne Frage die vermutlich standart ist

    int main(){
        int Martikel;
        char Name[20];
        while(Martikel != 0){
            printf("Name: ");
            gets(Name);
            printf("Martikelnummer:\n");
            scanf("%d",&Martikel);
            if(Martikel!=0){
                insert_student(Martikel,Name);
                print_student(Martikel);
            }
        }
    }
    

    Bei gets ist wohl des Problem (Buffer-Overflow, whatever)... Wie kann ich dieses Problem lösen?
    Ich dachte:
    gets hört bei \n auf und ersetzt \n durch \0
    fgets nimmt \n auf und setzt dahinter \0
    Wieso funktioniert dann gets nicht?

    do {
    scanf("%d",&Martikel);
    } while(getchar()!= '\n');
    Funktioniert auch nicht..
    Ach ja und ich muss gets verwenden und ja ich weiß das fgets "besser" ist 😉

    EDIT: Problem scheint eher bei der übergabe/übernahme zu stecken...



  • LukeStriker schrieb:

    Wieso funktioniert dann gets nicht?

    Was funktioniert bei gets nicht?
    Wenn der Name länger als 19 Zeichen ist, gibt es Probleme.

    Und bei Martikel dachte ich gleich an das große G: "Meinten Sie: matrikel"

    Und eigentlich ist das auch kein int.



  • Du kannst ja mal den Rückgabewert von scanf auswerten: http://www.cplusplus.com/reference/cstdio/scanf/

    int n;
    ...
    n = scanf("%d",&Martikel);  
    ...
    if ( n != 1) ....
    

    Oder gib dei Variable nochmal mit printf.

    Am Besten: du nimmst den Debugger.



  • Sry! Hatte nichts mit dem scanf zu tun... Glaube es ist Zeit für ne Pause, hatte den *list pointer keinen Speicherplatz gegeben weil ich eig nur die Funktionen schreiben muss und ich es vergessen hatte. Stürzt zwar immer noch ab aber ist kompilierbar:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct student{
        int MartNo;
        char Name[20];
        struct student *next;
    };
    
    struct student *list[10];
    
    void insert_student(int M_No, char *Na){ // ohne 20
        struct student *New;
    
        int index = (M_No%10);
        struct student *Zeiger;
    
        Zeiger = list[index];
        while(Zeiger->next != NULL){
            Zeiger = Zeiger->next;
        }
        New = (struct student*)malloc(sizeof(struct student));
        if(New == NULL){
            printf("ACHTUNG KEIN SPEICHER ÜBER\n");
        }
        New->MartNo = M_No;
        strcpy(New->Name,Na);
        New->next = NULL;
        Zeiger -> next = New;
    }
    
    void print_student(int M_No){
        int index = (M_No%10);
        struct student *Zeiger = list[index];
        while(Zeiger -> MartNo != M_No){
            Zeiger = Zeiger->next;
        }
        printf("%s",Zeiger->Name);
    }
    
    int main(){
        int Martikel;
        char Name[20];
    
        int i=0;
        while(i<10){
            list[i] = (struct student*)malloc(sizeof(struct student));
    list[i]->next = NULL; //EDIT: Und schon gehts!!
            i++;
        }
    
        while(Martikel != 0){
    
            printf("Name: ");
            gets(Name); //WENN Name nicht pointer auch scanf("%s",Name); möglich
            printf("Martikelnummer:\n");
            do {                               /
                 scanf("%d",&Martikel);
            } while(getchar()!= '\n');
    
            if(Martikel != 0){
                insert_student(Martikel,Name);
                print_student(Martikel);
            }
        }
    }
    

    EDIT: Glaube jetzt reserviere ich den Speicher doppelt^^ ahhhhh
    EDIT: doch nicht, while schleife lässt grüßen, blöd wenn man nach NULL pointer sucht den es anfangs nicht gibt ^^



  • So trotzdem eine Frage an euch Überflieger... Jetzt lege ich ja einmal Speicher umsonst an, den der erste "Speicherplatz" wird ja jetzt nie genutzt.

    Wollte des erst mit einem check vermeiden erstec:

    while(Zeiger->next != NULL){
            Zeiger = Zeiger->next;
            erstec++;
        }
    
        if(erstec != 1){
        New = (struct student*)malloc(sizeof(struct student));
        }
    

    Aber das ist natürlich Blödsinn da sonst nie neuer Speicher angelegt wird.

    Tipp? 🙂



  • 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.


Anmelden zum Antworten