• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

g++ abs Probleme

daniel.macbook

Uelzener Rambour
Registriert
09.01.07
Beiträge
369
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.
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Etwas mehr Beispielcode wäre schön

Ich würde es aber mal fabs versuchen

Alex
 

CamDam

Doppelter Prinzenapfel
Registriert
15.06.08
Beiträge
439
du darfst nur int oder long uebergeben
 

CamDam

Doppelter Prinzenapfel
Registriert
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);
}
 
Zuletzt bearbeitet:

daniel.macbook

Uelzener Rambour
Registriert
09.01.07
Beiträge
369
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
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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.

Falls ich es mal schaffe, Solaris unter VMWare zu installieren kuck ich mir mal deren abs an

Alex
 

CamDam

Doppelter Prinzenapfel
Registriert
15.06.08
Beiträge
439
pass mit den Kommastellen auf.
Kannst ja mal testen mit 1,444...49
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
In Cocoa gibt es ja NSDecimalNumber mit definierbarem rundungsverhalten.

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

Alex
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
@tjp:

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

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
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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?
Also, ich habe mir die Sache nochmals genauer angesehen. ISO 14882:2003 besagt
Zu <cmath> und <cstdlib>
26.5 §2
The contents of these headers are the same as the Standard C library headers <math.h> and
<stdlib.h> respectively, with the following additions:
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
17.4.1.2 §4
Except as noted in clauses 18 through 27, the contents of each header cname shall be the same as that of the corresponding header name.h, as specified in ISO/IEC 9899:1990 Programming Languages C (Clause 7), or ISO/IEC:1990 Programming Languages—C AMENDMENT 1: C Integrity, (Clause 7), as appropriate, as if by inclusion. In the C++ Standard Library, however, the declarations and definitions (except for names which are defined as macros in C) are within namespace scope (3.3.5) of the namespace std.
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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 …
 

Jamsven

London Pepping
Registriert
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.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Ich schlage mich mit C-Namespaces herum?
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.
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Nö, bei C kenne ich die einfachen Typisierungsregeln
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.
 

Jamsven

London Pepping
Registriert
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.