Newsgroup: it.comp.lang.c
Titolo: piccole esercitazioni con la malloc

ciao a tutti,
mi stavo esercitando a fare due o tre piccoli esercizietti in c :)
per prima cosa ho provato a fare un programmino (misero) che contenesse una
struct di una struct.
Ovvero una cosa del genere:
#include <stdio.h>
main(){
 struct n {int giorno, mese, anno;}nato;
 struct p {char nome[15], cognome[15]; struct nato;}persona;
 printf("Inserisci il nome cognome e data di nascita nel formato
gg/mm/aaaa:\n");
 scanf("%s%s%d/%d/%d", persona.nome, persona.cognome, &nato.giorno,
  &nato.mese, &nato.anno);
 printf("%s %s\nE' nato il %d/%d/%d", persona.nome, persona.cognome,
  nato.giorno, nato.mese, nato.anno);
return 0;
}
ok dopo una versione con 15 (!!!) errori sono riuscito a tirarne fuori una
funzionante ;)
Poi mi sono detto, per fare le cose un pelo più difficili sbattiamoci una
malloc.
E quando il gioco si fa duro, il mio cervello va in panchina :(
Quello che sono riuscito a scrivere è questo, ma non so come fare ad
accedere ai valori dei vari campi del vettore.
In concreto:
#include <stdio.h>
#include <stdlib.h>
main(){
 struct n {int giorno, mese, anno;}nato;
 struct p {char nome[15], cognome[15]; struct nato;}persona;
 struct p *num;
 int n, i;
 printf("Quanti persone vuoi inserire? ");
 scanf("%d", &n);
num =(struct p*)malloc(n*(sizeof(struct p)));
 for (i=0; i<n; i++){
 printf("Inserisci il nome cognome e\ndata di nascita nel formato gg/mm/aaaa
della %d° persona\n", i+1);
 scanf("%s%s%d/%d/%d", ???? );
  }
free(num);
return 0;
}
non so nella scanf come scrivere l'indirizzo del nome, cognome, giorno di
nascita in num[0], poi in num[1]... fino a num[n-1]
non so se mi sono spiegato
grazie :)

 num =(struct p*)malloc(n*(sizeof(struct p)));
se stai utilizzando il C e non il C++ allora non serve il cast (struct p*).
Tommy

 ha scritto nel messaggio
news:bthku2$eav$1...@titan.btinternet.com...

grazie per gli utili consigli :)
per i nomi sensati vedrò cosa posso fare... non ho molta fantasia nel
battezzare vettori et similia :D
ok per la scanf potrei mettere un gets (o fgets) per nome e cognome e una
scanf per la nada di nascita... bho provo!!
cmq senza casting a me la malloc da' un errore...
cioè scritta così:
num = malloc(n*(sizeof(struct p)));
il compilatore (borland 4.5) mi dice:
Error: Cannot convert 'void *' to 'p*' in function main()

 Error: Cannot convert 'void *' to 'p*' in function main()
Questo ti succede perché probabilmente il compilatore sta funzionando
in modalità C e non C++. Confesso che non mi intendo di C++ comunque
in C il casting è indispensabile (ed a mio avviso anche
"filosoficamente" corretto... la malloc restituisce un void*, non uno
struct p*).
Buon divertimento!
Stefano B.

 Error: Cannot convert 'void *' to 'p*' in function main()
Ti ho gia' risposto nel messaggio di prima...
Stai compilando in modalita' C++ e non in modalita' C.
Tommy
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Error: Cannot convert 'void *' to 'p*' in function main()
Ti ho gia' risposto nel messaggio di prima...


 ha scritto:

E` il contrario: il cast e` necessario in C++ (ma in C++ non userei la
malloc) ed e` superfluo (a volte deleterio) in C.
Luca
-- 
Home: 
http://kronoz.cjb.net
Al termine di un pranzo di nozze mi hanno dato un
amaro alle erbe cosi' schifoso che perfino sull'etichetta
c'era un frate che vomitava.