1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

g++ abs Probleme

Dieses Thema im Forum "OS X-Developer" wurde erstellt von daniel.macbook, 24.09.08.

  1. daniel.macbook

    daniel.macbook Transparent von Croncels

    Dabei seit:
    09.01.07
    Beiträge:
    313
    Hallo zusammen,

    habe ein Programm geschrieben, in welchem ich auch die Funktion abs benutze, um aus einer double Zahl den absoluten Betrag zu bekommen. Das Skurrile an der Sache ist, dass ich den Code unter Solaris kompilieren kann, aber nun unter Mac OS X mit i686-apple-darwin8-g++-4.0.1 geht dies nicht, da bekomme ich für die Funktion abs folgende Fehlermeldung:

    gpspres.cpp: In function ‘int main(int, char**)’:
    gpspres.cpp:218: error: call of overloaded ‘abs(double&)’ is ambiguous

    Kann mir da jemand weiterhelfen?

    Gruß,
    daniel

    math.h, fstream,exception, iostream, string und stdexcept werden eingebunden.
     
  2. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Etwas mehr Beispielcode wäre schön

    Ich würde es aber mal fabs versuchen

    Alex
     
  3. CamDam

    CamDam Doppelter Prinzenapfel

    Dabei seit:
    15.06.08
    Beiträge:
    439
    du darfst nur int oder long uebergeben
     
  4. CamDam

    CamDam Doppelter Prinzenapfel

    Dabei seit:
    15.06.08
    Beiträge:
    439
    int myAbs (double d) {
    if (d<0) d = d * (-1);
    return ((double)(d-(int)d)>=.5) ? ((int) d+1) : ((int) d);
    }
     
    #4 CamDam, 25.09.08
    Zuletzt bearbeitet: 25.09.08
  5. daniel.macbook

    daniel.macbook Transparent von Croncels

    Dabei seit:
    09.01.07
    Beiträge:
    313
    Vielen Dank für eure Antworten. Ich habe gestern die Lösung gefunden, ich muss statt abs(int i) die Funktion fabs (double x) benutzen. Komisch ist nur, dass der Quellcode unter Solaris auch mit abs funktioniert hat.

    Gruß,
    daniel
     
  6. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Falls ich es mal schaffe, Solaris unter VMWare zu installieren kuck ich mir mal deren abs an

    Alex
     
  7. CamDam

    CamDam Doppelter Prinzenapfel

    Dabei seit:
    15.06.08
    Beiträge:
    439
    pass mit den Kommastellen auf.
    Kannst ja mal testen mit 1,444...49
     
  8. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    In Cocoa gibt es ja NSDecimalNumber mit definierbarem rundungsverhalten.

    Ich weiss nicht, was die entsprechende (IEEE 754 ?) Bibliothek für C ist.

    Alex
     
  9. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
  10. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    @tjp:

    Sehe ich es dann richtig, dass dies nur bedeuten kann dass der TE eine alte Solaris Version hat und sich OS X hier standardkonform verhält?

    Alex
     
  11. daniel.macbook

    daniel.macbook Transparent von Croncels

    Dabei seit:
    09.01.07
    Beiträge:
    313
    Ja, kann man so sehen. Aber es hat mich natürlich schon gewundert.....
     
  12. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Also, ich habe mir die Sache nochmals genauer angesehen. ISO 14882:2003 besagt
    Dann folgen die Definitionen für diverse Funktionen unter anderem abs() mit diversen Typen. Wichtig ist hierbei zu erwähnen, daß alle Definitionen in <cmath> und <cstdlib> im Namensbereich std erfolgen und nicht im globalen Namensraum. Das kann man unter der Einleitung zur Standard Library lesen
    Folgendes Programm reproduziert das Problem unter 10.4 mit g++ 4.0.1
    Code:
    #include <math.h>
    
    #include <ostream>
    #include <iostream>
    
    using namespace std;
    
    int main () {
            double x (-5.5);
            double y (abs(x)); // hier sollte/wird ISO konform nur int abs(int) aufgerufen
    
            std::cout << "abs(" << x << ") = " << y << "\n";
    }
    Was zu folgender Fehlermeldung führt
    Code:
    abs.cc: In function 'int main()':
    abs.cc:10: error: call of overloaded 'abs(double&)' is ambiguous
    /usr/include/stdlib.h:145: note: candidates are: int abs(int)
    /usr/include/c++/4.0.0/cstdlib:169: note:                 long long int __gnu_cxx::abs(long long int)
    /usr/include/c++/4.0.0/cstdlib:130: note:                 long int std::abs(long int)
    
    Kommentiert man das "using namespace std" aus compiliert der Code und liefert das zu erwartende Ergebnis "int abs(int)" wird benutzt.

    Das mathematisch richtige Verhalten erhält man dagegen, wenn man folgendes Programm nimmt.
    Code:
    #include <cstdlib>
    #include <cmath>
    #include <ostream>
    #include <iostream>
    
    using namespace std;
    
    int main () {
            double x (-5.5);
            double y (abs(x));
            int a  (-5);
            int b (abs(a));
    
            std::cout << "abs(" << a << ") = " << b << "\n";
            std::cout << "abs(" << x << ") = " << y << "\n";
    }
    Die vorher geposteten Links zu dem Solaris Compiler legen zwar nahe, daß auch in <math.h> und <stdlib.h> die Erweiterungen deklariert werden, aber wie man an der ISO Norm sieht, ist dies wohl nicht korrekt. Warum unter MacOS X das Programm mit einem "using namespace std" nicht mehr compiliert, obwohl ISO 9899 davon nichts besagt ist wunderlich. Ohne dieses Statement compiliert das Programm mit dem von C bekanntem Verhalten. Das mathematisch richtige Verhalten erhält man, wenn man das Programm mit den C++ Headern compiliert. Was auch aus anderen empfehlenswert ist.
     
  13. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Hach, was bin ich froh, mit dieser Sprache, die offenkundig nur Selbstzweck sein kann, nichts mehr zu tun zu haben …
     
  14. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Irrtum! C macht den Ärger und das benutzt du immer noch.
     
  15. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Ich schlage mich mit C-Namespaces herum? Ist mir jetzt soooo noch gar nicht aufgefallen.
     
  16. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Ich würde es gerne auch nicht mehr benutzen wollen, nur leider ist Systemprogrammierung mit POSIX Bestandteil meines Studienganges.
     
  17. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    In C schlägst du dich mit impliziten Verlust behafteten Konversionen von "double" nach "int" herum, die hier ursächlich für das Problem sind. Das "ambiguous overload" ist ein deutlicher Hinweis, daß es hier im Gebälk kracht. Wenn man die C++ Header verwendet, dann löst sich das Problem wie gezeigt in Wohlgefallen auf, und der Compiler verwendet die mathematisch korrekte Funktion. Ergo, keine C-Altlasten nutzen und C++ programmieren!

    P.S. Bei Objective-C mußt du dich weiterhin mit dem C-Altlasten herumschlagen.
     
  18. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Nö, bei C kenne ich die einfachen Typisierungsregeln und habe mit Overloading, Namespaces und dergleichen Dinge, die irgendwie dann doch nie richtig funktionieren nichts am Hut. Ich muss auch nicht Ewigkeiten nachlesen.

    C alleine kennt diese Probleme nicht.
    C in Objective-C kennt diese Probleme nicht.
    C in C++ kennt diese Probleme.

    Du hast die Ursache in C gut ausgemacht. Sieht man sofort.

    Ich denke, ob deines religiösen Eifers ist aber eine weitere Diskussion sinnlos. Eher bekehre ich den Papst zum Islam.
     
  19. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.250
    Sehr schön, wenn dir diese Fehler nicht mehr unterlaufen. Aber du gehörst zu den wenigen Freaks die C in Relation zu strenger typisierten Programmiersprachen und Objective-C gegenüber Smalltalk bevorzugen.
     
  20. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Hmm,
    Carbon wird über kurz oder lang verschwinden.
    Cocoa ist ein ObjektiveC Framework.

    Man kommt doch gar nicht mehr als Mac Entwickler drumherum Objektive C zu nutzen.

    Ich bin mit Java groß geworder, was für mich, im Hinblick auf Objective C und C++, als "Spiel und Spaß" Sprache daherkommt.
     

Diese Seite empfehlen