Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verwendung überladener Mathemetikfunktionen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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)?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.04.2005, 07:59 Uhr
doppler



Wie es aussieht, gibt es in cmath keine Funktion pow(long unsigned int,short unsigned int), sondern nur die Funktionen, die beim Fehler ausgegeben werden. Der Compiler könnte also beide int in float/double/long double umwandeln, oder nur das erste, hat also insgesamt sechs verschiedene pow-Funktionen zur Auswahl, deshalb beschwert er sich auch wegen Mehrdeutigkeit.

In diesem Fall musst du den Cast explizit angeben, wie du ja schon richtig erkannt hast.

Dieser Post wurde am 20.04.2005 um 08:00 Uhr von doppler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: