Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - error C2668: 'sin': chiamata ambigua a funzione in overload. Come risolvo?
Forum - C/C++ - error C2668: 'sin': chiamata ambigua a funzione in overload. Come risolvo?

Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 10:38
Giovedì, 15/07/2010
Ciao a tutti.
Nel mia applicazioncina c++ devo fare quest'operazione:

Codice sorgente - presumibilmente C/C++

  1. int k[64];
  2. for (int i=0;i<=63;i++)
  3.      k[i] = floor(abs(sin(i+1)) * pow(2,32));



di per se la sintassi dovrebbe essere giusta, tuttavia il compilatore mi restituisce questi errori (sia sul seno che sulla potenza):


(39) : error C2668: 'sin': chiamata ambigua a funzione in overload
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(577): potrebbe essere 'long double sin(long double)'
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(529): o 'float sin(float)'
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(124): o 'double sin(double)'
        durante la ricerca di corrispondenza con l'elenco di argomenti '(int)'
(39) : error C2668: 'pow': chiamata ambigua a funzione in overload
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(575): potrebbe essere 'long double pow(long double,int)'
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(527): o 'float pow(float,int)'
        E:\Programmi\Microsoft Visual Studio 9.0\VC\include\math.h(489): o 'double pow(double,int)'
        durante la ricerca di corrispondenza con l'elenco di argomenti '(int, int)'


Cosa vuol dire? Come potrei risolvere?
Grazie mille dell'aiuto

PM Quote
Avatar
gio97 (Ex-Member)
Guru


Messaggi: 715
Iscritto: 25/04/2009

Segnala al moderatore
Postato alle 10:55
Giovedì, 15/07/2010
Beh, sin e pow sono in overload: ce ne sono di tre tipi, rispettivamente con argomenti long double, double e float, nella funzione pow il secondo argomento è poi un int.
La chiamata a funzione tu la effettui sempre con degli int come argomenti, ma non esiste l'overload della funzione per questo tipo, quindi, devi effettuare il cast degli argomenti, per esempio converti gli int in double(l'unico per cui non serve è l'esponente), e poi effettui nuovamente il cast verso int quando devi salvare.

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 12:54
Giovedì, 15/07/2010
Testo quotato

Postato originariamente da gio97:

Beh, sin e pow sono in overload: ce ne sono di tre tipi, rispettivamente con argomenti long double, double e float, nella funzione pow il secondo argomento è poi un int.
La chiamata a funzione tu la effettui sempre con degli int come argomenti, ma non esiste l'overload della funzione per questo tipo, quindi, devi effettuare il cast degli argomenti, per esempio converti gli int in double(l'unico per cui non serve è l'esponente), e poi effettui nuovamente il cast verso int quando devi salvare.



quindi andrebbe bene questa soluzione?
Codice sorgente - presumibilmente C/C++

  1. for (int i=0;i<=63;i++)
  2.      k[i] = floor(abs(sin(double (i+1))) * pow(double (2),32));



Il compilatore non dà errori, ma comunque così facendo perderei approssimazioni?

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 13:38
Giovedì, 15/07/2010
si effettua approssimazione quando si passa da double ad int, non il contrario.

comunque, per restare in pieno spirito C++, si può usare:

Codice sorgente - presumibilmente C/C++

  1. for (int i=0;i<=63;i++)
  2.      k[i] = floor(abs(sin(static_cast<double>(i+1))) * pow(static_cast<double>(2),32));


Ultima modifica effettuata da lorenzo il 15/07/2010 alle 13:39
PM Quote