Allocazione dinamica e passaggio a funzione di struttura

di Anonimizzato14817 il
8 risposte
Buonasera a tutti.
Dopo aver scritto il mio programma su CodeBlock ho fatto partire il Debug e mi è comparso questo errore:
error: invalid type argument of '->' (have 'nomestruttura')
. Il programma mi dà errore tutte le volte che vede
nomestruttura[i]->nome[code]. Sapreste indicarmi il perchè di questo errore? Non voglio pubblicare l'intero programma perchè è un esercizio dell'università e prima di farmi dare la soluzione voglio risolvermelo da solo il problema  f1 
Vi ringrazio anticipatamente della collaborazione.

8 Risposte

  • Non riconosce corretta l'istruzione con la struttura.

    Per poter meglio capire il problema, dovresti postare la struttura, l'intestazione della funzione e la riga che da l'errore.
  • Nomestruttura

    è un puntatore alla tua struttura? Altrimenti ha ragione il compilatore ...
  • Posto la struttura
    typedef struct strutt_
    {
        char nome[100];
        char cognome[100];
        int anno;
        int mese
    }nomestrutt;
    nomestrutt *nome1,temp;
    /*guarda quanti nomi ci sono nel file utilizzando un i++ in un ciclo */
    nome1=malloc(i*size(nomestrutt));
    etc.
    temp->anno=nomes1[j]->anno[/code]
    Ho fatto un ordinamento del vettore struttura, utilizzando la struttura come puntatore e utilizzarla come un puntatore allocato dinamicamente. La parte "temp->anno etc.." è ripetuta molte volte in quanto io devo ordinare le strutture secondo l'anno e il mese. Ovviamente al nome e cognome ho utilizzato la strcpy. L'errore mi capita tutte le volte che c'è "->".
  • Ma il vettore

    nomestruttura[ ]

    non esiste ... dove sta?
  • Prima l'ho chiamato nomestruttura ma in realtà "nomestrutt" è il tipo di struttura dichiarato con typedef. Successivamente ho dichiarato *nomes1 e test con nomestrutt. Perdona la confusione.
    Ho allocato dinamicamente nomes1 con malloc creando così una "specie" di vettore. Ecco perché poi ho scritto nomes1.
  • dach94 ha scritto:


    Perdona la confusione.
    Ok ma così non so cosa risponderti ...
    Ho allocato dinamicamente nomes1 con malloc creando così una "specie" di vettore. Ecco perché poi ho scritto nomes1.


    Posta tutto il codice che stai utilizzando e dicci dove sta l'errore. Non cambiare codice mentre chiedi nel forum altrimenti tu non risolvi e tutti perdono tempo ...
  • #include <stdio.h>
    #include <stdlib.h>
    typedef struct stud_
    {
        char nome[35];
        char cognome[35];
        int giorno;
        int mese;
        int anno;
        char sesso;
    }studente;
    void ordina (studente **stud,int n)
    {
        int i,j;
        studente temp;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
               {
                   if(stud[i]->anno>stud[j]->anno)
                   {
                       strcpy(temp->nome,stud[j]->nome);   /*lo stesso errore viene ripetuto da qui*/
                       strcpy(temp->cognome,stud[j]->cognome);
                       temp->giorno=stud[j]->giorno;
                       temp->mese=stud[j]->mese;
                       temp->anno=stud[j]->anno;
                       temp->sesso=stud[j]->sesso;
                       strcpy(stud[i]->nome,stud[j]->nome);
                       strcpy(stud[i]->cognome,stud[j]->cognome);
                       stud[i]->giorno=stud[j]->giorno;
                       stud[i]->mese=stud[j]->mese;
                       stud[i]->anno=stud[j]->anno;
                       stud[i]->sesso=stud[j]->sesso;
                       strcpy(stud[j]->nome,temp->nome);
                       strcpy(stud[j]->cognome,temp->cognome);
                       stud[j]->giorno=temp->giorno;
                       stud[j]->mese=temp->mese;
                       stud[j]->anno=temp->anno;
                       stud[j]->sesso=temp->sesso;  /* a qui*/
                   }
               }
        }
    };
    void dividi(studente **stud,int n)
    {
        int i;
        FILE *ragazzi, *ragazze;
        ragazzi=fopen("ragazzi.txt","w");
        ragazze=fopen("ragazze.txt","w");
        if(ragazze==NULL||ragazzi==NULL)
        {
            printf("errore apertura file di uscita");
        }
        for(i=0;i<n;i++)
        {
            if(stud->sesso=='M')
            {
                fprintf(ragazzi,"%s %s %d/%d/%d",stud->nome,stud->cognome,stud->giorno,stud->mese,stud->anno);
            }
            else if(stud->sesso=='F')
            {
                fprintf(ragazze,"%s %s %d/%d/%d",stud->nome,stud->cognome,stud->giorno,stud->mese,stud->anno);
            }
        }
    }
    int main(int argc, char *argv[])
    {
        int i,n=0;
        char str[100];
        studente *stud;
        FILE *input;
        if(argc!=2)
        {
            printf("errore linea di comando");
            return 0;
        }
        input=fopen(argv[1],"r");
        if(input==NULL)
        {
            printf("errore apertutra file");
            return 0;
        }
        while(fgets(str,100,input)!=NULL)
        {
            n++;
        }
        rewind(input);
        stud=malloc(n*sizeof(studente));
        for(i=0;i<n;i++)
        {
            fgets(str,100,input);
            sscanf(str,"%s %s %d &d &d %c",stud[i]->nome,stud[i]->cognome,stud[i]->giorno,stud[i]->mese,stud[i]->anno,stud[i]->sesso);
        }
        ordina(&stud,n);
        dividi(&stud,n);
        free(stud);
        return 0;
    }
    Questo è il mio codice.
    L'errore è sempre
    error:invalid tyoe argument of '->' (have 'studente')
  • Se usi una variabile di tipo studente come

    studente temp;

    non puoi usare il -> perché temp non è un puntatore. Quindi dovrai usare il . ovvero

    temp.nome

    e così via.

    Se usi un doppio puntatore come studente **stud allora dovrai fare attenzione all'uso del puntatore che dovrà essere

    (*stud)->nome

    e così via.

    In definitiva, devi rivedere le nozioni sui puntatori.
Devi accedere o registrarti per scrivere nel forum
8 risposte