Newsgroup: it.comp.os.linux.development
Titolo: Linea di comando per gcc

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?
 
-- 
Saluti,
Guido
 


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
Non vedo dove sta il problema.
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?'
 

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
 

 sscanf() ma mi fa casini inenarrabili :-(
 
Non sono sicuro di aver capito del tutto la domanda, perche` solitamente
e` la prima cosa che trovi nei manuali di C, ma credo ti basti leggere
argv[1] (dopo aver controllato che argc sia >2)
 
Qualcosa tipo (il mio C e` un po' arrugginito):
 
int main(int argc, char** argv) {
 double enne;
 if (argc>2) {
  sscanf(argv[1], "%lf", enne);
  printf...
 }
}
 
Bye.
 

}
 
Cosi', per evitare il $2 = terzo argomento della riga, ho tolto
la condizione e va perfettamente.
-------------
#include <stdio.h>
#include <math.h>
 
int main(int pippo, char** argv)
{
double enne;
sscanf(argv[1], "%lf", &enne);
printf("\nlog(%lf) = %lf\n\n", enne, log(enne));
 
return 0;
}
------------
 
Grazie!! Di dover mettere "int" e ancor peggio "char**" dentro la
tomda di main non ci sarei mai arrivato! e che cavoli l'input e'
in double! :-(
Be' adesso posso passare alla doc nei sacri testi, cosi' almeno
-avendo un esempio concreto- ci riusciro' a capire cosa diavolo
dicono per sscanf().
 
Ciao e grazie di nuovo
 
-- 
Saluti,
Guido
 

 la condizione e va perfettamente.
]zac[
 
E quello che hai ottenuto e di avere un programma pronto per un accesso 
fuori dalla memoria, hai presente i bug che usano i cracker per bucare i 
sistemi degli altri.
 
Il vettore argv e' popolato in base hai parametri passati, il resto contiene 
dati non sicuri (dipende al contenuto della memoria in quel momento).
 
Prima di leggere argv bisogna controllare leggere argc per sapere il numero 
di item presenti in argv .
 
Nel tuo caso il test avrebbe dovuto essere argc == 2 o argc >= 2.
 
 
 
 
E' vero che stai facendo un programma di prova, ma tieni conto che se non si 
tiene conto continuamente dei problemi di sicurezza e solidita', dopo che il 
programma e' cresciuto o si e' assunto uno stile di programmazione, e' molto 
difficile correggerlo e correggersi.
 
 
 
 
P.S. Se non hai motivazione particolari per usare solo il C, e' saggio 
imparare il C++.
Personalmente trovo uno spreco di tempo inutile doversi sempre preoccupare 
di puntatori, dimensione dei vettori, di stringhe, di strutture complesse, 
sfugge sempre qualcosa.
 

 tocca dare il comando: "./prova 10 qualsiasi_cosa".
 
No.
 
argc e` il numero di parametri sulla command line
 
argv e` un array di stringhe, che in C si puo` rappresentare come un
puntatore a una lista di puntatori (da cui il doppio *)
 
Se scrivi "./prova 10 qualsiasi_cosa"
 
argc = 3
argv = ["./prova", "10", "qualsiasi_cosa"]
 
argv[0] e` sempre il comando che hai dato, quindi il primo parametro e`
argv[1] e via via i successivi.
 
Se accedi a argv[3], in questo caso, stai puntando a un'area di memoria
non inizializzata, quindi ti rendi vulnerabile ad attacchi di code
injection.
 
Bye.
 
 

sfugge sempre qualcosa.
 
Sentimentalmente mi piaceva il C puro (come il kernel), ma
provero' il c++. E poi soprattutto pensavo fosse piu' difficile
invece da questo che dici sembra piu' facile o almeno piu' veloce
e meno impegnativo.
 
Ciao e grazie del reply!!
 
-- 
Saluti,
Guido
 

injection.
 
Si', comincio a capire come funziona, me l'aveva appena accennato
anche Giuseppe D.B.
 
Grazie delle info e ciao!
 
-- 
Saluti,
Guido
 

 
 
i valori di input li puoi leggere in 3 modi (lascio stare altri modi piu 
complessi come ipc,socket,shared memory,ecc..)
da file (anche stdin e' un file)
da argomenti (argc/argv)
da ambiente (env)
Puoi decidere tu come devi agire
 
 

Puoi decidere tu come devi agire
 
Si' grazie per tutte le info e ciao!
 
-- 
Saluti,
Guido
 

 
 
:)