error LNK2001



  • Hallo zusammen,

    ich bin der Neue 🙂 und gerade dabei mein erstes C++ (VC++ 2010)Programm aufzubauen. Leider erhalte ich zur Laufzeit folgende Fehlermeldung, für die ich einfach keine Lösung finde.

    1>------ Erstellen gestartet: Projekt: UsingRef, Konfiguration: Debug Win32 ------
    1>  MainRef.cpp
    1>  FuncRef.cpp
    1>  Code wird generiert...
    1>FuncRef.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""double hx" (?hx@@3NA)".
    1>C:\Dokumente und Einstellungen\.......\Using Refprop C++\UsingRef\Debug\UsingRef.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Kann mir da evtl. jemand Näheres zu sagen?

    Gruss

    Masl



  • Hast du zufällig irgendwo folgendes in deinem Code stehen?

    extern double hx;
    

    Wenn du auf diese Weise extern benutzt, muss die Variable hx in irgendeiner anderen Übersetzungseinheit als Globale definiert sein. Ansonsten meckert der Linker zurecht über eine fehlende Definition.

    Ach ja, Globale sind normalerweise böse und sollten vermieden werden. Es gibt sicher elegantere Lösungen für deine Anforderung. Zeig doch mal ein wenig Code.



  • Hallo matze,

    vielen Dank für die schnelle Antwort.

    Ich konnte den Fehler eben beheben. Anbei eine etwas abgespeckte Version des Programms (bitte steinigt mich nicht, ich lerne... :)). Mir ist die Variante mit der globalen Variablen auch nicht wirklich sympatisch, aber ich habe bislang keinen anderen Weg gefunden hx an die main zurückzugeben. Vielleicht hast Du da einen Anstoss für mich?

    Header:

    double Refprop(char*, char*, double, double, bool);
    
    extern double hx;
    

    Main.cpp:

    #include <iostream> 
    #include "Header.h"
    #include <string> 
    #include <windows.h>
    #include <stdio.h>
    
    using namespace std;
    
    int main()//(int argc, char* argv[])
    {	
    	char * KM ="R134A.fld";		
    	string strKM (KM);			//string nicht in char* konvertierbar (Lösung suchen)
    	char *Funktion;			//zur Bestimmung welche Refpop-Funktion genutzt werden soll (hier TPFLSH)
    	double h1;					//Variable, welche den ermittelten Wert aufnimmt
    	double Prop1, Prop2;		//Parameter für Ermittlung (hier TP für TPFLSH)
    	bool ctrlKM;				//Kontrolle, ob .fld oder .mix
    	int pos;					
    	pos = strKM.find(".fld");	//String Kältemttel nach .fld durchsuchen
    
    	if (pos == -1)
    	{ctrlKM = false;}
    	else
    	{ctrlKM = true;}	
    
    	Funktion = "EnthalpieTP";
    
    	Prop1 = 50 + 273.15;
    	Prop2 = 10 * 100.00;
    
    	h1 = Refprop(Funktion, KM, Prop1, Prop2, ctrlKM);
    
    	cout << h1 << endl;
    }
    

    Funktion.cpp:

    #include "Header.h"
    #include <Windows.h>
    #include <stdio.h>
    #include "refprop1.h"
    #include <string>
    
    const long refpropcharlength=255;
    const long filepathlength=255;
    const long lengthofreference=3;
    const long errormessagelength=255;
    const long ncmax=20;		// Note: ncmax is the max number of components
    const long numparams=72;
    const long maxcoefs=50;
    
    double Refprop(char* Funktion, char* KM, double Prop1, double Prop2, bool ctrlKM)
    {
    	double hx; //diese Deklaration befand sich vorher innerhalb der if-Anweisung	(if (ctrlKM == true))
    
    	if (ctrlKM == true)	//Wenn Kältemittel .fld
    	{
                //double hx; //vorher war sie hier deklariert, warum hat dies nicht funktioniert??
    	   hx = 20 + 10;
    	}
    	return hx;
    }
    

    Gruß

    Masl



  • Masl schrieb:

    Mir ist die Variante mit der globalen Variablen auch nicht wirklich sympatisch, aber ich habe bislang keinen anderen Weg gefunden hx an die main zurückzugeben.

    Doch, hast du! Du verwendest die Globale doch gar nicht. Du erzeugst deinen Wert in Refprop , und dann nutzt du die Rückgabe dieser Funktion, um den Wert in die main zu bekommen:

    h1 = Refprop(Funktion, KM, Prop1, Prop2, ctrlKM);
    

    Eine Globale hx nutzt du doch gar nicht. Probier's aus. Lösche folgende Zeile:

    extern double hx;
    

    Es sollte sich nichts ändern.



  • Oh...Du hast recht..... 😃 Danke für diese Erkenntnis!

    Eine weitere Frage wäre, wie kann ich mehrere Variablen an main zurückgeben?

    Angenommen Funktion.cpp sieht am Ende so aus:

    if (ctrlKM == true)	//Wenn Kältemittel .fld
    	{
                //double hx; //vorher war sie hier deklariert, warum hat dies nicht funktioniert??
    	   hx = 20 + 10;
                hy = 10 +10;
                hz = 30 + 10;
    	}
    	return hx,hy,hz; //???
    

    Wie übergebe ich es in Main an 3 Variablen?



  • Masl schrieb:

    Wie übergebe ich es in Main an 3 Variablen?

    Eine Funktion kann zwar nur einen Rückgabewert haben, aber es gibt trotzdem mehrere Möglichkeiten.

    Möglichkeit 1 ist, mehrere Werte in einer Variablen zu halten und diese zurückzugeben. Das kann eine Struktur, aber auch std::pair oder was anderes sein. Beispiel:

    struct MultipleValues {
      double hx;
      double hx;
      double hx;
    };
    
    MultipleValues Foo() {
      MultipleValues temp;
      temp.hx=1.;
      temp.hy=2.;
      temp.hz=3.;
      return temp;
    }
    
    MultipleValues myValues=Foo();
    

    Möglichkeit 2 ist call by reference. Du übergibst hier Zeiger oder Referenzen auf Variablen an die Funktion und kannst diese direkt mit Werten füllen. Beispiel:

    //Unsere Funktion nun mit Zeigern)
    void Foo(double *hx, double *hy, double *hz) {
      *hx=1.;  //hier dereferenzieren wir hx und schreiben direkt an die Adresse, auf die hx zeigt)
      *hy=2.;
      *hz=3.;
    }
    
    double hx,hy,hz;
    Foo(&hx, &hy, &hz);  //nach dem Aufruf sind unsere Variablen gefüllt!
    


  • Hallo matze,

    ich bedanke mich recht herzlich für Deine Hilfe! Hat mich wirklich sehr weitergebracht. 👍

    Gruß

    Masl



  • Kein Thema. 🙂 Nur noch ganz kurz: wenn du jetzt anfangen willst, mit Zeigern rumzuhantieren, solltest du dich wirklich mal in die Thematik einlesen. Zeiger bieten viel Raum für (manchmal schwer nachvollziehbare) Fehler. Man sollte wissen, was man tut, sonst bleibt man immer wieder hängen und weiß nicht, warum.



  • Ich muß diesen beitrag nochmal rauskramen.

    Ich habe versucht die Zeigerthematik etwas weiterzuführen.

    Dabei bin ich als Grundlage von matze's Bsp ausgegangen.

    Header:

    void Foo(double,double,double);
    

    Funktion.cpp:

    #include "zeiger.h"
    //Unsere Funktion nun mit Zeigern)
    //double Foo(*double,*double,*double);
    void Foo(double *hx, double *hy, double *hz)
    {
    *hx=1.; //hier dereferenzieren hx und schreiben direkt an die Adresse, auf die hx zeigt)
    *hy=2.;
    *hz=3.;
    }

    Main.cpp:

    #include "zeiger.h"
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	double hx,hy,hz; 
    	Foo(&hx, &hy, &hz);  //nach dem Aufruf sind unsere Variablen gefüllt! 
    	cout<<hx<<endl;
    	cout<<hy<<endl;
    	cout<<hz<<endl;
    
    	return 0;
    }
    

    Ausgabe:

    1>------ Erstellen gestartet: Projekt: foo, Konfiguration: Debug Win32 ------
    1>  zeiger.cpp
    1>c:\......\test c++\foo\zeiger.cpp(10): error C2664: 'Foo': Konvertierung des Parameters 1 von 'double *' in 'double' nicht möglich
    1>          Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Was mache ich falsch, habe nun schon mehrere Varianten durch und komme zu keinem Ergebnis.

    Gruß

    Masl



  • Für Interessierte....der Fehler lag hier:

    Header:

    void Foo(double*,double*,double*);
    


  • Heute knabberst du an so einem Fehler noch eine Stunde. Wenn du erst ein wenig Routine hast, brauchst du nur noch 10 Sekunden für sowas. Es ist beim Programmieren sehr wichtig, dass man lernt, die Fehlermeldungen richtig zu lesen (Anfänger unterschätzen dieses Wissen leicht). Dann wird es schnell klar:

    Er möchte double* in double konvertieren. Warum?
    => Möchte ich denn double* übergeben? Ja.
    => Wie ist die Funktion definiert? Sie nimmt double-Parameter! *kopfklatsch* *problemlös* *freu* 😉


Anmelden zum Antworten