Newsgroup: it.comp.lang.c
Titolo: Leggere membi di una struct

Ho questa situazione
...
typedef struct {
    double re;
    double im;
} complesso;
complesso z1, z2, *p1, *p2;
...
come faccio a leggere da stdin,
z1->re e z2->re ?

Innanzitutto, z1 e z2 non sono puntatori alla struttura, quindi
l'operatore da usare in questo caso è "." e non "->". Comunque, se
vuoi leggere da stdin i due membri, puoi fare così:
scanf("%lf %lf", &(
z1.re
), &(
z2.re
));
oppure, nel caso tu abbia puntatori alla struttura:
scanf("%lf %lf", &(z1->re), &(z2->re));
Le parentesi di "&(
z1.re
)" ecc. sono puramente esplicative. Puoi anche
farne a meno, dato che gli operatori "." e "->" hanno la precedenza su
"&".

 scanf("%lf %lf", &(z1->re), &(z2->re));
Non va:
/* inizio codice */
     printf ("Dammi Re z1:");
     scanf ("&lf", &(z1->re));
     printf ("\nDammi Im z1:");
     scanf ("&lf", &(z1->im));
     printf ("\nDammi Re z2:");
     scanf ("&lf", &(z2->re));
     printf ("\nDammi Im z2:");
     scanf ("&lf", &(z2->im));
/* fine codice */
Metto Re z1 poi scorrono tutte le varie
printf fino al termine dell'esecuzione,
come se le scanf successive fossero
ignorate.
[OUTPUT]
Dammi Re z1:0.1
Dammi Im z1:
Dammi Re z2:
Dammi Im z2:
[FINE ESECUZIONE PROGRAMMA]

     scanf ("&lf", &(z1->re));
-> si usa solo se devi accedere a una struttura tramite puntatore, 
mentre z1 non lo e'. Prova a sostituire tutti i "->" con dei "." e 
vedrai che funziona.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 mentre z1 non lo e'. 
Dimenticavo di dire
che ho definito z1, z2 cosi':
struct cmpx {
        double re;
        double im;
} *z1, *z2;
Ma anche definendo:
struct cmpx {
        double re;
        double im;
} z1, z2;
E mettendo scanf ("%lf", &(
z1.re
)) ecc. ottengo lo stesso output.
Uso Dev-C++/minigw32

__frank__ ha scritto:

1) Posta il programma intero, non pezzi disordinati.
2) Se usi dei puntatori, questi devono puntare a memoria allocata, 
quindi dovresti fare qualcosa tipo z1=malloc(sizeof(cmpx)); prima di 
usare z1.


 1) Posta il programma intero, non pezzi disordinati.
OK grazie, posto la versione senza puntatori:
/* Inizio codice */
#include <stdio.h>
struct cmpx {
        double re;
        double im;
} z1, z2;
int main (int argc, char* argv[])
{
     printf ("Dammi Re z1:");
     scanf ("&lf", &(
z1.re
));
     printf ("\nDammi Im z1:");
     scanf ("&lf", &(
z1.im
));
     printf ("\nDammi Re z2:");
     scanf ("&lf", &(
z2.re
));
     printf ("\nDammi Im z2:");
     scanf ("&lf", &(
z2.im
));
     system ("PAUSE"); /* per il run di dev-c++ */
     return 0;
}
/* Fine codice */

     scanf ("&lf", &(
z1.re
));
Devi usare % e non & per indicare il tipo di conversione.


 Devi usare % e non & per indicare il tipo di conversione.
Sono proprio FUSO
Grazie x la pazienza!

 Sono proprio FUSO
A volte sono gli errori piu' banali quelli che non si vedono. Non me ne 
ero accorto neanche io :-)


__frank__ <__fr...@spam.yourself.against.a.w.all> ha scritto:

Supponendo che lo spazio per z1 e z2 sia correttamente allocato puoi
usare normalmente la scanf:
scanf("%f", &z1->re);
Oppure puoi leggere un'intera riga dall'input con fgets e poi parsare il
buffer come meglio credi (sscanf, atof, strtod).
Luca
-- 
Home: 
http://kronoz.cjb.net
E' stato a causa di una donna che ho cominciato a bere e non ho mai
avuto la cortesia di ringraziarla.