Problem mit SparseLib++
-
Sorry dass ich mich so blöd anstelle. Hier nochmal die Datei mvvc.h. In der dann die folgenden Fehlermeldungen auftreten:
29#ifndef _MV_VECTOR_COMPLEX_H
30#define _MV_VECTOR_COMPLEX_H
31
32
33
34#include <stdlib.h>
35// for formatted printing of matrices
36#include <sstream>
37
38
39#ifdef MV_VECTOR_BOUNDS_CHECK
40# include <assert.h>
41#endif
42
43#include "mvvind.h"
44
45// this is really used as a sort of global constant. The reason
46// for creating its own type is that so it can be overloaded to perform
47// a deep or shallow assignement. (Any variable of type MV_Vector_::ref_type
48// has only one possible value: one.)
49// It is included as a seperate file to avoid multiple definitions.
50
51 #include "mvvrf.h"
52
53 class MV_Vector_COMPLEX
54 {
55 protected:
56 COMPLEX p_;
57 int dim_;
58 int ref_; // 0 or 1; does this own its own memory space?
59 public:
60
61
62 /::::::::::::::::::::::::::/
63 / Constructors/Destructors /
64 /::::::::::::::::::::::::::/
65
66 MV_Vector_COMPLEX();
67 MV_Vector_COMPLEX( int);
68 MV_Vector_COMPLEX( int, const COMPLEX&);
69
70
71 MV_Vector_COMPLEX(COMPLEX, int);
72 MV_Vector_COMPLEX(const COMPLEX*, int);
73 MV_Vector_COMPLEX(const MV_Vector_COMPLEX &);
74
75 // reference of an exisiting data structure
76 //
77 // note that ref() is initalized with i rather than 1.
78 // this is so compilers will not generate a warning that i was
79 // not used in the construction. (MV_Vector::ref_type is an enum that
80 // can *only* have the value of 1.
81 //
82 MV_Vector_COMPLEX(COMPLEX* d, int N, MV_Vector_::ref_type i) :
83 p_(d), dim_(N), ref_(i) {}
84
85 MV_Vector_COMPLEX(const MV_Vector_COMPLEX &V, MV_Vector_::ref_type i) :
86 p_(V.p_), dim_(V.dim_), ref_(i) {}
87
88 ~MV_Vector_COMPLEX();Fehler 1 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 56 error C2143: Syntaxfehler: Es fehlt ';' vor '<'
Fehler 2 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 56 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Fehler 3 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 56 error C2238: Unerwartete(s) Token vor ';'
Fehler 4 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 68 error C2062: 'int'-Typ unerwartet
Fehler 5 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 68 error C2238: Unerwartete(s) Token vor ';'
Fehler 6 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 71 error C2143: Syntaxfehler: Es fehlt ')' vor '<'
Fehler 7 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 71 error C2143: Syntaxfehler: Es fehlt ';' vor '<'
Fehler 8 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 71 error C2460: 'MV_Vector_COMPLEX::complex': Verwendet gerade definiertes 'MV_Vector_COMPLEX'
Fehler 9 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 71 error C2059: Syntaxfehler: ')'
Fehler 10 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 71 error C2238: Unerwartete(s) Token vor ';'
Fehler 11 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 72 error C2327: 'MV_Vector_COMPLEX::complex': Ist kein Typname, nicht statisch und kein Enumerator
Fehler 12 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 72 error C2327: 'MV_Vector_COMPLEX::complex': Ist kein Typname, nicht statisch und kein Enumerator
Fehler 19 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2327: 'MV_Vector_COMPLEX::complex': Ist kein Typname, nicht statisch und kein Enumerator
Fehler 20 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2327: 'MV_Vector_COMPLEX::complex': Ist kein Typname, nicht statisch und kein Enumerator
Fehler 21 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2327: 'MV_Vector_COMPLEX::complex': Ist kein Typname, nicht statisch und kein Enumerator
Fehler 22 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2143: Syntaxfehler: Es fehlt ')' vor '<'
Fehler 23 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2143: Syntaxfehler: Es fehlt ';' vor '<'
Fehler 24 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2460: 'MV_Vector_COMPLEX::complex': Verwendet gerade definiertes 'MV_Vector_COMPLEX'
Fehler 25 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2086: 'int MV_Vector_COMPLEX::complex': Neudefinition
Fehler 26 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2059: Syntaxfehler: ')'
Fehler 27 d:\spangler\libraries\sparselib++\sparselib++\1.7\mv\include\mvvc.h 82 error C2334: Unerwartete(s) Token vor ':'; sichtbarer Funktionstext wird übersprungen
-
RobertSp schrieb:
Sorry dass ich mich so blöd anstelle. Hier nochmal die Datei mvvc.h. In der dann die folgenden Fehlermeldungen auftreten:
Der Fehler wirkt sich zwar erst dort aus, liegt aber voraussichtlich an einer ganz anderen Stelle...
"error C2143: Syntaxfehler: Es fehlt ';' vor '<'"
Der Fehler das ein Semikolon fehlt, wird häufig durch ein vergessene Semikolon am Ende einer Klassendeklatation ausgelöst, die vor der entsprechenden Datei gelinkt wird.
-
Und wenn du jetzt auch noch sagen kannst, wo COMPLEX wie definiert wird, dann wirst du dein Problem wahrscheinlich selbst lösen können. Oder falls doch nicht, dann kann jemand hier helfen.
P.S.: Gibt es einen neuen IOCCC? Sieht fast wie ein Beitrag dafür aus

-
Jo das war der Fehler (bzw. compiliert das Programm jetzt zumindest).
Hab in der vecdefs.h die Zeile#define COMPLEX std::complex<double>
vergessen.
Danke fürs Erste...
-
Die Bemerkung mit dem IOCCC-Beitrag war natürlich ironisch gemeint, aber es fehlt nicht viel. Weißt du, was typedef macht?
-
Naja mit dem IOCCC hast schon irgendwie recht...

War nur in Panik, weil ich an dem Problem schon eine Weile rummach und die Abgabe der DA rückt näher!Hab 'ne ungefähre Ahnung davon was typedef macht, bin aber kein Spezialist auf dem Gebiet der Informatik. Oder hat man das schon gemerkt?

-
Ich sag mal so: Mit etwas weniger Makrodefinitionen findet man solche Fehler viel leichter. Für zentrale Definitionen wie du sie mit Makros machst, gibt es dann typedef, const und ein paar andere Sachen.
-
Guten Morgen,
bekomm jetzt beim initialisieren einer Matrix folgende Fehlermeldungen:
Fehler 1 SL++ Kurztest.obj error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CompRow_Mat_double::CompRow_Mat_double(int,int,int,double *,int *,int *,int)" (??0CompRow_Mat_double@@QAE@HHHPANPAH1H@Z)" in Funktion "_wmain".
Fehler 2 SL++ Kurztest.obj error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall MV_Vector_double::~MV_Vector_double(void)" (??1MV_Vector_double@@QAE@XZ)" in Funktion ""public: __thiscall CompRow_Mat_double::~CompRow_Mat_double(void)" (??1CompRow_Mat_double@@QAE@XZ)".
Fehler 3 SL++ Kurztest.obj error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall MV_Vector_int::~MV_Vector_int(void)" (??1MV_Vector_int@@QAE@XZ)" in Funktion ""public: __thiscall CompRow_Mat_double::~CompRow_Mat_double(void)" (??1CompRow_Mat_double@@QAE@XZ)".
Fehler 4 D:\Spangler\MS Visual Studio\SL++ Kurztest\Debug\SL++ Kurztest.exe 1 fatal error LNK1120: 3 nicht aufgelöste externe Verweise.Und der Code dazu:
double val[] = {1.0, 4.0, 5.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0};
int colind[] = {0, 0, 1, 1, 2, 2, 3, 0, 4 };
int rowptr[] = {0, 1, 3, 5, 7, 9};CompRow_Mat_double M(5,5,9,val,rowptr,colind);
int m = M.dim(0), n = M.dim(1);Ist nur der Code aus einer Testdatei, die beim Compilieren unter Cygwin (G++-Compiler) einwandfrei ausgeführt wird.
Fehlt da noch ein Verweis auf eine *.lib? In dem /lib-Ordner von SparseLib++ befinden sich 3 *.a Dateien, die in Cygwin mit dem make-Befehl erstellt worden sind. Muss ich die noch in *.dll-Dateien umwandeln, um sie in VC++ einbinden zu können?
Wenn ja, wie funktioniert so was?
-
du musst die fkt auch definieren und nicht nur deklarieren:
CompRow_Mat_double::CompRow_Mat_double(int,int,int,double *,int *,int *,int)
MV_Vector_double::~MV_Vector_double(void)
etc.den Rest erkennst du jz hoffentlich selbst^^
bb
-
Nein das kann nicht das Problem sein. Die Funktion wird in der Klasse CompRow_Mat_double definiert:
class CompRow_Mat_double {
private:
VECTOR_double val_; // data values (nz_ elements)
VECTOR_int rowptr_; // row_ptr (dim_[0]+1 elements)
VECTOR_int colind_; // col_ind (nz_ elements)int base_; // index base: offset of first element
int nz_; // number of nonzeros
int dim_[2]; // number of rows, colspublic:
CompRow_Mat_double(void);
CompRow_Mat_double(const CompRow_Mat_double &S);
CompRow_Mat_double(const CompCol_Mat_double &C);
CompRow_Mat_double(const Coord_Mat_double &CO);
CompRow_Mat_double(int M, int N, int nz, double *val, int *r,
int *c, int base=0);
CompRow_Mat_double(int M, int N, int nz, const VECTOR_double &val,
const VECTOR_int &r, const VECTOR_int &c,
int base=0);
~CompRow_Mat_double() {};
...
}
-
Abgesehen von Destruktor sind das alles Funktionsdeklarationen..