Linkertoolfehler
-
Hallo,
wenn ich den unten stehenden Quellcode ausführen möchte, erhalte ich folgende Fehlermeldungen:
- error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup". F:\Messwerte\Messwerte\Messwerte\MSVCRTD.lib(crtexe.obj) Messwerte
- error LNK1120: 1 nicht aufgelöste externe Verweise. F:\Messwerte\Messwerte\Debug\Messwerte.exe 1 1 Messwerte
Beide Meldungen habe ich bisher noch nie erhalten und konnte den Fehler leider auch noch nicht finden.
Vielleicht könnt ihr mir ein wenig auf die Spürunge helfen?!Mein Quellcode schaut wie folgt aus:
Main:
#include <iostream> #include "DatenArray.h" #include <fstream> #include <string> #include <stdio.h> #include <string.h> using namespace std; 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(); }Klasse DatenArray:
#include "DatenArray.h" DatenArray :: DatenArray(int size) :size(2) { count = 0; datenArray = new double[size]; } void DatenArray :: AddElement(double value) { if(count == size) { double* temparr = new double [(size*2)]; for (int i = 0; i < (size); i++) { temparr[i] = datenArray[i]; } datenArray = temparr; size *=2; } datenArray[count] = value; count ++; } int DatenArray :: GetElement(int index) { if (index < count) { return datenArray[index]; } // Out of Bounds throw new IndexOutOfBoundException("Zugriff auf ein nicht existentes Element"); } int DatenArray :: Count() { return count; } int DatenArray :: Size() { return size; } bool DatenArray :: IsEmpty() { return (count) < 1; } DatenArray :: ~DatenArray() { }Header-Datei DatenArray:
#ifndef UARRAY_H #define UARRAY_H #include <stdexcept> class DatenArray { public: //Testen welcher Konstruktor notwendig ist //DatenArray(); DatenArray(int size = 2); //Möglicherweise int weg // Löscht das Element ~DatenArray(); //Fügt ein Element hinzu void AddElement (double value); //Gibt ein Element an der angegebenen Stelle zurück int GetElement (int index); //Anzahl der aktuell beinhalteten Elemente int Count (); //Größe des Array int Size(); //Gibt zurück, ob das Array leer ist bool IsEmpty(); private: int count; double* datenArray; //eventl. int size; }; class IndexOutOfBoundException : public std::runtime_error { public: IndexOutOfBoundException(const std::string& message) : std::runtime_error(message.c_str()) {}}; #endifVielen lieben Dank schon einmal für eure Mühe!
Edit: gelöst
-
Dein Programm enthält kein
int main()
-
Danke für die schnelle Antwort.
Aber auch das löst den Fehler nicht.
-
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...