Invalid use of undefined type 'struct esam'

di il
18 risposte

Invalid use of undefined type 'struct esam'

Salve a tutti, sto riscontrando questi problemi:
- invalid use of undefined type struct esame
-dereferencing pointer to incmplete type

non riesco capire perchè nella main l'indicizzazione non me la fa fare mentre nel file.c si,
di seguito vi posto le foto della main, del file.c e del file.h dove è contenuta la struttura.

main.c
https://drive.google.com/open?id=0BzfPQ1tpwWlaeGtyS0puNVJrUXM

esame.c
https://drive.google.com/open?id=0BzfPQ1tpwWlacXFjRVB6ZW1hYk0

esame.h
https://drive.google.com/open?id=0BzfPQ1tpwWlaTUl5RkQ1S2hqeGs

Grazie in anticipo...

18 Risposte

  • Re: Invalid use of undefined type 'struct esam'

    Non proporre "schermate" a cui si deve pure fare login per accedere.

    Copia il codice dei file e incollalo nel forum come fanno tutti.
  • Re: Invalid use of undefined type 'struct esam'

    Scusami ma sono nuovo, grazie mille per il consiglio

    main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "c_list.h"
    #include "libretto.h"
    #include "esame.h"
    
    
    int main(int argc, char *argv[]) 
    {
    		list l;
    		int pos;
    		item val;
    		esame es;
    		esame temp;
    		int i=0,n;
    		
    		printf("\nInserisci il numero di libretti: ");
    		l = input_list(n);
    		
    		val = input_item();		
    		pos = pos_item(l,val);
    		val = get_item(l,pos);
    		es = dammi_esame(val);
    		
    		char nome[51];
    		printf("\nInserisci il nome: ");
    		scanf("%s", nome );
    		
    		while(i<30)
    		{
    			cif (dammi_stato(es[i]==1))
    			{
    				
    				if (strcmp(dammi_nome_esame(es[i]),nome))
    						{
    							stampa_esame(es[i]);
    						}
    			}
    			i++;
    		
    		}
    			
    
    			return 0;
    }
    in esame.c metto solo una fuzione per farvi vedere che dove ho indicizzato
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "esame.h"
    
    //struttura esame
    struct esam
    {
        char nome[61];
        int voto;
        char data[11];
        int presente;
    };
    
    //tale funzione ritorna un vettore di esami
    esame input_esame()
    {
        int i=0;
        esame p;
        int n;
        printf("Inserisci il numero degli esami che vuoi inserire: "); //viene richiesto all'utente il numero di esami che vuole inserire
        scanf("%d", &n);
    
        if((n<1) || (n > 30))
        {
            return NULL; //si verifica se il numero inserito dall'utente è corretto
    
        }
    
     p = malloc(sizeof(struct esam)*30); //si alloca spazio per la taglia massima del vettore
            if (p==NULL) //controllo sull'allocazione
            {
                printf("Non è stato possibile allocare memoria.");
                return NULL;
            }
        while(i<n) //si scorre il vettore per n volte
        {
    
    
            printf("\nInserisci il nome dell'esame: ");
            scanf("%s", p[i].nome);
    
            printf("Inserisci il voto: ");
            scanf("%d", &(p[i].voto));
    
            printf("Inserisci la data nel formato gg/mm/aaaa: ");
            scanf("%s", p[i].data);
    
            p[i].presente=1; //viene messo un valore sentinella a 1 per indicare che la cella contiene valori
    
            i++;
        }
    
        return p; //viene ritornato il puntatore al vettore
    }
    esame.h
    typedef struct esam* esame;
    
    //la seguente funzione inserisci un vettore di esami
    esame input_esame(void);
    
    //la seguente funzione stampa un vettore di esami
    int output_esame(esame es);
    
    //il seguente operatore restituisce il nome di un esame
    char *dammi_nome_esame(esame x);
    
    //il seguente operatore restituisce il voto dell'esame
    int dammi_voto_esame(esame x);
    
    //il seguente operatore restituisce la data in cui si è sostenuto l'esame
    char *dammi_data_esame(esame x);
    
    //il seguente operatore restituisce se la cella del vettore è vuota o meno
    int dammi_stato(esame x);
    
    //la seguente funzione inserisce un esame in una variabile
    esame inserisci_esame();
    
    //la seguente funzione stampa una variabile di tipo esame.
    void stampa_esame(esame x);
    
    riassumo in breve qual'è l'obiettivo:

    ho una lista di libretti universitari, in questi libretti vi è un vettore di esami.
    Il mio obiettivo e di poter accedere a questi esami e di lavorare su di essi anche singolarmente.
  • Re: Invalid use of undefined type 'struct esam'

    Purtroppo non va ancora bene così.
    Dovresti creare un unico file che si possa copiare/incollare e quindi compilare.
    Deve essere autosufficiente, nel tuo caso fai riferimento a file include che non alleghi.

    Eventualmente potresti circoscrivere il problema creando un sorgente minimo che lo presenta e porre la questione sul forum.

    Con gli elementi che ci hai dato non penso che qualcuno sia in grado di aiutarti.
  • Re: Invalid use of undefined type 'struct esam'

    sebaldar ha scritto:


    Purtroppo non va ancora bene così.
    Dovresti creare un unico file che si possa copiare/incollare e quindi compilare.
    Deve essere autosufficiente, nel tuo caso fai riferimento a file include che non alleghi.

    Eventualmente potresti circoscrivere il problema creando un sorgente minimo che lo presenta e porre la questione sul forum.

    Con gli elementi che ci hai dato non penso che qualcuno sia in grado di aiutarti.
    cioè praticamente dovrei copiarvi come ho fatto sopra, ma tutto il materiale deve essere completo in modo che che copiate direttamente e compilate!?!?

    Se non è cosi non ho capito come metterle in unico file e postarlo qui, sarebbe un casino...
  • Re: Invalid use of undefined type 'struct esam'

    Dovresti postare un file completo compilabile. Non è possibile riscontrare l'errore che indichi "Invalid use of undefined type 'struct esam'" se il file non è completo di tutte le sue parti.
    In alternativa puoi, come ti ho detto, circoscrivere il problema, cioè estrarre il solo codice non funzionante e postarlo
  • Re: Invalid use of undefined type 'struct esam'

    Ho messo in questo zip tutto il materiale necessario, se ho sbagliato ancora scusami per l'ignoranza e la testardaggine
    Allegati:
    18204_08028d5bf40905d0b4632ad3c3e2a4da.zip
    18204_08028d5bf40905d0b4632ad3c3e2a4da.zip
  • Re: Invalid use of undefined type 'struct esam'

    Qual'è la logica di queste istruzioni dal main ?
    
    			cif (dammi_stato(es[i]==1))
    			{
    				
    				if (strcmp(dammi_nome_esame(es[i]),nome))
    						{
    							stampa_esame(es[i]);
    						}
    			}
    
    Il tutto mi sembra un po' pasticciato, ad una prima scorsa non si evince né la struttura né la logica del programma
  • Re: Invalid use of undefined type 'struct esam'

    sebaldar ha scritto:


    Qual'è la logica di queste istruzioni dal main ?
    
    			cif (dammi_stato(es[i]==1))
    			{
    				
    				if (strcmp(dammi_nome_esame(es[i]),nome))
    						{
    							stampa_esame(es[i]);
    						}
    			}
    
    Il tutto mi sembra un po' pasticciato, ad una prima scorsa non si evince né la struttura né la logica del programma

    Il pasticcio è dovuto al fatto che non mi funzionava l'indicizzazione e allora ho provato nei più disparati modi
    Comunque lo scopo è che dato un nome, si deve stampare l'intero esame.
    Quindi si preleva il nome nella singola struttura e si confronta con quello dato, se sono uguali allora si stampa.
    Per questo mi serve l'indicizzazione, proprio per prendere in considerazione il singolo nome...
  • Re: Invalid use of undefined type 'struct esam'

    Nel main.c riga 31 hai scritto cif ma intendi if, correggilo.
    Poi la struttura esam va definita nel file esame.h e non in esame.c
    esame.h diviene
    
    #ifndef ESAME_H_INCLUDED
    #define ESAME_H_INCLUDED
    
    //struttura esame
    struct esam
    {
        char nome[61];
        int voto;
        char data[11];
        int presente;
    };
    
    
    
    typedef struct esam* esame;
    
    ...
    
    
    
    la riga 31 di main.c non ha senso e non si capisce cosa vuoi fare
    
    			if (dammi_stato(es[i]==1))
    
    la funzione dammi_stato ha come argomento un esame, quindi la sintassi corretta è (se questo è quello che vuoi fare)
    
    		if (dammi_stato(es))
    
    senza sapere sapere la logica che hai implementato non ti posso essere di aiuto solo sulla sintassi.
  • Re: Invalid use of undefined type 'struct esam'

    Hai ragione perfettamente.
    Come detto ho una lista di libretti universitari, uno dei campi è un vettore di esami.

    Obiettivo: stampare un esame ricercato di un libretto.

    Una volta individuato il libretto, forniamo il nome dell'esame da ricercare nel vettore di esami di quel determinato libretto.

    visto che il vettore è di 30 esami avvio una ricerca finalizzata per trovare questo esame.
    verifico prima di tutto se la cella è occupata(perchè potrebbe accadere che il vettore abbia solo qualche esame e allora la ricerca fallirebbe se non fosse presente ).
    In caso positivo verifichiamo se il nome ricercato coincide con il nome dell'esame corrente se si viene stampato l'esame.


    es[0] è una cella che contiene una struttura esame e quindi un esame.

    Scusami se non riesco a essere chiaro ma questo è il massimo, ti ringrazio lo stesso.
  • Re: Invalid use of undefined type 'struct esam'

    Illuminazione!! Forse intendevi
    
    	if (dammi_stato( &es[i] ) ==1))
    
    
    e il main ti risulta quindi (correggi es nel suo puntatore &es)
    
    int main(int argc, char *argv[]) 
    {
    		list l;
    		int pos;
    		item val;
    		esame es;
    		esame temp;
    		int i=0,n;
    		
    		printf("\nInserisci il numero di libretti: ");
    		l = input_list(n);
    		
    		val = input_item();		
    		pos = pos_item(l,val);
    		val = get_item(l,pos);
    		es = dammi_esame(val);
    		
    		char nome[51];
    		printf("\nInserisci il nome: ");
    		scanf("%s", nome );
    		
    		while(i<30)
    		{
    			if (dammi_stato( &es[i] ) ==1)
    			{
    				
    				if (strcmp(dammi_nome_esame(&es[i]),nome))
    						{
    							stampa_esame(&es[i]);
    						}
    			}
    			i++;
    		
    		}
    			
    
    			return 0;
    }
    
    ricordati di spostare la definizione della struct esam da esame.c a esame.h e vedrai che riesci a compilare.
  • Re: Invalid use of undefined type 'struct esam'

    Mi pare di avertelo detto in altra occasione ... le dichiarazioni delle struct spostale nei .h prima delle varie typedef
  • Re: Invalid use of undefined type 'struct esam'

    oregon ha scritto:


    Mi pare di avertelo detto in altra occasione ... le dichiarazioni delle struct spostale nei .h prima delle varie typedef
    Vi ripeto che per non violare l'information hiding devo avere per forza la struttura nel file.c.
    Normalmente mi funziona cosi, quindi non è un errore.
  • Re: Invalid use of undefined type 'struct esam'

    Prova a sostituire il main con le modifiche che ti ho postato, che utilizzano un puntatore a esam e non la struttura. in questa maniera il compilatore non ti dovrebbe dare errore, anche se la definizione la lasci nel .c
Devi accedere o registrarti per scrivere nel forum
18 risposte