|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2003
Città: Umbria
Messaggi: 220
|
[C]Due bravi domande (pow e return=0;)
1)Quando cerco di compilare un programma dove compare la funzione pow() mi da questo errore:
/tmp/ccq2Qsw8.o(.text+0x33): In function `main': : undefined reference to `pow' collect2: ld returned 1 exit status ecco il programma: /*Inizio*/ #include<stdio.h> #include<math.h> main() { int x,y,tot; x=5; y=2; tot=pow(x,y); printf("%d\n", tot); } /*fine*/ Uso linux e compilo con gcc. 2)Se al termine del programma inserisco return=0; mi da un errore di compilazione. Eppure nel libro dove sto studiando lo inserisce in quasi tutti i prohgrammi, e anche copiando gli esempi del libro da sempre lo stesso errore. Perche'? grazie
__________________
gli hackers non esistono |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Un possibile problema è che pow restituisce un double non un intero,
e che i parametri devono essere double. La prima cosa da vedere quando qualcosa non funziona è la guida alle librerie che viene data con il compilatore. |
|
|
|
|
|
#3 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Re: [C]Due bravi domande (pow e return=0;)
Quote:
Codice:
double pow(double base, double power); Il secondo quesito deriva da una programmazione che con i compilatori + recenti ormai è considerato un errore. In C main() non supporta + il tipo int implicito e quando devi indicare che una funzione non deve prendere in ingresso nulla devi specificare il tipo void. Quindi devi sistemare la funzione main() in questo modo: Codice:
int main(void) ... Questo perchè forse stai leggendo il Kernighan Ritchie?? |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi sa che manca l'opzione -lm al gcc
|
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora come mai gli da un errore in fase di linking ?
|
|
|
|
|
|
#7 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
O perchè sta usando prototipi sbagliati (int al posto di double) o perchè usa una versione di gcc pari alla 3.3.1 che fa alcuni macelli in fase di installazione con le librerie standard, risolvibili con un semplice aggiustamento di link simbolici. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora vuol dire che in math.h c'è anche il prototipo di int pow(int,int) ? Altrimenit non me lo spiego...a meno che un prototipo del genere non sia definito implicitamente (come succede per i prototipi di putchar e getchar)...
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Solo non mi spiego perchè -lm non è implicito. |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Con il mingw32 compila tranquillamente (con 2 warning sull'assegnamento e sui parametri passati a pow)...
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Guarda, non me lo spiego nemmeno io... Anche io ho avuto lo stesso problema una volta... Probabilmente perchè pensano che succeda spesso che vengano scritte funzioni con lo stesso prototipo (in effetti con nomi così comuni non è tanto impossibile)... Se la libreria matematica fosse linkata automaticamente succedere un bel casino...
|
|
|
|
|
|
#14 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: May 2003
Città: Umbria
Messaggi: 220
|
la versione di gcc è la 3.2.2
Io compilo cosi': gcc programma.c Ho provato con: gcc -lm programma.c e funziona. Ho provato con: tot= double pow(x,y); e anche con tot= (double) pow(x,y); ma non va in entrambi i casi. Il primo caso mi da questo errrore: potenza.c: In function `main': potenza.c:8: parse error before "double" il secondo caso: /tmp/ccka4hDs.o(.text+0x33): In function `main': : undefined reference to `pow' collect2: ld returned 1 exit status Il return=0; ancora non va. Vi posto il programma: /*inizio*/ #include<stdio.h> int main(void) { int x, y, cont, tot; tot=0; cont=1; printf("Immetti valori: "); scanf("%d",&x); while (cont<=x) { scanf("%d",&y); tot+=y; cont++; } printf("Somma: %d\n", tot); return=0; } /*fine*/ dove sbaglio??? scusate l'ingoranza sto leggendo Deitel&Deitel
__________________
gli hackers non esistono |
|
|
|
|
|
#16 | ||
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Il primo non va perchè è una forma di casting errata. Il tipo in cui vuoi convertire va messo fra parantesi (come nel secondo caso). Tuttavia il secondo caso continua a non funzionare perchè evidentemente non passi di nuovo -lm durante la compilazione. Inoltre, convertire un int in un double non mi sembra la soluzione ottimale. Specificali direttamente come tipi double e basta, senza applicare alcun casting. Quote:
|
||
|
|
|
|
|
#17 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
tot = (int)pow((double)x, (double)y); Quote:
|
||
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Ops, non avevo visto l'uguale...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:07.



















