Newsgroup: it.comp.lang.c
Titolo: Domanda banale, come uso i float?

Salve, chiedo per piacere un aiutino.
Ho da poco ripreso in mano il C, col quale pero' non riesco piu' a
usare i float! Un codice del genere
float cavolo;
cavolo=3.45;
printf("%d %f",cavolo,cavolo);
sia in DOS che in linux mi da' come output 0 0.00000000
Anche se uso =3.14F o =314E-2... cosa sbaglio?
Grazie, scusate il disturbo
Enos

 
Perche' usi %d? Serve per l'output dei tipi interi. Prova a usare solo 
%f e vedrai che funziona.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

eno...@despammed.com
 wrote:

  printf("%d %f",(int)cavolo,cavolo);
%d non converte il primo parametro in int. %d dice: io prometto che il
primo parametro *e'* un int.
-- 
Horst

Horst Kraemer ha scritto:

Andando sul filosofico... ma perche' dopo che printf ha stampato cavolo 
come intero gli sballa il valore? Non ci dovrebbe essere sempre il 
passaggio per valore in C? Ecco cosa succede: magari tu ci capisci...
...
0x0804838d <main+9>:	mov    $0x0,%eax
0x08048392 <main+14>:	sub    %eax,%esp
0x08048394 <main+16>:	mov    $0x405ccccd,%eax
0x08048399 <main+21>:	mov    %eax,0xfffffffc(%ebp)
0x0804839c <main+24>:	flds   0xfffffffc(%ebp)
0x0804839f <main+27>:	fstpl  0xc(%esp)
0x080483a3 <main+31>:	flds   0xfffffffc(%ebp)
0x080483a6 <main+34>:	fstpl  0x4(%esp)
0x080483aa <main+38>:	movl   $0x80484d4,(%esp)
0x080483b1 <main+45>:	call   0x80482b0 <_init+56>
...


 come intero gli sballa il valore?
Un argumento di tipo "float" per un parametro ... viene convertito in
double. Quindi (condizioni: sizeof (float) == sizeof (int) == 4,
sizeof (double)==8) ci sono due oggetti di 64 bit 
  |(double)cavolo: 64bit|(double)cavolo: 64bit|
  |     %d    |        %f         |
%d prende bit#0..bit#31 e %f prende bit#32..#95
 
-- 
Horst

 passaggio per valore in C? Ecco cosa succede: magari tu ci capisci...
Prova a implementare una printf e poi te ne accorgi.
Chiaramente non ci può essere alcuna conversione operata dal linguaggio 
in quanto la printf deve poter accettare qualsiasi n-pla di parametri 
(di tipo arbitrario).
La cosa interessante è che il compilatore fa sì che i parametri vengano 
inseriti correttamente nello stack (i double per es. occupano quasi 
sempre più spazio degli int), però la funzione non ha modo di saperlo, 
se non chiedendo aiuto all'utente. E' chiaro che interpretare male il 
primo parametro significa pagarne le conseguenze anche per i successivi 
(potresti iniziare a leggere il secondo parametro partendo da metà del 
primo o da chissà dove!).
Kiuhnm

Kiuhnm ha scritto:

Grazie a entrambi ora ho capito. Il mio problema era che credevo che il 
float non venisse promosso a double.


 %f e vedrai che funziona.
Grazie molte, proprio non riuscivo a venirne a capo! Che cosa strana
pero', quelle funzioni potrebbero ben copiarsi i valori passati dentro
alle loro variabili locali senza modificare quelle globali...
Seguendo il tuo suggerimento ho messo printf("%d
%f",(int)cavolo,cavolo) che funziona
Arrivederci e di nuovo grazie a tutti
Enos

 alle loro variabili locali senza modificare quelle globali...
Dopo la tua vecchia printf cavolo valeva 0?
Non credo proprio...allora perché dici che la printf modifica le var 
globali?
Kiuhnm
P.S.
printf("%d %f", (int)cavolo, cavolo);

eno...@despammed.com
 ha scritto:

Cavolo non e' globale, e' una variabile automatica di main. Forse 
intendevi: "quelle funzioni non dovrebbero modificare i valori 
originali..." e infatti non li modificano. Leggi il resto del thread e 
vedrai cosa succede.


 globali?
Ho riutilizzato il termine globale, ma in realtà volevo dire "esterne 
alla printf".
Kiuhnm