PDA

Visualizza la versione completa : [C] Errore nel calcolo della radice quadrata


Alcott
10-10-2005, 19:06
Ciao a tutti.
Ho bisogno di calcolare la radice quadrata di un numero nel seguente programmino

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>

#define odd(i) ((i % 2 != 0) ? 1 : 0)

main ()
{
time_t t;
int base, altezza, x1, x2, y1, y2;
double ipotenusa, *i;

srand((unsigned) time(&t));
x1 = rand() % 50;
x2 = rand() % 50;
y1 = rand() % 50;
y2 = rand() % 50;
base = fabs(x1 - x2);
altezza = fabs(y1 - y2);
printf("%d, %d, %d, %d %d %d\n", x1, x2, y1, y2, base, altezza);
ipotenusa = (double) ((base*base) + (altezza*altezza));
ipotenusa = sqrt(ipotenusa);
printf("%f\n", ipotenusa);
}
ma ottengo il seguente errore in compilazione:

/tmp/ccg8ovkP.o(.text+0x137): In function `main':
random.c: undefined reference to `sqrt'
collect2: ld returned 1 exit status
Sapreste darmi qualche consiglio?
Grazie :ciauz:

maiosyet_2
10-10-2005, 21:00
Devi linkare la math.h:


$ gcc -lm file.c -o file.bin

Alcott
10-10-2005, 23:19
Grazie 1000! Cos va tutto ok. Un altro piccolo favore: potresti spiegarmi come mai non mi compila semplicemente con

gcc nomefile.c
visto che nel file ho incluso math.h dove contenuto sqrt? :ciauz:

EDT: inoltre ho notato che basta digitare

gcc -lm file.c
Cosa fa il comando -lm ed il file.bin?
Ringrazio anticipatamente

oregon
10-10-2005, 23:58
In realta' -lm indica al compilatore che deve utilizzare la "libreria" matematica, non l'include math.h ...

Nell'include *non esiste il codice* ma soltanto le dichiarazioni delle funzioni, costanti, strutture. Il codice vero e proprio sta nelle file di libreria che vengono incluse nella compilazione con lo switch -lm

maiosyet_2
11-10-2005, 15:51
Originariamente inviato da Alcott
Cosa fa il comando -lm ed il file.bin?


Sintassi BASE di gcc:

gcc <parametri> -o outfile infile (o anche file -o outfile)

gcc -lm file.c -o file.bin

file.bin l'eseguibile creato, al posto di a.out.
EDIT: per evitare confusione: per il nome dell'eseguibile ci puoi mettere quello che vuoi: io metto .bin per distinguerli, nella shell, dai sorgenti, ma non una vera estensione, sempre di elf si tratta.

Alcott
11-10-2005, 16:01
Perfetto!
Grazie a tutti :ciauz:

Loading