Array di struct in c

di il
5 risposte

Array di struct in c

Buongiorno ho un problema con un array di struct in c, non riesco a riempirlo passandolo a una funzione, come potrei fare?
Il codice scritto da me è questo, ma il compilatore mi da errore quando decido la posizione dell'indice ( per essere più chiaro)..
grazie in anticipo per l'aiuto

typedef struct _chiamata
{
float durata;
char *numeroChiamante;
char *numeroRicevente;
}Chiamata;

typedef struct _giorno
{
int id_giorno;//da 1 a 31
int n_chiamate;
Chiamata chiamateAlGiorno[10];
}Giorno;

Giorno ArchivioChiamate[31];

void generaNumeriTelefono(char *);
void generaGiorni(Giorno *pArchivio);

int main()
{
    srand(time(NULL));
    int i;
    generaGiorni(&ArchivioChiamate);


}

void generaGiorni(Giorno *pArchivio)
{
    int i,j,nchiamate;
    char numerocasuale[]="1234567890";
    for(i=0;i<31;i++)
    {
        nchiamate=rand()%11;
        pArchivio[i]->id_giorno=i+1;
        pArchivio[i]->n_chiamate=nchiamate;
        for(j=0;j<nchiamate;j++)
        {
            generaNumeriTelefono(numerocasuale);
            pArchivio[i]->chiamateAlGiorno[j]->numeroChiamante=numerocasuale;
            generaNumeriTelefono(numerocasuale);
            pArchivio[i]->chiamateAlGiorno[j]->numeroRicevente=numerocasuale;
            pArchivio[i]->chiamateAlGiorno[j]->durata=0.1+(5.0-0.1)*(float)rand()/(float)RAND_MAX;
        }

    }
}
void generaNumeriTelefono(char *numerotel_cas)
{


    int i,nc,lungh_alf;
    char alfabeto[]={'0','1','2','3',
    '4','5','6','7','8','9'};

    lungh_alf = 10;
    for(i=0;i<10;i++)
    {
        nc=rand()%lungh_alf;
        numerotel_cas[i]=alfabeto[nc];
    }
}

5 Risposte

  • Re: Array di struct in c

    Semplicemente

    generaGiorni(ArchivioChiamate);

    dato che il nome dell'array rappresenta l'indirizzo al primo elemento.

    E all'interno

    pArchivio[1].id_giorno

    e così via.
  • Re: Array di struct in c

    void generaGiorni(Giorno *pArchivio)
    {
        int i,j,nchiamate;
        char numerocasuale[]="1234567890";
        for(i=0;i<31;i++)
        {
            nchiamate=rand()%11;
            pArchivio[i].id_giorno=i+1;
            pArchivio[i].n_chiamate=nchiamate;
            for(j=0;j<nchiamate;j++)
            {
                generaNumeriTelefono(numerocasuale);
    
                pArchivio[i].chiamateAlGiorno[j].numeroChiamante=numerocasuale;
                 printf(" num=%s i=%d j=%d \n",pArchivio[i].chiamateAlGiorno[j].numeroChiamante,i,j);
                generaNumeriTelefono(numerocasuale);
                pArchivio[i].chiamateAlGiorno[j].numeroRicevente=numerocasuale;
                pArchivio[i].chiamateAlGiorno[j].durata=0.1+(5.0-0.1)*(float)rand()/(float)RAND_MAX;
            }
    
        }
    }
    modificata così la function, ma se nel main vado a scrivere
     printf("%s",ArchivioChiamate[0].chiamateAlGiorno[0].numeroChiamante);
    l'output non è quello desiderato, ma 2 caratteri dell'alfabeto a caso...
    sarà che questo array di char composto da numeri viene visto come codice ascii o simile e quindi viene convertito?
  • Re: Array di struct in c

    No, il problema è un po' più complesso ed evidenzia delle carenze nello studio dei puntatori.

    I due elementi

    char *numeroChiamante;
    char *numeroRicevente;

    sono puntatori a stringa (sequenza di caratteri terminata da NULL). Lo spazio dedicato a tale stringa però non è allocata (non esiste).
    Dunque, se usi il puntatore con

    =

    assegnandolo ad una stringa che definisci nella funzione, essendo questa locale, non fai altro che far puntare i tuoi puntatori a zone di memoria che saranno disallocate e non sono valide (da cui il casino che vedi a video).

    1) devi allocare dinamicamente lo spazio che ti serve usando una malloc

    2) copiare i dati usando il puntatore con la funzione strcpy
  • Re: Array di struct in c

    Sarebbe giusto poi modificare con questo?
    utilizzando opportunamente strcpy().
    oppure è necessaria l'allocazione dinamica con malloc?
    typedef struct _chiamata
    {
    float durata;
    char numeroChiamante[10];
    char numeroRicevente[10];
    }Chiamata;
    
  • Re: Array di struct in c

    Se non usi il puntatore allora, premesso che devi utilizzare 11 elementi (per il terminatore)

    char numeroChiamante[11];
    char numeroRicevente[11];

    va bene la strcpy. Ovviamente non userai la malloc.
Devi accedere o registrarti per scrivere nel forum
5 risposte