PDA

Visualizza la versione completa : [C] Allocazione e riallocazione dinamica di array di Struct


Vincent
23-10-2006, 20:47
Ragazzi sto uscendo pazzo!

Come si fa l'allocazione dinamica di un'array di strutture?

Ho la necessit di inserire un elemento alla volta!

Se lo faccio per array di interi, funziona tutto. Con gli array di struct allocati dinamicamente, si blocca!

HEEEEELPPPPP!

MItaly
23-10-2006, 20:52
Posta il codice che hai scritto finora.

Vincent
23-10-2006, 21:14
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
/* !
* La struttura Telefono utilizzata per memorizzare il Numero Telefonico
* del Contatto ed il tipo ( "Etichetta" ) di numero
*/
typedef struct { unsigned int ID; /*!< Variabile intera senza segno di
* indentificazione univoca del numero telefonico */

char NumTel[50]; /*!< Stringa contenente il numero telefonico*/

char Etichetta [50]; /*!< Stringa contenente la tipologia di
* numero telefonico: "Casa" , "Ufficio" , "Fax" , etc...*/
} Telefono;


/*
La struttura Persona utilizzata per allocare un nuovo Contatto
*/
typedef struct { unsigned int ID;
char Cognome [50];
char Nome [50];
Telefono Tel;
char Indirizzo[100];
} Persona;

void Inserisci( Persona **New , int *n);
void stampa( Persona *List , int n );

int main(){
Persona *Contatti;
int start, choice;
start = 0;
Contatti = NULL;

printf("Premi 1 per inserire\n"
"Premi 2 per terminare\n?");
scanf("%d", &choice);

while(choice!=2){
Inserisci(&Contatti, &start );
stampa(Contatti, start );
printf("?");
scanf("%d",&choice);
}
free(Contatti);
system("PAUSE");
return 0;
}

void Inserisci( Persona **New , int *n )
{ int i, dim;
Persona *NewP;

dim=*n;

if (dim == 0){
dim++;
NewP=(Persona*)malloc(sizeof(Persona));
}
else{
dim++;
NewP = (Persona*)realloc(*New, dim);
}

system("CLS");

/* Inserimento dati... */
printf ( "\nInserimento Persona\n" );

NewP[dim].ID=dim;
/* ...stampo l'ID */
printf("\nID: %d\n" , NewP[dim].ID);
/* Inserimento Cognome del Contatto nella struttura di appoggio */
printf("Cognome: ");
scanf("%s" , NewP[dim].Cognome );
/* Inserimento Nome del Contatto nella struttura di appoggio */
printf("Nome: ");
scanf ( "%s" , NewP[dim].Nome );
/* Inserimento Numero Telefonico del Contatto nella struttura di appoggio */
printf("Numero: ");
scanf("%s" , NewP[dim].Tel.NumTel );
/* Inserimento Tipo di Numero Telefonico del Contatto nella struttura di appoggio */
printf("Tipo Numero: ");
scanf("%s" , NewP[dim].Tel.Etichetta );

/* Inserimento Indirizzo del Contatto nella struttura di appoggio */
getchar();
printf("Indirizzo: ");
fgets( NewP[dim].Indirizzo , 100 , stdin );


/* Restutuisco al main i valori aggiornati */
*n = dim;
*New=NewP;

/* Stampo un messaggio di di avviso e termino la procedura */
system("CLS");
printf ( "\nContatto inserito\n" );
system("PAUSE");
system("CLS");


return;

}

void stampa ( Persona *List , int n )
{ int i, /* Variabile di iterazione per i cicli */

system("CLS");

printf("\n");
printf("\t\t +-----------------------------+\n");
printf("\t\t + Stampa Contatti + \n");
printf("\t\t +-----------------------------+\n\n");

printf(" -----------------------------------------------------------------------------------------\n");
printf(" %-6s%-13s%-13s%-13s%-10s%s\n" , "ID" , "Cognome" , "Nome" , "Telefono" , "Tipo" , "Indirizzo" );
printf(" -----------------------------------------------------------------------------------------\n\n");

/* Se non c' nessun contatto, ossia la lunghezza del file "zero" */
if ( n == 0 )
{
printf(" -> Nessun Contatto Presente <-\n");
}
/* Altrimenti stampa la lista di contatti */
else
{
for(i=1; i<=n; i++)
{
printf(" %-6d%-13s%-13s%-13s%-9s%s\n" , List[i].ID , List[i].Cognome , List[i].Nome ,
List[i].Tel.NumTel , List[i].Tel.Etichetta ,
List[i].Indirizzo);
}

}
printf("\n -----------------------------------------------------------------------------------------\n\n");

printf("\n\n");

system("PAUSE");
system("CLS");
return;

}

MItaly
23-10-2006, 21:26
NewP = (Persona*)realloc(*New, dim*sizeof(Persona));

Vincent
23-10-2006, 21:29
fatto anche quello...
lo stesso! non funziona lo stesso!!! :dh: :dh: :dh: :dh: :dh: :dh:

Vincent
23-10-2006, 23:19
uuuuuuuuppp!

Ragazzi vi prego aiutatemi! Tra poco mi :cry: impicco... :bh:

Vincent
24-10-2006, 00:39
Ragazzi era questo:

NewP = (Persona*)realloc(*New, (dim+1)*sizeof(Persona));

non era dim, bens dim+1....cio aggiungi un altro elemento alla dimensione attuale dim!

MItaly
24-10-2006, 16:01
... che tra l'altro non moltiplicavi nemmeno per la dimensione della struttura... :rollo:

Lak3d
25-10-2006, 15:42
colpa mia chiedo scusa, gliel'avevo modificato io quel codice...nella fretta ho dimenticato di moltiplicare la dimensione per i byte di Persona... certo che non capisco perch dim+1... gi fai dim++ una riga sopra...

Loading