Linkertoolfehler
-
Hat sich die Fehlermeldung geändert nachdem du void Main() in int main() geändert hast?
-
Leider nein
-
Gerade getestet. Bei mir kommt die Fehlermeldung nur wenn er die main() Funktion nicht finden kann. Also wirst du das noch immer falsch drinnen stehen haben.
-
Ich hab es nun so drin stehen. Aber es ist immer noch die selber Fehlermeldung.
int main() { double pwm = 0, spannung = 0, x = 0; DatenArray p; DatenArray s; DatenArray x1; ifstream datei;Und natürlich am Ende return 0;
-
Ah nun funktioniert es.
War wohl mit den Gedanken woanders...Es wird nun versucht eine Date mit Werten einzulesen, die durch ein ; getrennt sind. Leider bleibt das Programm in der while-Schleife hängen.
Habt ihr hierfür vielleicht auch noch einen Tipp für mich?
-
Sehr komisch, dass der Linker main dann trotzdem nicht findet. Geh mal sicher, dass die main.cpp nicht vom Build ausgeschlossen ist. Falls das nicht hilft: Klicke auf Projektmappe neu erstellen, hat bei mir öfters bei Link-Fehlern geholfen.
Im Zweifellsfall VS nochmal neustarten, manchmal spinnt das Ding einfach.
EDIT: Zu spät
-
Nach einem Neustart hat es endlich funktioniert.
Beim Debuggen hab ich festgestellt, dass er sich wohl in dieser Zeile aufhängt:
const char *c = zeichen.c_str(); scanf(c,"%d,%d,%d",pwm, spannung, x);Habt ihr ne Idee?
-
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.
-
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:
-
Du verwendest
string.hundstdlib.h. Unter C++ bindet man stattdessencstringundcstdlibein. -
Deine Klasse Datenarray kann durch
std::vector<double>ersetzt werden, der funktioniert wenigstens und erzeugt keine Speicherlecks.
-
-
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

-
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.
-
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...
-
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;123Die eigentliche Datei, die später eingelesen werden soll, hat natürlich weitaus mehr Werte.
-
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)