c++ compiler



  • hi, hab eine allgmeine Frage

    Ich hab ein Prjokt in c++ gekriegt, welches ca. 4 - 6 Jahre alt ist. Es lief unter unix und linux. Jetzt funktioniert es mit dem neuen kompiler nicht. Meine frage ist ob man dem neuen Kompiler irgendwie sagen kann, dass er den standart vom alten verwendet?



  • Vor 4-6 Jahren war C++98 aktuell, wie heute auch (bis auf die Ergänzungen von 2003 und 2006).

    Sprich: Es gibt keinen alten Standard, zu dem man umschalten könnte. Du wirst den Code portieren müssen.



  • was heisst portieren?
    sry bin ziemlich neu in dem gebiet



  • Meine frage ist ob man dem neuen Kompiler irgendwie sagen kann, dass er den stan**** vom alten verwendet?

    Nicht der Stanard war alt, sondern der Kompiler war nicht Standard Konform (bzw. weniger als heute).

    Simon



  • bladeexx schrieb:

    was heisst portieren?
    sry bin ziemlich neu in dem gebiet

    Es heisst: Alle Fehler im Source Code und den Projekteinstellungen bereinigen, damit der Code wieder kompilierbar und lauffähig wird.



  • angenommen du verwendest gcc, findest du in der doku z. bsp. folgendes:
    C Dialekt Einstellungen
    C++ Dialekt Einstellungen



  • könnt ihr mir bitte bei einem beispiel helfen?



  • wie jetzt ein beispiel...?
    wir haben ja deinen source code nicht...

    poste doch die probleme die du hast.



  • bladeexx schrieb:

    könnt ihr mir bitte bei einem beispiel helfen?

    Der war gut, wirklich 😃

    Ok, das hier ist ein Beispiel für gültigen C++98-Code:

    int main() {}
    


  • ich versuche z.b. aus dem vector.cpp und den headern eine objektdatei zu kompilieren.

    dann kommt folgendes Fehler:

    vector.h:21: error: expected ',' or '...' before '&' token
    vector.h:21: error: ISO C++ forbids declaration of 'matrix' with no type
    vector.cpp:41: error: prototype for 'vector::vector(const matrix&)' does not match any in class 'vector'
    vector.h:21: error: candidates are: vector::vector(int)
    vector.cpp:29: error:                 vector::vector(unsigned int, const double*)
    vector.cpp:16: error:                 vector::vector(unsigned int, double)
    vector.h:18: error:                 vector::vector(const vector&)
    vector.h:17: error:                 vector::vector()
    make: *** [vector.o] Fehler 1
    
    der dazu gehörige teilcode sieht wie folg aus:
    

    #ifndef _VECTOR_H_
    #define _VECTOR_H_

    // Klasse vector
    //
    // Mathematischer Vektor
    // - double-Elemente
    // - grundlegende Vektoroperationen

    class vector
    { friend class matrix;

    public:
    double* element; // double-Pointer zum internen speichern der Elemente
    unsigned int n; // Dimension des vectors

    vector() :element(0), n(0) {} // Standard-Constructor
    vector(const vector& v) :element(0) {*this=v;} // Copy-Constructor
    vector(const unsigned int l, const double initval=0.0); // Constructor: Dimension und Anfangswerte vorgebbar
    vector(const unsigned int, const double []); // Constructor: double-array dem vector zuweisen
    vector(const matrix& mat); // Constructor: matrix dem vector zuweisen
    ~vector() {if(element) delete[] element;} // Destructor

    double& operator[](const unsigned int); // Elementzugriffs-Operator
    const double operator[](const unsigned int) const; // Elementzugriffs-Operator f?r konstanten Objekt
    double* return_satz() {return element;} // gibt vector als double-array zur?ck



  • normalerweise wenn man die cpp datei und die header hat müsste er doch zu einer objektdatei kompilieren oder?



  • Gib Dir doch bitte etwas mehr Mühe, wenn Du Hilfe willst!

    1. Ich sehe Fehler aus vector.cpp, ich sehe aber vector.cpp nicht.
    2. Sollen wir die Zeilennummern selbst durchzählen?
    3. Benutze CPP-Tags, dann bleibt auch die Struktur erhalten.

    Und je länger ich darüber nachdenke, desto mehr komme ich mir verarscht vor. Ich erinnere mich genau daran, gestern oder vorgestern einen Beitrag mit folgendem Wortlaut geschrieben zu haben:

    "Ich habe eine Vermutung: Früher (sprich: bei nicht-konformen Compilern) waren Friend-Deklarationen oft gleichzeitig Forward-Deklarationen. Das ist jetzt nicht mehr der Fall. Setze mal vor die Zeile "class vector" eine neue Zeile "class matrix;" (ohne "", versteht sich).".

    EDIT:
    Ok, das war im C++/CLI-Forum, wo Du darauf hingewiesen wurdest, es hier zu versuchen. Trotzdem könntest Du die Antworten mal durchlesen, die man Dir gibt.



  • ich hab gestern ausversehen in falschen forum mein problem geschrieben sry.
    hab das aber auch ausprobiert mit dem class matrix hat aber nicht funktioniert.

    sry mit meinem beitrag, kenne mich mit foren nicht sogut aus.

    EDIT:
    wie mache ich das mit diesen CPP-tags


  • Mod

    Eine friend-Deklaration (allein) macht den Namen nicht im umliegenden Namensraum sichtbar, und das ürfte ohne Weiteres etwas sein, was durch ältere Compiler nicht richtig umgesetzt wird (ich bin ziemlich sicher, dass es in prä-Standard C++ anders war).
    Die Klasse matrix muss folglich im Namensraum deklariert werden, bevor die Deklaration des entsprechenden Konstruktors erfolgt. Ob die friend-Deklaration damit überflüssig wird (weil von den friend-Privilegien kein Gebrauch gemacht wird), ist aus dem gezeigten Code nicht erkennbar.
    Es muss also die Deklaration

    class matrix;
    

    vor der Klassendefinition eingefügt werden (das würde im Übrigen den alten Compiler nicht stören).



  • ok danke!



  • Hätte da noch eine Frage, wie gesagt bin ziemlich neu auf dem Gebiet und würde mich über jede Hilfe freuen.

    Der Code sieht folgends aus:

    #ifndef _strings_
    #define _strings_
    
    #include <iostream> 
    class stringc {		// in allen Dateien string in stringc umbenannt
      char *s;
      int   l;
      char *sep;
      char *tk;
      int   tp;
    public:
      stringc substr(int pos, int len);
      stringc substr(int pos, int len) const { return ((stringc)*this).substr(pos, len); };
      int search(int, int, const char*, int = -1) const;
      int search(int, int, char) const;
      long double toDouble(bool ns = false) const;
      int toDoubleLength(bool ns = false) const;
    public:
      stringc();
      stringc(const char);
      stringc(const char *);
      stringc(const stringc &);
      ~stringc();
    
      stringc& operator=(const char);
      stringc& operator=(const char *);
      stringc& operator=(const stringc &);
    
      friend stringc operator+(const stringc &, const stringc &);
    
      stringc& operator+=(char);
      stringc& operator+=(const char *);
      stringc& operator+=(const stringc &);
    
      char& operator[](int i);
      const char& operator[](int i) const;
    
      friend const char *pointer(const stringc &a) { return(a.s); };
    
      friend std::ostream& operator<<(std::ostream&, const stringc &);
      friend std::istream& operator>>(std::istream&, stringc &);
    
      friend operator==(const stringc &x, const char *s);
      friend operator==(const stringc &x, const stringc &y);
      friend operator!=(const stringc &x, const char *s);
      friend operator!=(const stringc &x, const stringc &y);
    
      friend stringc upcase(const stringc &);
      friend stringc downcase(const stringc &);
      int length() const { return(l); };
    
      friend stringc str(const double v);
      friend stringc spstr(const double v);
      friend long double sval(const stringc &s) { return s.toDouble(true); };
      friend int svallen(const stringc &s) { return s.toDoubleLength(true); };
      friend long double val(const stringc &s) { return s.toDouble(); };
      friend int vallen(const stringc &s) { return s.toDoubleLength(); };
    
      stringc token();
      int token(const stringc &s);
      int next();
    
      int index(char c, int startpos = 0) const    
        { return search(startpos, l, c); };
      int index(const stringc& y, int startpos = 0) const     
        { return search(startpos, l, y.s, y.l); };
      int index(const char* t, int startpos = 0) const 
        { return search(startpos, l, t); };
      int contains(const stringc &x) const
        { return(index(x) >= 0); };
    
      stringc at(int pos, int len)    { return(substr(pos,len)); };
      stringc before(int pos)         { return(substr(0,pos)); };
      stringc before(const stringc &x) { return(substr(0,index(x))); };
      stringc before(const stringc &x) const { return(substr(0,index(x))); };
      stringc after(int pos)          { return(substr(pos+1,l-pos)); };
      stringc after(const stringc &x)  
        { int p = index(x); return(substr(p+x.l, l-p-x.l)); };
      stringc through(const stringc &x)
        { return(substr(0,index(x)+x.l)); };
      stringc from(const stringc &x)
        { int p = index(x); return(substr(p, l-p)); };
    
      void error(const char *) const;
    };
    
    #endif
    

    und die Fehlermeldung dazu ist folgends

    strings.h:44: error: ISO C++ forbids declaration of 'operator==' with no type
    strings.h:45: error: ISO C++ forbids declaration of 'operator==' with no type
    strings.h:46: error: ISO C++ forbids declaration of 'operator!=' with no type
    strings.h:47: error: ISO C++ forbids declaration of 'operator!=' with no type
    

    Ich danke schon im Vorauss



  • bool



  • d.h. es wird erwartet das auf beiden seiten typ boolean ist oder verstehe ich das falsch



  • rückgabetyp



  • hmm sry verstehe leider nicht was muss ich da machen, das was in klammern steht zum typ bool machen?


Log in to reply