Error LNK2019



  • Ich habe folgende Fehlermeldung erhalten

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall Student::setNewMark(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setNewMark@Student@@QAEXV?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" in Funktion "_main".
    Datei: main.obj

    Kann mir jemand anhand der Fehlermeldung sagen was ich für einen Fehler habe UND wie ich ihn beheben kann?

    Vielen Dank im vorraus!


  • Mod

    Du hast eine Funktion

    void Student::setNewMark(std::string)
    

    benutzt, die zwar vorher irgendwo bekannt gemacht wurde (d.h. irgendwo steht etwas in der Art von

    class Student
    {
     // ...
     void setNewMark(std::string);
     // ...
    };
    

    ) aber nirgendwo in dem Projekt definiert wurde (d.h. es steht nirgendwo etwas in der Art von

    void Student::setNewMark(std::string)
    {
      // Hier Code
    }
    

    )



  • Nicht ganz. Folgender Code steht dort drin.

    void setNewMark(std::string sReadMarks){
    
    	char *a=new char[sReadMarks.size()+1];
    	a[sReadMarks.size()]=0;
    	memcpy(a,sReadMarks.c_str(),sReadMarks.size());
    
    	if(isdigit('a')!=0){
    		cout << "Error" << endl;
    	}
    
    }
    


  • Storm13000 schrieb:

    Nicht ganz.

    Genau. Das, was bei dir fehlt, ist das Problem.



  • Das sind zwei unterschiedliche Funktionen. Du hast in deiner .cpp Datei eine freie Funktion, weil du nicht kenntlich gemacht hast, dass sie zur Klasse Student gehört.

    // freie Funktion
    void setNewMark( std::string ReadMarks )
    {
    }
    
    // Member
    void Student::setNewMark( std::string ReadMarks )
    {
    }
    


  • So nebenbei: warum hantierst du mit memcpy und char* rum?

    Achso, und "if(isdigit('a')!=0)" macht bestimmt nicht das, was du willst.



  • isdigit gibt einen wert ungleich null aus, wenn der char aus nummern besteht. genau das will ich.

    Und danke wegen der funktion! 😉



  • Storm13000 schrieb:

    isdigit gibt einen wert ungleich null aus, wenn der char aus nummern besteht. genau das will ich.

    Nur das 'a' nie aus Nummer bestehen kann. 🙂



  • Wieso? Und wie mach ich das dann?

    P.S.: das != muss ein == es dürfen nur Zahlen und leerzeichen sein, sonst soll der "Error" ausgegeben werden



  • D.h. Wie übernehme ich die Zeichen aus dem String INKLUSIVE der Zahlen?
    Und teste dann ob eventuell Buchstaben drin sind(für das weitere Programm dürfen keine Buchstaben etc drin sein NUR Zahlen und Leerzeichen, z.B: "1 7 2 3 5 8 6 9")


  • Mod

    Storm13000 schrieb:

    Wieso? Und wie mach ich das dann?

    P.S.: das != muss ein == es dürfen nur Zahlen und leerzeichen sein, sonst soll der "Error" ausgegeben werden

    Ganz kalt.

    Gib zu: Du hast zuerst isdigit(a) gehabt, das hat (richtigerweise) nicht compiliert. Dann hast du solange verschiedene Kombinationen verschiedener Zeichen ausprobiert, bis es zufällig compilierte. So programmiert man nicht! Entsprechend ist das auch totaler Unsinn. Es prüft, ob das Zeichen 'a' eine Ziffer ist. Was niemals der Fall ist. Vermutlich willst du dich irgendwie auf die Variable a beziehen. Leider ist unklar, was du genau feststellen möchtest. Ob die Zeichenkette auf die a zeigt nur aus Ziffern besteht? Dann müsstest du über alle Zeichen iterieren und jeweils einzeln prüfen, aber das ist nicht die wirkliche Antwort. Die wirklich hilfreiche Antwort wäre nämlich, so vorzugehen, dass dieser Fall gar nicht vorkommen kann. Eingabeüberprüfung ist keine Funktionalität von irgendwelchen Settern, sondern sollte bei der Eingabe stattfinden.

    Weiterhin ist sowieso unklar, was das a hier überhaupt soll. Hattest du zuerst etwa isdigit(sReadMarks) und das hat noch viel weniger funktioniert und du hast nach obigem Verfahren das a eingeführt und wir sehen hier schon die verbesserte Version?

    Storm13000 schrieb:

    D.h. Wie übernehme ich die Zeichen aus dem String INKLUSIVE der Zahlen?
    Und teste dann ob eventuell Buchstaben drin sind(für das weitere Programm dürfen keine Buchstaben etc drin sein NUR Zahlen und Leerzeichen, z.B: "1 7 2 3 5 8 6 9")

    Es kommt mir so vor, als würdest du nach etwas fragen, was du denkst, wäre die Lösung für dein Problem, anstatt nach deinem eigentlichen Problem zu fragen. Wo kommt die Zeichenkette her? Was soll mit ihr geschehen? Warum gelten diese Bedingungen? Beschreib dein Problem, nicht, wie du dir die Lösung vorstellst!



  • Der string sReadMarks kommt aus einer *.db Datei und wird von dort über fstream und getline eingelesen. Dann soll mit dieser Funktion geguckt werden ob nur Zahlen und Leerzeichen enthalten sind.

    Ausserdem war mir klar das isdigit nur chars beurteilen kann, demzufolge muss ich den string in einen char umwandeln.

    Das <b>Problem</b> ist im Code da er egal ob zahlen im string bzw. dann char oder nicht das gleiche ausgibt.


  • Mod

    Storm13000 schrieb:

    Das <b>Problem</b> ist im Code da er egal ob zahlen im string bzw. dann char oder nicht das gleiche ausgibt.

    Nein, du hast das Problem noch gar nicht verstanden! Das ist das Problem:

    Ausserdem war mir klar das isdigit nur chars beurteilen kann, demzufolge muss ich den string in einen char umwandeln.

    string = Zeichenkette! char = Zeichen! Wenn du etwas hast, was Kettenglieder beurteilt, wie wandelst du dann eine Kette in ein Kettenglied um? Das macht gar keinen Sinn!

    Der string sReadMarks kommt aus einer *.db Datei und wird von dort über fstream und getline eingelesen. Dann soll mit dieser Funktion geguckt werden ob nur Zahlen und Leerzeichen enthalten sind.

    Das ist genau die von mir beschriebene Art von Problembeschreibung, mit der wir dir nicht weiterhelfen können, da du beschreibst, wie du dir die Lösung vorstellst, nicht was das eigentliche Problem ist.



  • Ok.

    Das heißt ich muss per schleife jedes zeichen des strings mit isdigit checken?



  • Ja.



  • Wenn ein Leerzeichen von isdigit geprüft wird, dann gibt isdigit 0 aus, oder?


  • Mod

    Storm13000 schrieb:

    Wenn ein Leerzeichen von isdigit geprüft wird, dann gibt isdigit 0 aus, oder?

    Nein, es gibt 0 zurück.



  • Ja.
    Danke für all eure Hilfen, auch wenn meine Fragen echt schlecht gestellt waren!


Log in to reply