Newsgroup: it.comp.lang.c
Titolo: Aritmetica dei puntatori - basi.

Ciao, oggi ho iniziato a studiare l'aritmetica dei puntatori solo che adesso
non mi tornano i conti.
Dato il seg. codice:
#include <stdio.h>
#define MAX 10
int i_array[MAX]={0,1,2,3,4,5,6,7,8,9};
int *i_ptr, count;
float f_array[MAX]={.0,.1,.2,.3,.4,.5,.6,.7,.8,.9};
float *f_ptr;
int main()
{
      i_ptr=i_array;
      f_ptr=f_array ;
      /*Stampa gli indirizzi dell'array.*/
      for (count=0; count<MAX; count++)
          printf("%d\t%f\n", i_ptr++, f_ptr++);
      system("PAUSE");
      return 0;
}
Perchè gli indirizzi di int vengono mostrati correttamente, mentre quelli di
float appaiono tutti 0.000000?
E' giusto una prova...
Grazie a tutti e buon lavoro.

           printf("%d\t%f\n", i_ptr++, f_ptr++);
Hai sbagliato ad usare le escape sequences, perchè hai usato quelle corrette
per rappresentare i *contenuti* dei puntatori: nel caso di i_ptr ottieni il
suo indirizzo in forma intera, mentre nel caso di f_ptr ottieni l'indirizzo
in forma floating point, ma dal momento che un indirizzo è un numero intero,
ed ha una rappresentazione di macchina diversa da un float (o da un double),
la sua rappresentazione in forma floating point è 0.
Comunque prova ad usare %X.
Ciao,
Cecco

 mentre quelli di float appaiono tutti 0.000000?
Č molto strano che gli int vengano mostrati correttamente. Hai definito
i_ptr come puntatore ad un intero per cui dovrai stampare il valore puntato
da i_ptr; analogamente f_ptr č un puntatore ad un float, per cui dovrai
stampare il valore puntato:
    printf("%d\t%f\n", *i_ptr++, *f_ptr++);
Maurizio.

float appaiono tutti 0.000000?
C'e' un errore concettuale di fondo. Tu cerchi di stampare l'indirizzo
di memoria e in effetti lo stampi, pero' sbagli il formato per la
stampa.
Tu non puoi sapere a priori quanto spazio occupera' l'indirizzo di un
puntatore (o meglio le assunzioni che fai oggi potrebbero non essere
piu' vere con l'evoluzione tecnica).
Proprio per questo e' stato introdotto il tipo "%p", come parametro
delle farie *printf, che permette di stampare il contenuto di 1
indirizzo di memoria in modo indipendente dall'implementazione.
Questa opzione mi pare sia stata introdotta con il C89 (qui vorrei una
conferma di qualcuno).
Se non vuoi usare il formato "%p" potresti usare come formato "%d" o
"%x" e ottenere quasi certamente il risultato voluto (hai una buona
probabilita' che l'indirizzo di memoria possa essere comodamente
rappresentato usando un intero).
Mox  /* Buon Natale a tutti */

 Grazie a tutti e buon lavoro.
Grazie mille, in effetti utilizzando il parametro %p ottengo l'output
corretto.
Il codice d'esempio del testo era:
#include <stdio.h>
#define MAX 10
int i_array[MAX]={0,1,2,3,4,5,6,7,8,9};
int *i_ptr, count;
float f_array[MAX]={.0,.1,.2,.3,.4,.5,.6,.7,.8,.9};
float *f_ptr;
int main()
{
      i_ptr=i_array;
      f_ptr=f_array ;
      /*Stampa gli elementi dell'array.*/
      for (count=0; count<MAX; count++)
          printf("%d\t%f\n", *i_ptr++, *f_ptr++);
      system("PAUSE");
      return 0;
}
che da l'output voluto. Io lo avevo cambiato per esecritarmi un pň. Grazie
per la dritta del %p!
Ciao e buon lavoro.

     printf("%d\t%f\n", *i_ptr++, *f_ptr++);
Ciao Maurizio, in realtà avendo scritto semplicemente i_ptr - essendo i_ptr
un puntatore - io ottengo appunto l'intero che rappresenta l'indirizzo della
variabile puntata, per cui non è strano che me li dia in forma corretta.
Mentre per il valore float f_ptr vale il discorso fatto da Francesco.
Con *i_ptr non ottengo l'intero che rappresenta l'indirizzo della variabile
ma il valore della variabile stessa, mentre io volevo l'INDIRIZZO.
Ciao e buon lavoro.
A.Alberto - Roma

 variabile puntata, per cui non è strano che me li dia in forma corretta.
Avevo letto frettolosamente il tuo msg, per cui avevo capito un'altra cosa,
e cioè che ti riportava i valori delle variabili intere e non il puntatore.
Comunque il tuo programma a me dava il seguente output:
|    The floating-point conversion code is not linked in.
|    4653056
|    The floating-point conversion code is not linked in.
|    4653060
|    ...
Maurizio.

 ha scritto nel messaggio
news:615W7.8805$QL2.3...@twister1.libero.it...

Mh?! Strano errore...a  me eseguiva perfettamente....ho dovuto solo cambiare
l'operatore di conversione %f in %p.
Che compilatore usi?
Ciao e BUON NATALE.

 Ciao e BUON NATALE.
Grazie, altrettanto a te e a tutto il ng.
Maurizio.

 Visualage for C++ dell'IBM
Cavolo, programmi su AIX? Ma che stai frequentando un corso a Roma o sei già
u n professionista?

 Cavolo, programmi su AIX?
No. Il visualage esiste anche per windows.
Maurizio.