Allocazione dinamica e passaggio a funzione di struttura

di il
8 risposte

Allocazione dinamica e passaggio a funzione di struttura

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

  • Re: Allocazione dinamica e passaggio a funzione di struttura

    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.
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    Nomestruttura

    è un puntatore alla tua struttura? Altrimenti ha ragione il compilatore ...
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    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'è "->".
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    Ma il vettore

    nomestruttura[ ]

    non esiste ... dove sta?
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    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.
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    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 ...
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    #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')
  • Re: Allocazione dinamica e passaggio a funzione di struttura

    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