vector Funktionsdeklaration mit MS Visual C++ 6.0
-
Hi,
ich habe ein Problem eine Memberfunktion einer Klasse zum Laufen zu bringen.
Ich benutze Microsoft Visual C++ 6 und will einen Vektor aus der Standardbibliothek per call by reference einer Funktion zu übergeben.
Über dem klassischen Weg mit Memberfunktion hinzufügen klappt es nicht (MS V 6 erkennt es glaub ich nicht) und über selbst schreiben leider auch nicht, bekomme diese Fehlermeldung:
OberflaechentemperaturDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: bool __thiscall COberflaechentemperaturDlg::GraphLesen(class std::vector<double,class std::allocator<double> > &,class std::vector<double,class std::allocator<
double> > &)" (?GraphLesen@COberflaechentemperaturDlg@@QAE_NAAV?allocator@N@std@@@std@@0@Z)Zur besseren Veranschaulichung hier nochmal die Funktionsdeklaration:
bool GraphLesen(std::vector<double> & xwerte, std::vector<double> & ywerte);
Am liebsten würde ich diese Funktion zum Laufen kriegen:
// bool GrafLesen(CString file, std::vector<double>& abszisse, std::vector<double>& ordinate);
Die notwendigen Standardbibliotheken habe ich natürlich im Header meiner Klasse eingefügt.
Hoffe Euch fällt etwas ein und ich musss mein Compiler nicht ändern.
-
Hallo,
und wie sieht die Definition der GraphLesen-Funktion aus? Der Fehler besagt schließlich, dass eine Definition nicht gefunden wird.
MfG,
Probe-Nutzer
-
Nein, der Fehler sagt, dass die *Implementierung* nicht gefunden wurde... also zeige die Implementierung...
-
Hallo,
Jochen Kalmbach schrieb:
Nein, der Fehler sagt, dass die *Implementierung* nicht gefunden wurde... also zeige die Implementierung...
Darf ich zitieren:
Die Definition einer Funktion bezeichnet man auch als Implementierung
Nicht nur ich verwende also gerne beides austauschbar
Oder verwechselst du hier Deklaration (deklariert ist die Funktion offensichtlich) mit Definition?
Ein fehlende oder im Vergleich zur Deklaration abweichende Definition führt zu LNK2001...
MfG,
Probe-Nutzer
-
Ich geb Dir recht.... also doch die Implementierung
-
Danke für die Antworten, war leider offline, da mein Router abgeschmiert ist.
Hier die Definition meiner Klasse:
// OberflaechentemperaturDlg.h : Header-Datei // #include <fstream> #include <vector> #include <string> //{{AFX_INCLUDES() #include "msflexgrid.h" //}}AFX_INCLUDES #if !defined(AFX_OBERFLAECHENTEMPERATURDLG_H__D950A155_7EC4_4283_ACCD_22F0E8886A96__INCLUDED_) #define AFX_OBERFLAECHENTEMPERATURDLG_H__D950A155_7EC4_4283_ACCD_22F0E8886A96__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class COberflaechentemperaturDlg : public CDialog { // Konstruktion public: int GenID(int m_iRow, int m_iCol); bool GraphLesen(std::vector<double> & xwerte, std::vector<double> & ywerte); // bool GrafLesen(CString file, std::vector<double>& abszisse, std::vector<double>& ordinate); COberflaechentemperaturDlg(CWnd* pParent = NULL); // Standard-Konstruktor // Dialogfelddaten //{{AFX_DATA(COberflaechentemperaturDlg) enum { IDD = IDD_OBERFLAECHENTEMPERATUR_DIALOG }; CMSFlexGrid m_fgValue; double m_dAir; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(COberflaechentemperaturDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: HICON m_hIcon; // Generierte Message-Map-Funktionen //{{AFX_MSG(COberflaechentemperaturDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnBload(); afx_msg void OnBcalc(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein. #endif // !defined(AFX_OBERFLAECHENTEMPERATURDLG_H__D950A155_7EC4_4283_ACCD_22F0E8886A96__INCLUDED_)
und dann habe ich auch noch die Implementierung hier, wobei er diese gar nicht erst ausführt:
bool GraphLesen(std::vector<double> & xwerte, std::vector<double> & ywerte) { using namespace std; const CString file="Stoffwerte.txt"; fstream fsattdampftafel; double xwert,ywert; CString wandler; fsattdampftafel.open(file,fstream::in); while(!fsattdampftafel.eof()){ fsattdampftafel >> xwert >> ywert; xwerte.push_back(xwert); ywerte.push_back(ywert); } if (xwerte.size()>0) return true; else return false; }
und mein Funktionsaufruf bei gedrücktem Button
void COberflaechentemperaturDlg::OnBcalc() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen using namespace std; CString wandler; vector<double> xwerte, ywerte; if(GraphLesen(xwerte,ywerte)) { m_fgValue.SetRows(xwerte.size()+1); for (int i=0;i!=xwerte.size();i++){ wandler.Format("%.1lf",xwerte[i]); m_fgValue.SetTextArray(GenID(i+1,0),wandler); wandler.Format("%.3lf",ywerte[i]); m_fgValue.SetTextArray(GenID(i+1,1),wandler); } } UpdateData(false); }
Sinn des ganzen,aus einer Datei x und ywerte auslesen, um diese in einer Tabelle auszugeben, wobei ich den Datencontainer vector für weitere Berechnungen benötige, daher ist es emminent wichtig die Funktion mit call by reference aufzurufen.
PS: habe die Deklaration einfach so in den Header geschrieben, vielleicht kann MS Visual deshalb die Definition nicht finden?
Danke für eure Hilfe
-
COberflaechentemperaturDlg::GraphLesen(std::vector<double> & xwerte, std::vector<double> & ywerte)
-
EOP schrieb:
COberflaechentemperaturDlg::GraphLesen(std::vector<double> & xwerte, std::vector<double> & ywerte)
versteh nicht, was damit gemeint ist?
-
Danke
war echt ein sau blöder Fehler. Man da kann man sich nur über sich selber ärgern.