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*