verkettete Liste speichern/laden



  • Ist ein Runtime-Fehler:
    "Unbehandelte Ausnhame :System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    at substr(SByte* in, SByte* lowout, Sbyte search)
    at ParseOnline(SByte* Buffer, person* data)
    at main()"



  • Wenn ich das richtig interpretiere ist ein teil der Parameter von substr leer. das kann eigentlich nur buffer sein
    Setz doch bitte vor jedes substr die folgende Zeile printf("Inhalt von Buffer ]%s[\n",buffer);
    Damit wir sehen wie der gelesene Buffer aussieht vor während und nach dem zerlegen aussieht

    int ParseOneline(char *Buffer,struct person *data)
    {
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->vname,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
             substr(Buffer,data->nname,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
             substr(Buffer,data->wohnort,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->plz,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->strasse,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->hausnummer,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->vorwahl,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
        substr(Buffer,data->telnr,'#');
    printf("Inhalt von Buffer ]%s[\n",buffer);
    
    return 0;
    
    }
    


  • wo kommt bei die in dem Stück data her, ich glaube mein erster Verdacht war falsch, dein Data zeigt wahrscheinlich auf NULL

    while(zeiger->next != NULL)  //<=== Wofür das while??  du hängst beginnend vom ersten element ein Element 
                zeiger=zeiger->next;// nach dem anderen an somit zeigt zeiger->next auf NULL 
            zeiger->next= (struct person*) malloc (sizeof(struct person)); // ein malloc ohne Fehlerhandling Fast eine Todsünde
            ParseOneline(buffer0,data); //<========== hier müste zeiger stehen
            zeiger=data;
            zeiger->next=NULL;
        }
    


  • Also, wird einmal der Inhalt von "Buffer" ausgegeben und dann bricht das Programm mit einem Fehler ab.

    Wenn ich noch vor das 1. printf

    data = (struct person*) malloc (sizeof(struct person));
    

    schreibe, werden 4 Zeilen ausgegeben und dann bricht das Programm ab! 😕



  • wie sehen diese 4 Zeilen vom Inhalt aus?



  • ja, das while am Anfang muss weg. Ich hab ein bisschen Quellcode von einer Funktion kopiert, die ich auch mit eingearbeitet habe. Ist mit "reingerutscht"

    zu dem Fehlerabfang - stimmt, wirklich ziemlich leichtsinnig!



  • funktionierts denn jetzt??? 👍 👎 💡



  • PAD schrieb:

    funktionierts denn jetzt???

    Nö! 😞

    PAD schrieb:

    wie sehen diese 4 Zeilen vom Inhalt aus?

    Auf dem Bildschirm wird folgendes ausgegeben:
    Inhalt von Buffer ]vname1#nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
    Inhalt von Buffer ]nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
    Inhalt von Buffer ]wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1[
    Inhalt von Buffer ]plz1#strasse1#hausnummer1#vorwahl1#telnr1[

    Danach kommt wieder die gleiche Fehlermeldung von vorhin!



  • ist data-plz ein string oder eine Integer???? 😃



  • integer



  • Dann ist ja klar was passiert man kann einer Integer keinen pointer of char zuweisen

    Lösung 1 schon mal erwähnt mach nen String draus
    Lösung 2 dieses Verfahren an allen Stellen an denen du Integers benutzt (strol wäre besser atol tuts aber)

    char buffer1[1024 +1];
    ...
        substr(Buffer,buffer1,'#');
        data->plz=atol(buffer1);
        printf("Inhalt von Buffer ]%s[,]%s[, %li\n",buffer,buffer1,data->plz);
    

    😃



  • Hi, also datei wird jetzt schonmal komplett geladen. Ich hab mich für die Variante entschieden, alle werte in char zu ändern.

    Wenn ich jetzt aber die geladenen Daten anzeigen lassen will, wird nix bzw nur Mist angezeigt.

    Komisch ist auch, dass auf dem Bildschirm jetzt folgendes ausgegeben wird:
    Inhalt von Buffer ]vname1#nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
    [
    Inhalt von Buffer ]nname1#wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
    [
    Inhalt von Buffer ]wohnort1#plz1#strasse1#hausnummer1#vorwahl1#telnr1
    [
    Inhalt von Buffer ]strasse1#hausnummer1#vorwahl1#telnr1
    [
    Inhalt von Buffer ]hausnummer1#vorwahl1#telnr1
    [
    Inhalt von Buffer ]vorwahl1#telnr1
    [
    Inhalt von Buffer ]#telnr1
    [
    Inhalt von Buffer ][

    Wurde da irgendwie ein newlinezeichen oder so mit gespeichert, welches jetzt die Werte verändert?



  • Für mich sieht das ganz positiv aus.
    Es wird während des Lesens, jeweils der noch nicht bearbeitete Teil des Inputbuffers angezeigt.
    Das am Ende ein \n steht ist auch erwartet und korrect.
    damit du den Inhalt der einzelnen Elemente sehen kannst, solltest du die PrintZeiger Routine die ich schon mal angesprochen
    habe implementieren.
    Am Ende von data->telnr mußt du noch das \n entfernen
    Frage hast du die Datei mit "rt" oder "rb" geöffnet

    Falls "rt" dann data->telnr[strlen(data->telnr)-1)=0x00;
    Falls "rb" dann data->telnr[strlen(data->telnr)-2)=0x00;

    int ParseOneline(struct person *data)
    {
    printf("data->vname]%s[\n",data->vname);
    printf("data->nname]%s[\n",data->nname);
    ....
    return 0;
    }
    

    Wenn du jetzt in deiner Datei mehrere Zeilen hast sollte für jede beim Lesen diese Ausgabe aus ParseOneLine kommen.
    Es würde sinn machen neben dem Restbuffer auch den jeweils gelesenen Teil anzuzeigen, das ist eine triviale Erweiterung
    von printf.



  • habs mit rb geöffnet, aber der strlen-Befehl funktioniert so nicht. Hast du da einen Schreibfehler drin? Hab nämlich alles Mögliche schon probiert



  • Natürlich die jeweils letzte Runde sollte eine ] sein.

    Hättste aber auch selber anhand der Compiler Meldung korrigieren können



  • So, jetzt funktioniert endlich alles - ich danke dir wie verrückt!!!



  • Das freut mich 😃 😃 😃 😃

    Ich glaube wir haben hier zusammen ein paar Methoden entwickelt, die dir bei der Programmierung helfen.
    Die Methoden haben den Vorteil, das man sie auf beliebige andere Probleme übertragen kann.

    P.S. Es ist erstaunlich wie SteinZeitDebugging helfen kann ("Einstreuen von printf statements in den Code um den aktuellen Zustand zu überwachen." Eine sinnvolle Erweiterung ist diese Debugausgaben in einem logfile zu speichern).

    Viel Spaß 🤡



  • Hi,

    wollte bloß nochmal fragen, ob ich die Liste jetzt auch sortieren könnte, zB einam lnach Name, dann mal nach Strasse usw!? Das sind ja nun alles Strings - kann man sie überhaupt sortieren? Wenn ja, was für einen Befehl nimmt man da?



  • natürlich.

    Primitivste ("nicht wertend gemeint") Lösung ist Erzeuge einen neuen Head Knoten
    suche das größte Element in der alten Liste trag dieses in die neue ein

    Strings auf größer kleiner vergleichen geht lexikalisch mit strcmp, stricmp, strnicmp, strncmp. Diese Funktionen gibts mit diesem oder ähnlichen Namen bei jedem Compiler aber nur strcmp ist meines Wissen Ansi

    stricmp vergleiche ohne auf groß kleinschreibung zu Achten
    strncmp vergleiche die ersten n zeichen zweier Strings
    strnicmp vergleiche case insensitiv dir ersten n Zeichen

    Mehr siehe Handbuch oder Hilfe



  • Ok, hört sich nicht so schwer an - danke dir!


Anmelden zum Antworten