Dateien einlesen und in Klasse speichern - Problem!



  • SeppJ schrieb:

    Hobbyprogrammierer schrieb:

    fake_Kenner schrieb:

    🙄
    Wie wärs mit einem Minimalbeispiel?

    Was meinst du damit?

    Grüße

    Damit ist gemeint, dass sich niemand 109 Zeilen durchliest, wenn man nur ein "funktioniert irgendwie nicht" als Fehlerbeschreibung bekommt. Lies dir mal dies durch, dann kannst du eher Leute motivieren, dir zu helfen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html

    Nun, erstens, hab ich den Code schon auf eine Funktion reduziert und zweitens versuche ich gerade selber auf die Ursache des Fehlers zu kommen! Außerdem ist der Code schnell überflogen..

    Grüße


  • Mod

    Hobbyprogrammierer schrieb:

    Nun, erstens, hab ich den Code schon auf eine Funktion reduziert und zweitens versuche ich gerade selber auf die Ursache des Fehlers zu kommen! Außerdem ist der Code schnell überflogen..

    Wenn dir keiner hilft und sogar schon zwei Leute sagen, dass etwas mit deiner Frage nicht stimmt, dann solltest du dir langsam Gedanken machen, ob du mit dieser Einstellung wirklich richtig liegst...



  • Also ich (und viele andere) haben keine Lust den Code anzugucken,
    der erstens nur in Code-Tags steht und nicht in den speziell für C/C++ ausgelegten cpp Tags:

    int main()
    {
     retur 0;
    }
    

    Und zweitens ist nix zum genauen Fehler bekannt. Stürzt das Programm ab, kompiliert es nicht, blabla... Da hab ich gar kein Motivation zu helfen.



  • SeppJ schrieb:

    Hobbyprogrammierer schrieb:

    Nun, erstens, hab ich den Code schon auf eine Funktion reduziert und zweitens versuche ich gerade selber auf die Ursache des Fehlers zu kommen! Außerdem ist der Code schnell überflogen..

    Wenn dir keiner hilft und sogar schon zwei Leute sagen, dass etwas mit deiner Frage nicht stimmt, dann solltest du dir langsam Gedanken machen, ob du mit dieser Einstellung wirklich richtig liegst...

    Sorry, ich versuch ja wirklich geraden den Kern des Fehlers zu finden (ich weiß es eben selbst nicht), bin kein Vollprofi, darum verzeiht mir den langen Code-Tag.

    jkljkl schrieb:

    Also ich (und viele andere) haben keine Lust den Code anzugucken,
    der erstens nur in Code-Tags steht und nicht in den speziell für C/C++ ausgelegten cpp Tags:

    int main()
    {
     retur 0;
    }
    

    Und zweitens ist nix zum genauen Fehler bekannt. Stürzt das Programm ab, kompiliert es nicht, blabla... Da hab ich gar kein Motivation zu helfen.

    Auch das wusste ich nicht, dass es einen eigenen C/C++ Code Tag gibt, bin, wie gesagt, neu hier, darum verzeiht mir bitte nochmal meine Anfängerfehler. Ich werde versuche den Code auf den wahren Fehler zu reduzieren und die Fehlermeldung dazu posten. 🙂

    Grüße



  • Hobbyprogrammierer schrieb:

    SeppJ schrieb:

    Hobbyprogrammierer schrieb:

    Nun, erstens, hab ich den Code schon auf eine Funktion reduziert und zweitens versuche ich gerade selber auf die Ursache des Fehlers zu kommen! Außerdem ist der Code schnell überflogen..

    Wenn dir keiner hilft und sogar schon zwei Leute sagen, dass etwas mit deiner Frage nicht stimmt, dann solltest du dir langsam Gedanken machen, ob du mit dieser Einstellung wirklich richtig liegst...

    Sorry, ich versuch ja wirklich geraden den Kern des Fehlers zu finden (ich weiß es eben selbst nicht), bin kein Vollprofi, darum verzeiht mir den langen Code-Tag.

    jkljkl schrieb:

    Also ich (und viele andere) haben keine Lust den Code anzugucken,
    der erstens nur in Code-Tags steht und nicht in den speziell für C/C++ ausgelegten cpp Tags:

    int main()
    {
     retur 0;
    }
    

    Und zweitens ist nix zum genauen Fehler bekannt. Stürzt das Programm ab, kompiliert es nicht, blabla... Da hab ich gar kein Motivation zu helfen.

    Auch das wusste ich nicht, dass es einen eigenen C/C++ Code Tag gibt, bin, wie gesagt, neu hier, darum verzeiht mir bitte nochmal meine Anfängerfehler. Ich werde versuche den Code auf den wahren Fehler zu reduzieren und die Fehlermeldung dazu posten. 🙂

    Grüße

    Vielleicht erzählt du auch einfach mal, was du vor hast und woran es scheitert. Eventuell kann man dir ja dort einen Tipp geben, der dich schon weiter bringt. In jedem Fall scheint deine Funktion viel doppelten Code zu nutzen, eventuell solltest du dort an eine weitere Funktion denken. Vielleicht löst sich das Problem ja sogar von ganz alleine, wenn du den Code etwas "aufräumst".



  • jkljkl schrieb:

    Hobbyprogrammierer schrieb:

    SeppJ schrieb:

    Hobbyprogrammierer schrieb:

    Nun, erstens, hab ich den Code schon auf eine Funktion reduziert und zweitens versuche ich gerade selber auf die Ursache des Fehlers zu kommen! Außerdem ist der Code schnell überflogen..

    Wenn dir keiner hilft und sogar schon zwei Leute sagen, dass etwas mit deiner Frage nicht stimmt, dann solltest du dir langsam Gedanken machen, ob du mit dieser Einstellung wirklich richtig liegst...

    Sorry, ich versuch ja wirklich geraden den Kern des Fehlers zu finden (ich weiß es eben selbst nicht), bin kein Vollprofi, darum verzeiht mir den langen Code-Tag.

    jkljkl schrieb:

    Also ich (und viele andere) haben keine Lust den Code anzugucken,
    der erstens nur in Code-Tags steht und nicht in den speziell für C/C++ ausgelegten cpp Tags:

    int main()
    {
     retur 0;
    }
    

    Und zweitens ist nix zum genauen Fehler bekannt. Stürzt das Programm ab, kompiliert es nicht, blabla... Da hab ich gar kein Motivation zu helfen.

    Auch das wusste ich nicht, dass es einen eigenen C/C++ Code Tag gibt, bin, wie gesagt, neu hier, darum verzeiht mir bitte nochmal meine Anfängerfehler. Ich werde versuche den Code auf den wahren Fehler zu reduzieren und die Fehlermeldung dazu posten. 🙂

    Grüße

    Vielleicht erzählt du auch einfach mal, was du vor hast und woran es scheitert. Eventuell kann man dir ja dort einen Tipp geben, der dich schon weiter bringt. In jedem Fall scheint deine Funktion viel doppelten Code zu nutzen, eventuell solltest du dort an eine weitere Funktion denken. Vielleicht löst sich das Problem ja sogar von ganz alleine, wenn du den Code etwas "aufräumst".

    Nun, es soll mal ein Vokabelüberprüfer werden. Zurzeit bin ich bei dem Schritt, dass ich erstmal die Daten von den Dateien einlesen will und dann in einer Klasse abspeichern will. Das Problem bei der Sache ist, dass ich die Dateien in Lektionen unterteile, aber nur einen Klassenarray will, und nicht 10 verschiedene Klassenvariablen. 😉

    Es dürft wohl hier hacken:

    if((i+1) == iStart) {
                    int j = 0, k=0;
                    nNomen_1 = new Nomen [COUNT];
    
                    for(int l=0;i<nomen_info[0];l++) {
                        nNomen_1[l].erzeuge_DeklTyp(nomen_1[j]); //zeile 100
                        j++;
                        nNomen_1[l].erzeuge_Lekt(nomen_1[j]);
                        j++;
                        nNomen_1[l].erzeuge_Geschlecht(nomen_1[j]);
                        j++;
                    }
                    for(int l=0;l<nomen_info[0];i++) {
                        nNomen_1[l].erzeuge_2(nomen_2[k], nomen_2[k+1], nomen_2[k+2]);
                        k += 3;
                    }
                }
                else {
                    int tmp = COUNT - nomen_info[0];
                    int j = 0, k = 0;
    
                    for(int i=tmp;i<COUNT;i++) {
                        nNomen_1[i].erzeuge_DeklTyp(nomen_1[j]);
                        j++;
                        nNomen_1[i].erzeuge_Lekt(nomen_1[j]);
                        j++;
                        nNomen_1[i].erzeuge_Geschlecht(nomen_1[j]);
                        j++;
                    }
                    for(int i=tmp;i<COUNT;i++) {
                        nNomen_1[i].erzeuge_2(nomen_2[k], nomen_2[k+1], nomen_2[k+2]);
                        k += 3;
                    }
                }
    

    Zuerst läuft das Programm ganz normal und dann dann gibt er mir so eine hässliche Fehlermeldung raus: Programm received signal SIGSEGV, Segmentation fault. Do you want to to view the backtrace? YES/NO
    Wenn ich auf JA klicke kommt: Call stack
    Nr | Adress | Function | File | Line
    0 00438466 std::string::assign() [...] 77
    1 0043A52E std::string::operator=() [...] 77
    2 004014AC Nomen::erzeuge_DeklTyp(this=0x5d470c, iDeklTyp=6) [...] 25
    3 00402840 Datei_Einlesen_Nomen(iStart=1, iEnde=2) [...] 100
    4 00403994 main() [...] 210

    Zeile 100 ist oben eingezeichnet, Zeile 77 ist mitten im Einlesen der Dateien in Arrays, das funktioniert allerdings, das hab ich nachgeprüft.

    Grüße


  • Mod

    Was sind denn nomen_info[0] und COUNT ? Vermutlich ist nämlich nomen_info[0] größer als COUNT und deshalb bekommst du den Fehler.

    Allgemein solltest du unbedingt std::vector anstatt eigener dynamischer Arrays benutzen, dann können solche Fehler gar nicht erst so schnell auftreten und falls doch, können sie leichter gefunden werden.



  • SeppJ schrieb:

    Was sind denn nomen_info[0] und COUNT ? Vermutlich ist nämlich nomen_info[0] größer als COUNT und deshalb bekommst du den Fehler.

    COUNT ist größer als nomen_info[0], das hab ich überprüft.

    Allgemein solltest du unbedingt std::vector anstatt eigener dynamischer Arrays benutzen, dann können solche Fehler gar nicht erst so schnell auftreten und falls doch, können sie leichter gefunden werden.

    Hab ich mir jetzt noch nicht sooo angeschaut, allerdings werd ich es versuchen. Hat da irgendwer ein gutes Tutorial bei der Hand? Ansonsten frage ich mal Onkel Google. 😃

    Grüße



  • Ok, hab den Fehler gefunden: Hab alle Schleifenvariablen von 'i' auf 'l' umbenannt, weil 'i' ja schon in der gaaanz großen Schleife definiert war und somit der Compiler etwas verwirrt gewesen sein könnte. Jetzt funktionierts!



  • Die vorgestellte Funktion ist VIEL zu lang, zu komplex, zu tief verschachtelt.
    Das muss doch möglich sein, das Monstrum in kleinere Teilfunktionen zu zerlegen?

    Also man kann ja nur vermuten, was die Funktion überhaupt tun soll.
    Was soll denn geschehen, wenn man z.B.

    Datei_EinLesen_Nomen(5, 12);
    

    aufruft?

    Es werden ja offenbar mehrere Dateien dabei eingelesen, womöglich gar mehrere 'Dateien-Paare', also könnte man die Funktion in einem ersten Schritt schon mal umbenennen:

    DateiPaare_EinLesen(5, 12);
    

    ? Ist das so richtig in das Code-Fragment hineininterpretiert?

    Zudem kann man nur mutmaßen, wie die Klasse 'CLektion' (?), deren Instanzen scheinbar FLektion_nomen_info[0-39] heißen, gebaut sein könnte ...

    Sehr verdächtig ist auch

    COUNT_ALL_nomen_info = getLines(FLektion_nomen_info[i]);
    

    Ist getLines womöglich ein friend von CLektion, der auf die Interna einer(hoffentlich als Refernez-Parameter übergebenen) CLektion-Instanz zugreifen darf, um die Anzahl der dort speicherbaren Zeilen (?) herauszufinden?
    Fragen über Fragen, aus dem nur schütter kommentierten Quellcode wird man einfach nicht schlau.
    Auch

    FLektion_nomen_info[i].c_str()
    

    tut wohl eher nichts Vernünftiges (Konvertiert die Funktion womöglich den in Flektion_nomen_info[i] abgelegten std::string - Dateinamen in einen C-String? Scheint plausibel ...)

    Insgesamt kann man nur raten, die Monster-Funktion in kleinere, überschaubare Einheiten zu zergliedern, und falls das partout nicht möglich sein sollte, dann zumindest den Quellcode besser zu kommentieren und auch das eine oder andere Wort über den Bauplan eines CLektion-Objektes zu verlieren.

    mfg


Anmelden zum Antworten