compilierungsproblem: cc <=> gcc oder doch anderes problem?



  • lord_bk schrieb:

    ...und ja es lässt sich ganz sicher übersetzen...

    DAS hatte ich auch nicht bezweifelt, sondern:

    lord_bk schrieb:

    ...eigentlich sollte sich das ganze ja problemlos übersetzten lassen...

    und dass ich damit Recht habe, hast Du ja schon bewiesen.

    Gruß,

    Simon2.



  • LordJaxom schrieb:

    Na dann beseitige doch mal die Deprecated-Warnung (wie, steht ja in der Meldung, sogar zwei Möglichkeiten), und zeig dann etwas Code zu den ersten paar Fehlern die übrig bleiben.

    lenjon.h:106:1: warning: null character(s) ignored
    

    Die würde ich auch wegmachen, die haben da nix zu suchen (auch 1999 nicht :D)

    ja gut wenn man die deprecated entfernt ändert sich aber an den restlichen fehlern nichts, die zeile mit dem null char zu löschen ändert ebenfalls nix am rest - fehler bleiben die selben 😞

    source steht unter
    http://bioinfo-pharma.u-strasbg.fr/template/jd/pages/download/fresno.tar.gz

    lg
    lordy



  • nunja, eigentlich sprechen die Fehlermeldungen doch fuer sich:

    hashtmp.h: In member function ‘BOOL chain_list<type>::search(const type&) const’:
    hashtmp.h:11: error: ‘list_node’ was not declared in this scope
    hashtmp.h:11: error: ‘marker’ was not declared in this scope
    hashtmp.h:13: error: ‘head’ was not declared in this scope
    

    Besagt, dass da Namen benutzt werden, die dem Compiler unbekannt sind. Woher die Namen dem Compiler nach Meinung des Codeherstellers bekannt sein sollten, musst du wohl aus dem Quellcode rausfinden

    datalist.h: At global scope:
    datalist.h:21: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, const datalist<type>&)’ declares a non-template function
    datalist.h:21: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
    datalist.h:23: warning: friend declaration ‘std::istream& operator>>(std::istream&, datalist<type>&)’ declares a non-template function
    

    da hat der Programmierer ganz offensichtlich Mist gebaut: die operatoren muessten operator-templates sein (abhaengig von 'type')

    atom_class.h: At global scope:
    atom_class.h:33: error: a class-key must be used when declaring a friend
    atom_class.h:33: error: friend declaration does not name a class or function
    

    da ist an der bezeichneten Stelle wohl eine friend-Deklaration (nicht mehr) standardkonform. Die folgenden "is protected"-Meldungen kommen wohl daher, dass die funktionen wegen der vorangegangenen falschen Deklaration eben kein friend der Klasse sind.
    Am Ende sind da noch die Konvertierungen nach const void* - was auch immer der Programmierer da vorgehabt hat muss man aus dem Quelltext erfahren. Standardkonform wars wohl nicht.

    Dass sich etwas, was damals mit CC uebersetzbar war, heute problemlos mit dem gcc uebersetzen laesst, ist leider utopisch. Gerade in der Zeit vor und kurz nach der Standardisierung hatten verschiedene Compiler diverse Eigenheiten, durch die sie nicht 100% kompatibel sind. Du bist gerade ein Opfer dieser Inkonsistenzen geworden. Auch heutige Compiler bzw. deren mitgelieferte STL-Implementierungen sind nicht immer ganz einig mit dem Standard, angefangen mit Memberfunktionen von STL-Containern die statt void einen Iterator liefern, bis hin zu schauderlichen max und min-Makros, die dem gutglaeubigen User mal eben untergejubelt werden wenn er sie nicht explizit abbestellt. Beispiele wie deins zeigen nur zu deutlich, dass man solche "Features" meist zwar kennen sollte, aber nur um sie bewusst zu vermeiden.



  • Hab mal kurz den Quellcode selbst übersetzt - nen vollständigen Patch zu schreiben habe ich aber keine Lust 😉

    pumuckl schrieb:

    ... Besagt, dass da Namen benutzt werden, die dem Compiler unbekannt sind. Woher die Namen dem Compiler nach Meinung des Codeherstellers bekannt sein sollten, musst du wohl aus dem Quellcode rausfinden

    Da handelt es sich um Member des Basisklassentemplates, die im Lookup vom Standard-C++ nicht berücksichtigt werden (schließlich könnte es eine Spezialisierung der - noch unbekannten - Basisklasse geben, die diese Member nicht enthalten). Das kann größtenteils durch Qualifizierung (a la basistemplate<type>::list_node) gelöst werden.

    pumuckl schrieb:

    ... da ist an der bezeichneten Stelle wohl eine friend-Deklaration (nicht mehr) standardkonform. Die folgenden "is protected"-Meldungen kommen wohl daher, dass die funktionen wegen der vorangegangenen falschen Deklaration eben kein friend der Klasse sind.

    Richtig. Hier fehlt eigentlich nur 'class'.

    pumuckl schrieb:

    Am Ende sind da noch die Konvertierungen nach const void* - was auch immer der Programmierer da vorgehabt hat muss man aus dem Quelltext erfahren. Standardkonform wars wohl nicht.

    Hier schlägt wieder das erste Problem zu: Der Compiler findet bsearch aus dem Basisklassentemplate nicht und versucht deshalb die - bekannte - Definition aus den Standard-Headern heranzuziehen. Auch hier hilft die vollständige Qualifizierung.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • LordJaxom schrieb:

    Hab mal kurz den Quellcode selbst übersetzt - nen vollständigen Patch zu schreiben habe ich aber keine Lust 😉

    pumuckl schrieb:

    ... Besagt, dass da Namen benutzt werden, die dem Compiler unbekannt sind. Woher die Namen dem Compiler nach Meinung des Codeherstellers bekannt sein sollten, musst du wohl aus dem Quellcode rausfinden

    Da handelt es sich um Member des Basisklassentemplates, die im Lookup vom Standard-C++ nicht berücksichtigt werden (schließlich könnte es eine Spezialisierung der - noch unbekannten - Basisklasse geben, die diese Member nicht enthalten). Das kann größtenteils durch Qualifizierung (a la basistemplate<type>::list_node) gelöst werden.

    pumuckl schrieb:

    ... da ist an der bezeichneten Stelle wohl eine friend-Deklaration (nicht mehr) standardkonform. Die folgenden "is protected"-Meldungen kommen wohl daher, dass die funktionen wegen der vorangegangenen falschen Deklaration eben kein friend der Klasse sind.

    Richtig. Hier fehlt eigentlich nur 'class'.

    pumuckl schrieb:

    Am Ende sind da noch die Konvertierungen nach const void* - was auch immer der Programmierer da vorgehabt hat muss man aus dem Quelltext erfahren. Standardkonform wars wohl nicht.

    Hier schlägt wieder das erste Problem zu: Der Compiler findet bsearch aus dem Basisklassentemplate nicht und versucht deshalb die - bekannte - Definition aus den Standard-Headern heranzuziehen. Auch hier hilft die vollständige Qualifizierung.

    danke erst mal für die antworten und sorry die späte antwort aber weihnachtsbedingt bin ich etwas vom computer abgehalten worden 🙂

    das mit der vollständigen qualifizierung durchschau ich nicht ganz, nachdem list_node ein protected member von lnklst ist müsste ich dann statt
    list_node *marker;
    einfach
    lnklst<type>::list_node *marker;
    schreiben?
    stimmt aber scheinbar nicht, weil der compiler dann sagt "'marker' was not declared in this scope"

    sorry aber bei der verwendung von templates schwimm ich irgendwie komplett ...

    thx
    lordy



  • Sorry, das habe ich vergessen zu erwähnen: Da die Basisklasse von einem noch nicht bekannten Typ abhängt, muss man dem Compiler noch sagen, dass list_node ein Typ ist und nicht irgendwas anderes:

    typename lnklst<type>::list_node * marker;
    

    Also typename dazu.



  • LordJaxom schrieb:

    Sorry, das habe ich vergessen zu erwähnen: Da die Basisklasse von einem noch nicht bekannten Typ abhängt, muss man dem Compiler noch sagen, dass list_node ein Typ ist und nicht irgendwas anderes:

    typename lnklst<type>::list_node * marker;
    

    Also typename dazu.

    danke das geht supa 🙂

    damit reduziert sich die fehlerzahl (meiner meinung nach 😉 ) auf 2, die da wären:

    hashtmp.h: In member function ‘BOOL chain_list<type>::search(const type&) const’:
    hashtmp.h:13: error: ‘head’ was not declared in this scope
    hashtmp.h: In member function ‘BOOL chain_list<type>::search(const type&, type&) const’:
    hashtmp.h:23: error: ‘head’ was not declared in this scope
    datalist.h: At global scope:
    datalist.h:20: error: ISO C++ forbids declaration of ‘ostream’ with no type
    datalist.h:20: error: ‘ostream’ is neither function nor member function; cannot be declared friend
    datalist.h:20: error: expected ‘;’ before ‘&’ token
    datalist.h:21: error: ISO C++ forbids declaration of ‘istream’ with no type
    datalist.h:21: error: ‘istream’ is neither function nor member function; cannot be declared friend
    datalist.h:21: error: expected ‘;’ before ‘&’ token
    data_templ.h:18: error: expected constructor, destructor, or type conversion before ‘&’ token
    data_templ.h:28: error: expected constructor, destructor, or type conversion before ‘&’ token
    sort_list_tmp.h: In member function ‘void sort_list<type>::merge(type*, int, int, int, int)’:
    sort_list_tmp.h:33: error: ‘element’ was not declared in this scope
    sort_list_tmp.h:34: error: ‘element’ was not declared in this scope
    sort_list_tmp.h:36: error: ‘element’ was not declared in this scope
    sort_list_tmp.h:37: error: ‘element’ was not declared in this scope
    sort_list_tmp.h:38: error: ‘element’ was not declared in this scope
    sort_list_tmp.h: In member function ‘void sort_list<type>::swap(int, int)’:
    sort_list_tmp.h:47: error: ‘element’ was not declared in this scope
    sort_list_tmp.h: In member function ‘int sort_list<type>::partition(int, int)’:
    sort_list_tmp.h:58: error: ‘element’ was not declared in this scope
    sort_list_tmp.h: In member function ‘virtual void sort_list<type>::sort()’:
    sort_list_tmp.h:84: error: ‘array_size’ was not declared in this scope
    sort_list_tmp.h:85: error: ‘element’ was not declared in this scope
    sort_list_tmp.h:89: error: ‘array_size’ was not declared in this scope
    sort_list_tmp.h:93: error: ‘element’ was not declared in this scope
    searchtmp.h: In member function ‘virtual int searchlist<type>::ssearch(const type&) const’:
    searchtmp.h:10: error: ‘array_size’ was not declared in this scope
    searchtmp.h:11: error: ‘element’ was not declared in this scope
    searchtmp.h: In member function ‘virtual int searchlist<type>::bsearch(const type&) const’:
    searchtmp.h:22: error: ‘array_size’ was not declared in this scope
    searchtmp.h:26: error: ‘element’ was not declared in this scope
    searchtmp.h:30: error: ‘element’ was not declared in this scope
    searchtmp.h: In member function ‘virtual int searchlist<type>::tsearch(const type&) const’:
    searchtmp.h:40: error: ‘array_size’ was not declared in this scope
    searchtmp.h:44: error: ‘element’ was not declared in this scope
    searchtmp.h: In member function ‘virtual int brsearch<type>::search(const type&, int&) const’:
    searchtmp.h:70: error: ‘element’ was not declared in this scope
    searchtmp.h:75: error: ‘array_size’ was not declared in this scope
    searchtmp.h:76: error: ‘element’ was not declared in this scope
    make: *** [scor.o] Fehler 1
    

    der erste teil liegt daran, dass head nicht bekannt ist, definiert ist head in

    lnklst.h

    durch:

    protected:
    list_node *head;

    von lnklst ist dann chain_list abgeleitet:

    hash.h:class chain_list : public lnklst<type>

    aber in

    template <class type>
    BOOL chain_list<type>::search(const type& item) const
    {
      typename lnklst<type>::list_node *marker;
    
      for(marker = head->next; marker && marker->elem != item;
          marker = marker->next) {}
      return marker ? TRUE : FALSE;
    }
    

    kennt er dann head trotzdem nicht 😕
    häts ja sogar versucht es ihm mit lnklst::head vor die nase zu werfen aber geht trotzdem nicht ...

    bei zweiten teil verlangt er einen typ für ostream und istream ... seit wann braucht ein stream einen typ? ich hab gedacht sinn un zweck eines streams ist es beliebige typen reinstopfen zu können??

    friend ostream& operator<<(ostream &out_str, const datalist<type> &out_list);
    

    lg und thx
    lordy



  • lord_bk schrieb:

    damit reduziert sich die fehlerzahl (meiner meinung nach 😉 ) auf 2
    lordy

    und die 2 hab ich auf lösen können - thx noch mal 🙂



  • so jetzt wärm ich den thread doch wieder auf 😃

    kompilieren scheint das teil jetzt zu tun aber beim linken zickt es noch etwas:

    bknapp@nr1Lebt:~/downloads/fresno/fresnoSrc> make
    gcc -O -o fresno fresno.o \
            scor.o connect.o hbon.o hybr.o rngblk.o prune.o geom.o sort.o io.o msi_io.o mm_io.o \
            -lm -L/lib -lmmioc
    /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/bin/ld: cannot find -lmmioc
    collect2: ld returned 1 exit status
    make: *** [fresno] Fehler 1
    

    hab ich mich natürlich gefragt was -lmmioc sein soll, google wirft 7 treffer raus, einer davon ist der source code zum protein viewer rasmol und dort findet sich u.a.

    # -lmmioc required for MMIO
    

    also hab ich mich auf die suche nach MMIO gemacht, das wirft dann als ersten treffer den wiki artikel zu memory-mapped I/O [1] raus. ich denke aber doch dass da was anderes gemeint ist oder? wahrscheinlich eine library die mmio heisst oder? hat da jemand eine ahnung wie ich das hinbekomme?

    lg
    lordy

    [1] http://en.wikipedia.org/wiki/Memory-mapped_IO


Anmelden zum Antworten