Linkertoolfehler



  • Krümelkeks schrieb:

    Habt ihr ne Idee?

    Ja. C++-Streams statt C-Funktionen benutzen. Da kannst du dann einfacher debuggen und schauen, was passiert und wo er sich aufhängt.


  • Mod

    Krümelkeks schrieb:

    const char *c = zeichen.c_str();
    scanf(c,"%d,%d,%d",pwm, spannung, x);
    

    Habt ihr ne Idee?

    Ja. Das ist total falsch. Was soll das machen? Suchst du vielleicht sscanf? Und was hätte beides in einem C++ Programm zu suchen?



  • Warum dein Programm stehenbleibt weiß ich jetzt nicht, allerdings fallen mir auf den ersten Blick einige grobe Macken auf:

    1. Du verwendest string.h und stdlib.h . Unter C++ bindet man stattdessen cstring und cstdlib ein.

    2. Deine Klasse Datenarray kann durch std::vector<double> ersetzt werden, der funktioniert wenigstens und erzeugt keine Speicherlecks.


  • Mod

    Für die, die nicht sehen, wo der fehler ist: Er verwendet seinen String als Formatstring, der Formatstring selber wird damit zum Argument und dann passieren ganz schlimme Sachen...



  • SeppJ schrieb:

    Krümelkeks schrieb:

    const char *c = zeichen.c_str();
    scanf(c,"%d,%d,%d",pwm, spannung, x);
    

    Habt ihr ne Idee?

    Ja. Das ist total falsch. Was soll das machen? Suchst du vielleicht sscanf? Und was hätte beides in einem C++ Programm zu suchen?

    Hatte nach etwas gesucht,dass meine eingelesen Zeile auf 3 Variablen speichert und hatte diese Funktion gefunden.
    Ich muss dazu sagen,dass ich kaum mit C++ arbeite.Eigentlich nur wegen dem Studium.Hab mich eher mit C# beschäftigt.

    Vielen lieben Dank für all die Hinweise.



  • SeppJ schrieb:

    Für die, die nicht sehen, wo der fehler ist: Er verwendet seinen String als Formatstring, der Formatstring selber wird damit zum Argument und dann passieren ganz schlimme Sachen...

    Gibts eine gute Lösung hierfür?

    Bin übrigens eine sie 😉


  • Mod

    Krümelkeks schrieb:

    Gibts eine gute Lösung hierfür?

    So wie du es schreibst, meinst du sscanf, nicht scanf (beide mal nachschlagen!). Das ist dann aber beides C, kein C++. Folge pumuckls Rat und nutze die C++-Streams. Deine ganze main:

    void Main()
    {
        double pwm = 0, spannung = 0, x = 0;
        DatenArray p;
        DatenArray s;
        DatenArray x1;
        ifstream datei;
        string zeichen;
        datei.open("F:\\Messdaten.txt");
    
        while(!datei.eof())
        {
            getline(datei,zeichen);
            const char *c = zeichen.c_str();
            scanf(c,"%d,%d,%d",pwm, spannung, x);
            p.AddElement(pwm);
            s.AddElement(spannung);
            x1.AddElement(x);
    
        }
        datei.close(); 
    }
    

    würde man in C++ so schreiben:

    int main()
    {
        DatenArray p;
        DatenArray s;
        DatenArray x1;
        {
          ifstream datei("F:\\Messdaten.txt");
          double pwm, spannung , x;
          while(datei >> pwm >> spannung >> x)
            {
              p.AddElement(pwm);
              s.AddElement(spannung);
              x1.AddElement(x);
            }
        }
    }
    

    Hierbei habe ich übrigens noch einen Fehler in der Programmlogik bereinigt: Du prüfst auf Dateiende, dann liest du, dann speicherst du ab, egal was beim Lesen passiert ist (es könnte Dateiende passiert sein). Richtig ist natürlich Lesen, dann prüfen ob dies erfolgreich war (und zwar auf alle(!) Fehler), dann abspeichern.

    Die p, s und x1 betteln übrigens danach, irgendwie zu einer Klasse zusammengefasst zu werden. Und dein ⚠ DatenArray ist eine (schlechte) Kopie von std::vector ⚠ .



  • SeppJ schrieb:

    Krümelkeks schrieb:

    Gibts eine gute Lösung hierfür?

    So wie du es schreibst, meinst du sscanf, nicht scanf (beide mal nachschlagen!). Das ist dann aber beides C, kein C++. Folge pumuckls Rat und nutze die C++-Streams. Deine ganze main:

    void Main()
    {
        double pwm = 0, spannung = 0, x = 0;
        DatenArray p;
        DatenArray s;
        DatenArray x1;
        ifstream datei;
        string zeichen;
        datei.open("F:\\Messdaten.txt");
    
        while(!datei.eof())
        {
            getline(datei,zeichen);
            const char *c = zeichen.c_str();
            scanf(c,"%d,%d,%d",pwm, spannung, x);
            p.AddElement(pwm);
            s.AddElement(spannung);
            x1.AddElement(x);
           
        }
        datei.close(); 
    }
    

    würde man in C++ so schreiben:

    int main()
    {
        DatenArray p;
        DatenArray s;
        DatenArray x1;
        {
          ifstream datei("F:\\Messdaten.txt");
          double pwm, spannung , x;
          while(datei >> pwm >> spannung >> x)
            {
              p.AddElement(pwm);
              s.AddElement(spannung);
              x1.AddElement(x);
            }
        }
    }
    

    Hierbei habe ich übrigens noch einen Fehler in der Programmlogik bereinigt: Du prüfst auf Dateiende, dann liest du, dann speicherst du ab, egal was beim Lesen passiert ist (es könnte Dateiende passiert sein). Richtig ist natürlich Lesen, dann prüfen ob dies erfolgreich war (und zwar auf alle(!) Fehler), dann abspeichern.

    Die p, s und x1 betteln übrigens danach, irgendwie zu einer Klasse zusammengefasst zu werden. Und dein ⚠ DatenArray ist eine (schlechte) Kopie von std::vector ⚠ .

    Vielen Dank.
    Habe es gerade einmal ausprobiert. Aber auch hier kommt er erst gar nicht in die while-Schleife hinein.


  • Mod

    Dann exisitert die Datei nicht oder kann aus anderen Gründen nicht geöffnet werden oder es findet bereits in der ersten Zeile ein Lesefehler statt.



  • Datei exestiert. Wird auch geöffnet. Er springt in den Schleifenkopf und dann gleich ans Ende der Main.

    So langsam verzweifel ich wirklich. Das mach definitiv keinen Spaß mehr...


  • Mod

    Dann stehen da keine drei doubles. Zeig mal den Anfang der Datei.



  • Ich habe zum Testen eine einfachte txt Datei mit folgenden Testwerten erstellt:
    21.23;234.2;123

    Die eigentliche Datei, die später eingelesen werden soll, hat natürlich weitaus mehr Werte.


  • Mod

    Dann ist ja auch kein Wunder, wenn da noch Semikolons zwischen stehen. Mach mal:

    double pwm, spannung , x;
          char semikolon;
          while(datei >> pwm >> semikolon >> spannung >> semikolon >> x)
    


  • Oh, danke. Ich dachte ich hätte es erwähnt.
    Schaut schon besser aus. Den ersten Wert speichert er korrekt. Bei den beiden hinteren zahlen macht er irgendwie alles durcheinander.


  • Mod

    Wenn du dich klarer ausdrücken würdest oder mehr Informationen liefern würdest, könnte man dir vielleicht sogar helfen. Also besser nichts verraten!



  • Habe den von dir geschriebenen Quellcode eingefügt. Dadurch ist er nun auch in die Schleife gesprungen.

    Beim debuggen habe ich feststellen müssen, dass er auf die Variable pwm 21.23 speichert. Dies ist auch der richtige Wert.
    Hingegen aber auf die Variable spannung 34.2 anstatt von 234.2 und auf x 23.00 anstatt 123. Irgendwo scheinen also Zahlenwerte verloren zu gehen.
    Fehlermeldungen gibt es ansonsten nicht und das Programm wird auch ordnungsgemäß beendet.

    Danke für deine Bemühungen!


  • Mod

    Das wiederum deutet stark da drauf hin, dass da keine Semikolons zwischen deinen Zahlen stehen...



  • Lies dir bitte mal den Link in meiner Signatur durch. Gerne auch weimal. Und dann poste uns bitte

    1. Den genauen Inhalt deiner Input-Datei, nicht etwas, was so ähnlich ist.
    2. Den genauen Quellcode deines Programms
    3. Die genauen Ausgaben des Programms bzw. den output des Compilers, sollte es Fehler und/oder Warnungen geben.

    Und bitte alles zusammen. Nicht den Input von vorgestern mit dem Programm von gestern und den Fehlermeldungen von heute. Das passt irgendwie nicht zusammen...



  • Fehler gefunden.

    Vielen Dank für eure Hilfe!


Anmelden zum Antworten