Errore: unknown type name

di il
13 risposte

Errore: unknown type name

Buongiorno, chiedo aiuto perchè ho provato in tutti i modi cercando su internet, libri e provando da me. Forse non c'è una risposta dove ho cercato, o forse sono io a non avere capito, ma quando provo a passare un tipo definito da me da un header all'altro mi appare un errore :


in file included from: main.h
main.c

inserimento.h: error: unknown type name 'Posizione' Posizione inserisciPosizione();


Il codice scritto da me è il seguente:

main.h

#include ...
#include "inserimento.h"

typedef struct{
...
...
...
}Posizione;
inserimento.h

#include main.h

Posizione inserisciPosizione();
Da qua mi segna che praticamente il tipo Posizione è sconosciuto e non mi fa buildare il programma. Questo è l'unico errore che mi segna. Lo segna più volte perchè ho inserito più di una struttura.
Grazie mille in anticipo a chiunque possa aiutarmi.

13 Risposte

  • Re: Errore: unknown type name

    Non puoi includere il primo nel secondo file e il secondo nel primo.
  • Re: Errore: unknown type name

    oregon ha scritto:


    Non puoi includere il primo nel secondo file e il secondo nel primo.
    E quindi come posso passare la variabile definita da me da un header all'altro?
    Includo il main.h nell'inserimento.c e definisco direttamente tutto lì? Oppure c'è un modo per definire nell' inserimento.h usando quella variabile?
  • Re: Errore: unknown type name

    Che vuol dire "passare variabili" tra gli include? Negli include non ci vanno le variabili ma solo dichiarazioni di tipi e funzioni.
  • Re: Errore: unknown type name

    oregon ha scritto:


    Che vuol dire "passare variabili" tra gli include? Negli include non ci vanno le variabili ma solo dichiarazioni di tipi e funzioni.
    Non voglio passare una variabile, ma un tipo definito nel main.h con
     typedef struct {
     ...
     ...
     ...
     }nometipo;
  • Re: Errore: unknown type name

    The_Jolly01 ha scritto:



    Non voglio passare una variabile, ma un tipo definito nel main.h con
     typedef struct {
     ...
     ...
     ...
     }nometipo;
    Mi spiego meglio. Ho definito un tipo nel main.h utilizzando typedef, e voglio che quel nuovo tipo creato da me possa essere utilizzato in un altro file header che non sia il main.h, così ho incluso il main.h nel mio file inserimento.h. Quindi a questo punto ho il tipo creato nel main.h e incluso nel inserimento.h e voglio dichiarare una funzione e utilizzare il tipo creato da me come tipo di ritorno. Se io a questo punto utilizzo il tipo nell'inserimento.c che ha come unico include l'inserimento.h tutto funziona, ma il tipo non viene riconosciuto all'interno del file inserimento.h in cui ho dichiarato la funzione che definisco nel inserimento.c. Spero che si capisca ciò che ho intenzione di fare.
  • Re: Errore: unknown type name

    E allora perché hai scritto "una variabile"?

    Comunque, senza considerare altro codice che non ho visto, scrivi semplicemente

    in main.c/main.cpp)
    
    #include "main.h"
    #include "inserimento.h"
    
    in main.h
    
    typedef struct {
       int x;
     }Posizione;
     
    e in inserimento.h
    
    Posizione inserisciPosizione();
    
  • Re: Errore: unknown type name

    oregon ha scritto:


    E allora perché hai scritto "una variabile"?
    Scusa ho sbagliato volevo dire il tipo.

    Comunque era quello che avevo già fatto, non mi riconosce il tipo nell'inserimento.h, mi dice unknown type name
  • Re: Errore: unknown type name

    Ma se compili hai errori? Quale compilatore / IDE usi?

    Hai scritto gli include nell'ordine che ti ho indicato? O no?
  • Re: Errore: unknown type name

    Si ho errore se compilo, altrimenti nessun errore segnalato prima, uso CLion con minGW. Avevo già tutto fatto così, preciso identico. Potrebbe essere che uso C90? Oppure non cambia da C90 a C99 ecc.?
  • Re: Errore: unknown type name

    Mostrami il codice del main.c, main.h e inserimento.h completo.
  • Re: Errore: unknown type name

    oregon ha scritto:


    Mostrami il codice del main.c, main.h e inserimento.h completo.
    Probabilmente ci saranno vari errori, ti chiedo di parlare solo di quelli relativi al mio problema, grazie mille

    main.c
    #include "main.h"
    #include "inserimento.h"
    int main() {
        srand(time(NULL));
        int dimensioneLista;
        printf("Quanti immobili vuoi inserire?\n");
        scanf("%d", &dimensioneLista);
        Immobile listaImmobili[dimensioneLista];
        int i;
        for (i = 0; i < dimensioneLista; i++) {
            printf("INSERIMENTO NUMERO %d", i+1);
            inserisciImmobile(listaImmobili[i]);
        }
         
    
        return 0;
    }
    main.h
    #ifndef PROGETTO_B_MAIN_H
    #define PROGETTO_B_MAIN_H
    #include "inserimento.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <ctype.h>
    #define DIM_STR_POSIZIONE 32
    
    typedef struct{
        char regione[DIM_STR_POSIZIONE];
        char comune[DIM_STR_POSIZIONE];
        char via[DIM_STR_POSIZIONE];
        int numeroCivico;
    
    }Posizione;
    
    typedef enum{Indipendente, SemiIndipendente, Appartamento, Altro}Tipologia;
    
    typedef enum{Abitativo, Ufficio, LocaleCommerciale}UsoImmobile;
    
    typedef enum{Nuovo, Ristrutturato, ParzialmenteRistrutturato, DaRistrutturare, Rudere}StatoImmobile;
    
    typedef struct{
        int prezzo;
        float metriQuadri;
        int numeroVani;
        Posizione posizioneImmobile;
        char codiceID[9];
        int numeroVerande;
        Tipologia tipologiaImmobile;
        _Bool ascensore;
        _Bool postoAuto;
        _Bool scantinato;
        _Bool giardino;
        UsoImmobile usoImmobile;
        StatoImmobile statoImmobile;
    }Immobile;
    
    #endif //PROGETTO_B_MAIN_H
    inserimento.c
    #include "inserimento.h"
    #include "main.h" //HO PROVATO CON E SENZA QUESTO, IN TEORIA CREDO NON CI SIA BISOGNO
    
    int inserisciPrezzo(){
        int prezzo;
        //DA RICONTROLLARE FACENDO EVENTUALI PROVE
        do{
            printf("Inserisci il prezzo dell'immobile\n");
            scanf("%d", &prezzo);
            if(prezzo < 0 || prezzo > 10000000){
                printf("ERRORE, INSERISCI UN NUMERO TRA 0 E 10.000.000!\n");
            }
        } while (prezzo >= 0 && prezzo <= 10000000);
        return prezzo;
    }
    
    float inserisciMetriQuadri(){
        float metriQuadri;
        do{
            printf("Inserisci i metri quadri dell'immobile\n");
            scanf("%f", &metriQuadri);
            if(metriQuadri < 1 || metriQuadri > 10000 ){
                printf("ERRORE, INSERISCI UN NUMERO TRA 1 E 10.000!\n");
            }
        } while (metriQuadri >= 1 && metriQuadri <= 10000 );
        return metriQuadri;
    }
    
    int inserisciNumeroVani(){
        int numeroVani;
        do{
            printf("Inserisci il numero dei vani dell'immobile\n");
            scanf("%d", &numeroVani);
            if(numeroVani < 0 || numeroVani > 999){
                printf("ERRORE, INSERISCI UN NUMERO TRA 0 e 999\n");
            }
        } while(numeroVani >= 0  && numeroVani <=999);
        return numeroVani;
    }
    
    Posizione inserisciPosizione(){
        Posizione posizioneImmobile;
        printf("Inserisci la regione dell'immobile\n");
        scanf("%s", posizioneImmobile.regione);
        printf("Inserisci il comune dell'immobile\n");
        scanf("%s", posizioneImmobile.comune);
        printf("Inserisci la via dell'immobile\n");
        scanf("%s", posizioneImmobile.via);
        do{
            printf("Inserisci il numero civico dell'immobile\n");
            scanf("%d", &posizioneImmobile.numeroCivico);
            if(posizioneImmobile.numeroCivico >999 || posizioneImmobile.numeroCivico < 1){
                printf("ERRORE, INSERISCI UN NUMERO COMPRESO TRA 1 E 999\n");
            }
        }while (posizioneImmobile.numeroCivico <=999 && posizioneImmobile.numeroCivico>=1);
        return posizioneImmobile;
    }
    
    
    int inserisciNumeroVerande(){
        int numeroVerande;
        do{
            printf("Inserisci il numero delle verande dell'immobile\n");
            scanf("%d", &numeroVerande);
            if(numeroVerande < 0 || numeroVerande > 999){
                printf("ERRORE, INSERISCI UN NUMERO COMPRESO TRA 0 E 999\n");
            }
    
        } while(numeroVerande >= 0 && numeroVerande <= 999);
        return numeroVerande;
    }
    
    Tipologia inserisciTipologia(){
        Tipologia tipoImmobile;
        do{
            printf("Inserisci una tipologia dell'immobile:\n");
            printf("[0]Indipendente [1]Semi-Indipendente [2]Appartamento [3]Altro\n");
            scanf("%d",&tipoImmobile);
            if(tipoImmobile != 0 && tipoImmobile != 1 && tipoImmobile != 2 && tipoImmobile != 3){
                printf("ERRORE, INSERISCI UN ENUMERAZIONE VALIDA\n");
            }
        }while(tipoImmobile == 0 || tipoImmobile == 1 || tipoImmobile == 2 || tipoImmobile == 3);
        return tipoImmobile;
    }
    
    _Bool inserisciAscensore(){
        int ascensore;
        do{
            printf("Indica se e' presente l'ascensore\n");
            printf("[0]FALSO [1]VERO\n");
            scanf("%d", &ascensore);
            if(ascensore != 0 && ascensore != 1){
                printf("ERRORE, INSERISCI IL NUMERO CORRISPONDENTE A VERO O FALSO\n");
            }
        }while(ascensore == 0 || ascensore == 1);
        return ascensore;
    }
    
    _Bool inserisciPostoAuto(){
        int postoAuto;
        do{
            printf("Indica se e' presente il posto auto\n");
            printf("[0]FALSO [1]VERO\n");
            scanf("%d", &postoAuto);
            if(postoAuto != 0 && postoAuto != 1){
                printf("ERRORE, INSERISCI IL NUMERO CORRISPONDENTE A VERO O FALSO\n");
            }
        }while(postoAuto == 0 || postoAuto == 1);
        return postoAuto;
    }
    
    _Bool inserisciScantinato(){
        int scantinato;
        do{
            printf("Indica se e' presente lo scantinato\n");
            printf("[0]FALSO [1]VERO\n");
            scanf("%d", &scantinato);
            if(scantinato != 0 && scantinato != 1){
                printf("ERRORE, INSERISCI IL NUMERO CORRISPONDENTE A VERO O FALSO\n");
            }
        }while(scantinato == 0 || scantinato == 1);
        return scantinato;
    }
    
    _Bool inserisciGiardino(){
        int giardino;
        do{
            printf("Indica se e' presente il giardino\n");
            printf("[0]FALSO [1]VERO");
            scanf("%d", &giardino);
            if(giardino != 0 && giardino != 1){
                printf("ERRORE, INSERISCI IL NUMERO CORRISPONDENTE A VERO O FALSO\n");
            }
        } while (giardino == 0 || giardino == 1);
        return giardino;
    }
    
    UsoImmobile inserisciUsoImmobile(){
        UsoImmobile usoImmobile;
        do{
            printf("Inserisci l'uso dell'immobile:\n");
            printf("[0]Abitativo [1]Ufficio [2]Locale Commerciale\n");
            scanf("%d",&usoImmobile);
            if(usoImmobile != 0 && usoImmobile != 1 && usoImmobile != 2){
                printf("ERRORE, INSERISCI UN VALORE DELL'ENUMERAZIONE\n");
            }
        }while (usoImmobile == 0 || usoImmobile == 1 || usoImmobile == 2);
        return usoImmobile;
    }
    
    StatoImmobile inserisciStatoImmobile(){
        StatoImmobile statoImmobile;
        do{
            printf("Inserisci lo stato dell'immobile:\n");
            printf("[0]Nuovo [1]Ristrutturato [2]Parzialmente Ristrutturato [3]Da Ristrutturare [4]Rudere\n");
            scanf("%d",&statoImmobile);
            if(statoImmobile != 0 && statoImmobile != 1 && statoImmobile != 2 && statoImmobile != 3 && statoImmobile != 4){
                printf("ERRORE, INSERISCI UN VALORE DELL'ENUMERAZIONE\n");
            }
        } while (statoImmobile == 0 || statoImmobile == 1 || statoImmobile == 2 || statoImmobile == 3 || statoImmobile == 4);
        return statoImmobile;
    }
    
    void calcoloCodiceID(char codiceID[], char regione[], char comune[]){
        int i;
        codiceID[0] = toupper(regione[0]);
        codiceID[1] = toupper(regione[1]);
        codiceID[2] = toupper(comune[0]);
        codiceID[3] = toupper(comune[1]);
        codiceID[4] = rand()%10;
        codiceID[5] = rand()%10;
        codiceID[6] = rand()%10;
        codiceID[7] = rand()%10;
        codiceID[8] = rand()%10;
        printf("E'STATO GENERATO IL CODICE IDENTIFICATIVO:\n");
        for(i=0; i<9; i++){
            printf("%c", codiceID[i]);
        }
    }
    
    void inserisciImmobile(Immobile* immobile){
        immobile->prezzo = inserisciPrezzo();
        immobile->metriQuadri = inserisciMetriQuadri();
        immobile->numeroVani = inserisciNumeroVani();
        immobile->posizioneImmobile = inserisciPosizione();
        calcoloCodiceID(immobile->codiceID, immobile->posizioneImmobile.regione, immobile->posizioneImmobile.comune);
        immobile->numeroVerande = inserisciNumeroVerande();
        immobile->tipologiaImmobile = inserisciTipologia();
        immobile->ascensore = inserisciAscensore();
        immobile->postoAuto = inserisciPostoAuto();
        immobile->scantinato = inserisciScantinato();
        immobile->giardino = inserisciGiardino();
        immobile->usoImmobile = inserisciUsoImmobile();
        immobile->statoImmobile = inserisciStatoImmobile();
    }
    inserimento.h
    #ifndef PROGETTO_B_INSERIMENTO_H
    #define PROGETTO_B_INSERIMENTO_H
    #include "main.h"
    
    void inserisciImmobile(Immobile* immobile);
    
    int inserisciPrezzo();
    float inserisciMetriQuadri();
    int inserisciNumeroVani();
    Posizione inserisciPosizione();
    int inserisciNumeroVerande();
    Tipologia inserisciTipologia();
    _Bool inserisciAscensore();
    _Bool inserisciPostoAuto();
    _Bool inserisciScantinato();
    _Bool inserisciGiardino();
    UsoImmobile inserisciUsoImmobile();
    StatoImmobile inserisciStatoImmobile();
    void calcoloCodiceID(char codiceID[], char regione[], char comune[]);
    
    #endif //PROGETTO_B_INSERIMENTO_H
  • Re: Errore: unknown type name

    Nel main.c

    #include "main.h"


    in main.h

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>



    in inserimento.c

    #include "inserimento.h"


    in inserimento.h

    #include "main.h"
  • Re: Errore: unknown type name

    Ok grazie, avevo messo un #inlcude inserimento.h di troppo in main.h, dove non bisognava metterlo, non me ne ero proprio accorto, grazie mille comunque
Devi accedere o registrarti per scrivere nel forum
13 risposte