Visual C++ Compilierfehler bei sqrt() error C2668

bra-tak

Neuling
Thread Starter
Mitglied seit
13.05.2008
Beiträge
233
Ort
Hamburg
Hallo,
wollte in Visual C++ 2010 etwa proggen, doch beim Compilieren wurde mir folgender Fheler ausgespuckt:

Code:
1>------ Neues Erstellen gestartet: Projekt: Vektor, Konfiguration: Debug Win32 ------
1>  stdafx.cpp
1>  Vektor.cpp
1>c:\users\martin\documents\visual studio 2010\projects\vektor\vektor\funktionen.h(64): error C2668: 'sqrt': Mehrdeutiger Aufruf einer überladenen Funktion
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(589): kann 'long double sqrt(long double)' sein
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(541): oder "float sqrt(float)"
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(127): oder "double sqrt(double)"
1>          bei Anpassung der Argumentliste '(int)'
1>c:\users\martin\documents\visual studio 2010\projects\vektor\vektor\funktionen.h(65): error C2668: 'sqrt': Mehrdeutiger Aufruf einer überladenen Funktion
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(589): kann 'long double sqrt(long double)' sein
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(541): oder "float sqrt(float)"
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\math.h(127): oder "double sqrt(double)"
1>          bei Anpassung der Argumentliste '(int)'
========== Alles neu erstellen: 0 erfolgreich, Fehler bei 1, 0 übersprungen ==========

Es handelt sich um diesen Programmteil:

Code:
int LaengenB(int c[3],int f[3]) {
    double Laenge_1=sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]);
    double Laenge_2=sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);
    cout << "Die Länge des ersten Vektors beträgt:" << Laenge_1 << endl;
    cout << "Die Länge des zweiten Vektors beträgt:" << Laenge_2 << endl;
    cout << "" << endl;
    return 0;
}

weiß jemand was da schief gelaufen ist?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Das Resultat von c[0]*c[0]+c[1]*c[1]+c[2]*c[2] ist ein int und sqrt() ist an der Stelle laut Fehlermeldung nur für Fließkommaargumente definiert, da aber gleich 3 mal für verschiedene Genauigkeiten überladen. Der Compiler möchte nun wissen welche der 3 verfügbaren Version er nehmen soll, die mit 32 Bit (float), 64 Bit (double) oder 80 Bit (long double) Genauigkeit. Um deine Auswahl festzulegen musst du ihm nur den Typ des Arguments beim Funktionsaufruf entsprechend casten.

Du könntest dir jetzt entweder eine eigene Funktion double sqrt( int ) definieren oder du rufst die sqrt() Funktion gleich mit einem Fließkommaargument auf.

Variante 1:
Code:
inline double sqrt( const int val ) const
{
    return sqrt( (double) val );
}

Variante 2:
Code:
double Laenge_1 = sqrt( (double) c[0]*c[0] + (double) c[1]*c[1] + (double) c[2]*c[2] );

Variante 1 hat den Vorteil, dass du den Aufrufcode nicht ändern musst, sondern einfach nur irgendwo in einem Header diese zusätzliche sqrt() Implementierung brauchst.

Variante 2 hat den u.U. erheblich größeren Vorteil, dass die Multiplikationen und Additionen bereits mit Fließkommazahlen berechnet werden und daher nicht so schnell ein Integerüberlauf eintritt, der in deiner Implementierung z.B. schon passiert wenn c[0] bis b[2] jeweils 30000 sind (Ergebnis>2^31).
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh