PDA

View Full Version : [C] Gestire puntatore ad array di puntatori.


Starise
21-11-2008, 10:55
Ciao a tutti. Allora, chiedo scusa, ma sto impazzendo con i puntatori! :D
Nel mio software sto gestendo una struttura di tipo puntatore ad array di puntatori a strutture che ho chiamato schede:
typedef struct _SCHEDA
{
int disp; /* marcatore */
char Nome[LSTRING]; /* nome del contatto */
char Cognome[LSTRING]; /* cognome del contatto */
char Email[LSTRING]; /* email del contatto */
} SCHEDA;
La struttura è inizializzata nella main e viene così allocata dinamicamente:
int main(int argc, char *argv[])
{
SCHEDA **Rubrica = NULL; /* puntatore ad array di puntatori */
int Elem = 0;
} /*endmain*/

int AllocaScheda
( SCHEDA ***Rubrica, /* puntantore al puntatore dell'array di puntatori */
int *elem /* numero di elementi presenti in rubrica */
)
{
SCHEDA **Nuova;
/* allocazione della memoria */
Nuova = ( SCHEDA ** )realloc( *Rubrica, ( *elem+1 ) * sizeof( SCHEDA* ) );
if( Nuova != NULL )
{
Nuova[*elem] = ( SCHEDA * )malloc( sizeof( SCHEDA ) );
if( Nuova[*elem] != NULL )
{
*Rubrica = Nuova;
Nuova[*elem]->disp = 0; // marca la scheda come disponibile
(*elem)++; /* nuovo elemento aggiunto */
return 1; /* allocazione avvenuta correttamente */
}
}
else
{
return 0; /* errore di allocazione */
}
}
Ora devo riempire la struttura utilizzando un file di testo:

int CaricaFileCsv
( SCHEDA **Rubrica,
int *elem
)
{
FILE *NuovoFile; /* file della rubrica */
char NomeFile[256]; /* contiene il nome del file */
int i; /* indice */

NuovoFile = fopen( "rubrica.csv", "r" ); /* apertura file predefinito */

if( NuovoFile == NULL ) /* il file non è stato aperto */
{
printf(" Inserire il nome di un file da caricare\n\n > ");
LeggiScelta( &NomeFile );
NuovoFile = fopen( NomeFile, "r" );
if( NuovoFile == NULL ) return 0; /* errore apertura */
}

while( !feof( NuovoFile ) )
{
Alloca(&Rubrica,elem);
fscanf( NuovoFile, "%s", Rubrica[*elem]->Nome );
fscanf( NuovoFile, " %s", Rubrica[*elem]->Cognome );
fscanf( NuovoFile, " %s", Rubrica[*elem]->Email );
}
fclose( NuovoFile ); /* chiusura del file */
return 1;
}


Il programma impazzisce e va in crash! :( :( :cry:

Vincenzo1968
21-11-2008, 15:48
Ciao,

il file com'è strutturato? I campi come sono separati? (punto e virgola? Tab?).
Io leggerei prima il numero di record presenti nel file e, quindi, allocherei con malloc anziché con realloc.
Puoi linkare un file di esempio?