000
19.04.2005, 20:16 Uhr
kip
|
hi,
ich habe von VC++ auf Eclipse+CDT+MinGW gewechselt außerdem verwende ich jetzt cmath statt math.h
ich bin hier auf folgendes problem gestoßen:
wenn ich für meine 2 i-variablen im code ganzzahlige datentypen verwende char || short || int || long und diese der Funktion pow unkonvertiert übergebe meldet mir der compiler mehrdeutigkeit verwende ich dagegen float || double || long double kann er dies einwandfrei auflösen
wieso ist das so ? nach welchen regeln geht der compiler vor? heißt das, dass man wenn man nur irgendwelche datentypen zur verfügung hat meißt händisch die richtige überladung wählen muss?
ein testprogramm:
C++: |
#include<iostream> #include<cmath>
int main(int argc,char* argv[]) { long r=0; unsigned long i=2; unsigned short ii=3; r=std::pow(i,ii); std::cout<<"Result:"<<r<<std::endl;
//offered overloads: r=(long) std::pow(double(i),int(ii));//returns double std::cout<<"Result:"<<r<<std::endl; r=(long) std::pow(float(i),float(ii));//returns float std::cout<<"Result:"<<r<<std::endl; r=(long) std::pow(float(i),int(ii));//returns float std::cout<<"Result:"<<r<<std::endl;
r=(long) std::pow((long double)(i), int(ii));//returns long double std::cout<<"Result:"<<r<<std::endl; r=(long) std::pow((long double)(i),(long double)(ii));//returns long double std::cout<<"Result:"<<r<<std::endl; }
|
**** Schrittweise Erstellung von Konfiguration Debug für Projekt querytree ****
mingw32-make -k all Datei wird erstellt: ../querytreetest.cpp g++ -O0 -g3 -Wall -c -fmessage-length=0 -oquerytreetest.o ../querytreetest.cpp ../querytreetest.cpp: In function `int main(int, char**)': ../querytreetest.cpp:22: error: call of overloaded `pow(long unsigned int&, short unsigned int&' is ambiguous <internal>:0: note: candidates are: double std::pow(double, double) c:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cmath:345: note: float std::pow(float, float) c:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cmath:349: note: long double std::pow(long double, long double) c:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cmath:353: note: double std::pow(double, int) c:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cmath:357: note: float std::pow(float, int) c:/Programme/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/cmath:361: note: long double std::pow(long double, int) mingw32-make: *** [querytreetest.o] Error 1 mingw32-make: Target `all' not remade because of errors. Erstellung für Projekt querytree ist abgeschlossen
da fällt mir noch was ein: man kann die klammerung bei der typenkonvertierung um den typ oder den ausdruck machen. bei mehrteiligen typennamen ist eine klammer um den typ klarerweise unbedingt notwendig aber bei einteiligen typennamen? ist das reine geschmackssache? ohne klammer funktioniert es nicht!
und der typ int : System Name Größe ANSI C int 2 Byte IBM PC MS-DOS und Win3.1 int 2 Byte Macintosh Metrowerks CW int 4 Byte Win98/2000/NT/XP int 4 Byte Linux int 4 Byte Quelle:www.pronix.de/pronix-659.html
short 2Byte; long 4Byte warum verwendet man nicht long / warum wird int so häufig verwendet (siehe funktionsüberladungen)? |