Il 3/6/2017 03:36:01 enoquick scrisse:
>Il 02/06/2017 16:42, guido84 ha scritto:
>> Su it.comp.lang.c mi e' stato detto che e' meglio non mettere
>> il "-lm" in questa linea di comando:
>> $: gcc -Wall -O3 log_e.c -lm -o log_e
>> Il sorgente log_e.c fatto apposta e' questo:
>> --------------
>> #include <stdio.h>
>> #include <math.h>
>>
>> int main()
>> {
>> double enne;
>> scanf("%lf", &enne);
>> printf("\nlog(%lf) = %lf\n\n", enne, log(enne));
>>
>> return 0;
>> }
>> -----------------
>>
>> Ebbene, io sono un principiante, chi me l'ha detto ha esperienza
>> ma non di Linux (usa Windows NT) e m'ha suggerito di cambiare:
>> double enne; -> double enne = 0.0;
>>
>> ma Ld continua a non trovare le librerie:
>> ----------
>> /tmp/ccwk0tkr.o: nella funzione "main":
>> prova.c:(.text.startup+0x2d): riferimento non definito a "log"
>> collect2: error: ld returned 1 exit status
>> -----
>>
>> Potreste darmi una dritta su questa questione grazie in anticipo?
>>
>enne e' usato solo per l'input, quindi non serve inizializzarlo.
>Per il linker occorre dare -lm per includere la libreria matematica che
>contiene log
Grazie della rispota, hai confermato quel che pensavo.
>Non vedo dove sta il problema.
Ho usato la linea di comando con "-lm", un certo "jak" mi ha detto
su it.comp.lang.c di NON usarla perche' potrebbe causare errori.
Copio e incollo:
-------------
Quasi tutti i compilatori, quando vedono utilizzare dati in
virgola mobile, includono una libreria matematica. Nella fattispecie, il
gcc ne utilizza una versione composta da built-in function che magari
non è la migliore ma sicuramente produce file eseguibili dalle
dimensioni più contenute. Potresti anche volerne utilizzare una ottenuta
da terze parti e non quella standard e siccome il parametro -lm utilizza
la 'fast link table' e cioè cerca nei percorsi che hai dichiarato una
libreria che inizia per 'lib' e finisce per quel che hai messo dopo la
'l' (in questo caso libm.a) ti troveresti, in questo caso errori del
linker per entry duplicate. Quindi no, l'opzione -lm non _deve_ esser
messa, eventualmente _può_.
Approfitterei anche per far notare che la portabilità dipende da come
scrivi il codice sorgente e, sicuramente, non dalle librerie con cui
linki il codice oggetto compilato. Anzi.
------------
>Piuttosto se si vuole fare le cose per bene occorre porsi la domanda
>'che succede se un utente immette un qualcosa che non sia convertibile
>in double?'
Si' ma quel codice l'avevo scritto (per jak) solo per vedere se
riuscivo a compilare senza usare "-lm". Comunque quelli della
libreria math.h sono bravissimi, perche' m'aspettavo un segfault,
invece ecco cosa mi dice:
$ echo vediamo | ./log_e
log(-0.000000) = nan
e questo con qualunque altra parola o lettera in input.
Grazie di nuovo e ciao
P.S. Ne approfitto: se volessi evitare di dover dare l'input con
"echo ... | ", ma darlo come si fa con $1 a bash, come dovrei
cambiare il sorgente?
Non e' mica facile trovarlo il modo, perche' ho provato con
sscanf() ma mi fa casini inenarrabili :-(
--
Saluti,
Guido