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.


  • Mod

    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...


  • Mod

    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? 😉


  • Mod

    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, cols

    public:
    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..


Anmelden zum Antworten