wxString::ToDouble führt zu segmentation fault



  • boom schrieb:

    Daraus hab ich geschlossen, dass es an der Zeile liegen muss

    Das ist aber falsch.

    Stell dir folgendes vor: Eine Gruppe von Kindern hat viele Kisten mit Luftballons drin. Die Kinder dürfen in die Kartons mit Nadel stechen und die Ballons zum platzen bringen. Wenn jetzt in einem Ballon statt Luft, Wasser drin ist, und das Kind, was den Ballon kaputt macht, nass wird, dann liegt das ja nicht an dem Kind, sondern an demjenigen, der in den Luftballonkisten eine Wasserbombe platziert hat.



  • Also ich finde die Antworten etwas irreführend. Ich meine es sieht doch danach aus, dass du einfach über die Grenze deines Arrays hinausgreifst. Kann es sein, dass du nur 8 Felder reserviert hast und nicht mehr, wie es hier erforderlich wäre?



  • Ich weiß ja nicht schrieb:

    Also ich finde die Antworten etwas irreführend. Ich meine es sieht doch danach aus, dass du einfach über die Grenze deines Arrays hinausgreifst. Kann es sein, dass du nur 8 Felder reserviert hast und nicht mehr, wie es hier erforderlich wäre?

    Ja, aber so lange er nicht zeigt, wie er die Variable anlegt, kann man das nur raten.



  • ProgChild schrieb:

    Ich weiß ja nicht schrieb:

    Also ich finde die Antworten etwas irreführend. Ich meine es sieht doch danach aus, dass du einfach über die Grenze deines Arrays hinausgreifst. Kann es sein, dass du nur 8 Felder reserviert hast und nicht mehr, wie es hier erforderlich wäre?

    Ja, aber so lange er nicht zeigt, wie er die Variable anlegt, kann man das nur raten.

    Okay, das ist wohl war. Also boom, zeig den Code, wo du das Array anlegst.



  • wxString rowString = file->GetLine (iRow);
    wxArrayString rowStringParsed (9);
    
    [...]
    
    double dMtPoints;
    rowStringParsed[8].ToDouble (&dMtPoints);
    rowReturn.setMtPoints (dMtPoints);
    

    Das ist er. Ich hätte ihn direkt im ersten Thread reingeschrieben, nur ich war mir 99% sicher, dass es an ToDouble liegt. Ausserdem benutzte ich den GDB nicht so oft.

    Ich versteh überhaupt nicht wieso das nicht geht...



  • Ich hab gerade eben den Fehler gefunden.

    Ihr hattet recht, er war nicht bei dem wxString::ToDouble sonder gaaaanz wo anderst. Er lag in einer ganz anderen Funktion und war mehr ein Flüchtigkeitsfehler 🙄

    Trotzdem thx 😃



  • Wie wäre es, wenn du mal einen Blick in die Dokumentation wirfst...

    Du erstellst wxArrayString mit diesem Construktor.

    wxArrayString(int autoSort)
    

    Das bedeutet du legst ein StringArray mit 0 Elementen an, welches seine Elemente sortiert. Wenn du jetzt auf das nicht vorhandene Element mit dem Index 8 zugreifst, dann knallt es natürlich.

    So sollte es gehen:

    wxArrayString rowStringParsed; 
    rowStringParsed.Add(_T(""), 9);
    double dMtPoints;
    rowStringParsed[8].ToDouble (&dMtPoints);
    

    boom schrieb:

    Ich hab gerade eben den Fehler gefunden.

    Ihr hattet recht, er war nicht bei dem wxString::ToDouble sonder gaaaanz wo anderst. Er lag in einer ganz anderen Funktion und war mehr ein Flüchtigkeitsfehler 🙄

    Bist du sicher? Deine 9 im Konstruktor macht irgendwie keinen Sinn... Dass der Fehler woanders liegen musst war klar 😉

    boom schrieb:

    Trotzdem thx 😃

    Kein Problem



  • ProgChild schrieb:

    Du erstellst wxArrayString mit diesem Construktor.

    wxArrayString(int autoSort)
    

    Woher hast du den Konstruktor?
    Ich finde komischerweise nur folgenden Konstruktoren:

    wxArrayString() { }
    wxArrayString(const wxArrayString& a) : wxArrayStringBase(a) { }
    wxArrayString(size_t sz, const wxChar** a);
    wxArrayString(size_t sz, const wxString* a);
    

    Also bei mir klappt es mit der 9 einwandfrei



  • boom schrieb:

    Woher hast du den Konstruktor?

    Die Frage ist: Woher hast du ihn? Du benutzt ihn doch, aber kennst seine Bedeutung nicht? Ich habe diesen Konstruktor aus den Header-Dateien. Dort drin steht in den Kommentaren, was dieser Konstruktor macht.

    boom schrieb:

    Ich finde komischerweise nur folgenden Konstruktoren:

    wxArrayString() { }
    wxArrayString(const wxArrayString& a) : wxArrayStringBase(a) { }
    wxArrayString(size_t sz, const wxChar** a);
    wxArrayString(size_t sz, const wxString* a);
    

    Und du benutzt einfach einen der nicht dokumentiert ist? Hältst du das nicht für ein bisschen, sagen wir, unklug?

    boom schrieb:

    Also bei mir klappt es mit der 9 einwandfrei

    Sicher, nur sei dir im klaren, dass dieser Konstruktor nicht dafür sorgt, dass Platz für 9 Elemente geschaffen wird, sondern dass deine 9 als true aufgefasst wird und damit dein String-Array immer alphabetisch sortiert wird.



  • ProgChild schrieb:

    boom schrieb:

    Woher hast du den Konstruktor?

    Die Frage ist: Woher hast du ihn? Du benutzt ihn doch, aber kennst seine Bedeutung nicht? Ich habe diesen Konstruktor aus den Header-Dateien. Dort drin steht in den Kommentaren, was dieser Konstruktor macht.

    Aus den Header-Dateien hab ich die auch. 🙄 😕 😕

    Ich hab die benutzt, weil ich dachte, dass ich das so im Buch gelesen hab. Hab mich da wohl vertan...


Anmelden zum Antworten