View Single Post
Old 21-11-2008, 10:55   #1
Starise
Senior Member
 
L'Avatar di Starise
 
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 977
[C] Gestire puntatore ad array di puntatori.

Ciao a tutti. Allora, chiedo scusa, ma sto impazzendo con i puntatori!
Nel mio software sto gestendo una struttura di tipo puntatore ad array di puntatori a strutture che ho chiamato schede:
Codice:
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:
Codice:
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:
Codice:
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!
__________________
Workstation: CPU AMD Ryzen 5600G @ 4400 MHz | RAM Corsair DDR4 32GB @ 3.2GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 2x Caviar Green 10TB | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 6800 XT Midnight Black | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | Mic Oktava MK 012 Black | Display LG OLED 48C1 @ 2160p 120Hz VRR FreeSync

Ultima modifica di Starise : 21-11-2008 alle 10:57.
Starise è offline   Rispondi citando il messaggio o parte di esso