Errore 'conflicting type'

di il
17 risposte

Errore 'conflicting type'

Ciao a tutti!
Sono nuova nel Forum e vorrei gentilmente chiedervi aiuto, è tutto il pomeriggio che sto impazzendo su 2 errori che mi da' il compilatore,
il primo è: conflicting types for 'GeneraData'
il secondo è: unknown type name 'data'

VI ALLEGO CODICE
(Premetto che sto facendo pratica con le librerie create da me, quindi il main che allegherò è solo una prova che volevo fare)

CODICE LIBRERIA 'random.h'


#ifndef RANDOM_H_
#define RANDOM_H_



int GeneraMese ();

int GeneraGiorno (int mese);

int GeneraAnno ();

data GeneraData ();

char* GeneraNome ();

char* GeneraCognome ();

char* GeneraMail (char* nome, char* cognome);

char* GeneraPassword ();

int GeneraEta ();

float GeneraAltezza ();

int GeneraPeso ();

#endif /* RANDOM_H_ */

CODICE FILE .c RIGUARDANTE LA LIBRERIA


#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "random.h"

#define ANNO_MAX 2000 // anno minimo che può essere generato random (ho scelto 2000 in modo che ogni utente deve essere almeno maggiorenne)
#define ANNO_MIN 1950 // anno max che può essere generato
#define MAX_COGNOMI 17 //indice max che può essere generato per i cognomi
#define MIN 0 //indice min che può essere generato
#define MESE_MAX 12 //anno max che può essere generato random
#define MESE_MIN 1 //anno min che può essere generato random
#define GIORNO_MIN 1 //GIORNO MIN PER RANDOMIZZARE I GIORNI
#define GIORNO_MAX_MESI31 31 //GIORNO MAX PER RANDOMIZZARE GIORNI PER MESI
#define MAX_DOMINI 9 //indice max dei domini che possono essere generati
#define MIN 0 //indice min che può essere generato
#define ASCII_MAX 126
#define ASCII_MIN 33
#define LUNG_PWD 9
#define MAX_ETA 120
#define MIN_ETA 18
#define MAX_PESO 150
#define MIN_PESO 40
#define MAX_ALTEZZA 200
#define MIN_ALTEZZA 100

//definizione tipo data con giorno, mese e anno come interi
typedef struct {
	int giorno;
	int mese;
	int anno;
} data;


int GeneraAnno (){
	//generazione random anno
	return rand () % ( ANNO_MAX - ANNO_MIN + 1) + ANNO_MIN;
}


int GeneraMese (){
	//genero un indice random che mi servirà per scegliere un mese randomicamente
	return rand () % (MESE_MAX - MESE_MIN + 1) + MESE_MIN;
}



int GeneraGiorno (int mese){
	switch ( mese ) { //controllo sulla correttezza complessiva della data (febbraio, mesi di 30 gg e mesi di 31gg)

		//generazione random giorno per febbraio
		case 2:
			return rand () % ((GIORNO_MAX_MESI31 - 3) - GIORNO_MIN + 1) + GIORNO_MIN;
			break;

		//generazione random giorno per mesi di 30 gg
		case 4:
		case 6:
		case 9:
		case 11:
			return rand () % ((GIORNO_MAX_MESI31 - 1) - GIORNO_MIN + 1) + GIORNO_MIN;
			break;

		//generazione random giorno per mesi di 31 gg
		default:
			return rand () % (GIORNO_MAX_MESI31 - GIORNO_MIN + 1) + GIORNO_MIN;
			break;
		}
}

char* GeneraCognome (){
	char* cognomi[]= {"Stragapede", "Silletti", "Turchiano", "Matera", "Colucci", "Portacci", "Rossi", "Verdi", "Bianchi",
		"Russo", "Ferrari", "Esposito", "Marino", "Greco", "Bruno", "Mancini", "Conti"}; //array di cognomi che possono essere generati randomicamente

	int rand_cognome= rand () % ( MAX_COGNOMI - MIN + 1 ) + MIN; //genero un indice random che mi servirà per scegliere un cognome randomicamente

	return cognomi [rand_cognome];
}

data GeneraData (){
	data data;
	data.mese = GeneraMese();
	data.anno = GeneraAnno();
	data.giorno = GeneraGiorno(data.mese);

	return data;
}


char* GeneraMail (char* nome, char* cognome){
	char* email = "";
	char* domini []= {"@gmail.com", "@live.com", "@outlook.com", "@libero.it", "@yahoo.com", "@aruba.it", "@msn.com", "@hotmail.com", "@hotmail.it"};

	// dichiarazione array di domini che possono essere generati randomicamente
	int rand_dominio= rand () % ( MAX_DOMINI - MIN + 1 ) + MIN; //genero un indice random che mi servirà per scegliere un dominio randomicamente

	strcat (email, nome); //metto il nome nella variabile vuota contenitore
	strcat (email, cognome); //concateno il cognome alla variabile contenitore
	strcat (email, domini[rand_dominio]); //concateno il dominio generato randomicamente alla variabile contenitore

	return email;
}


char* GeneraPassword () {
	char* password = "";
	int seed = time (NULL);

	srand (seed);

	for ( int i = 0; i < LUNG_PWD - 1; i++ ){
		password[i] = rand () % (ASCII_MAX - ASCII_MIN + 1) + ASCII_MIN;
	}

	return password;
}

int GeneraEta (){
	int seed = time (NULL);
	srand (seed);
	return rand() % ( MAX_ETA - MIN_ETA + 1 ) + MIN_ETA ;
}

float GeneraAltezza (){
	int seed = time (NULL);
	srand (seed);
	int random_altezza = rand() % ( MAX_ALTEZZA - MIN_ALTEZZA + 1 ) + MIN_ALTEZZA ;
	float altezza = ((float)random_altezza) / 100;
	return altezza;
}

int GeneraPeso (){
	int seed = time (NULL);
	srand (seed);
	return rand() % ( MAX_PESO - MIN_PESO + 1 ) + MIN_PESO;
}

CODICE MAIN

#include <stdio.h>
#include <stdlib.h>
#include "random.h"

int main (){
	int eta = 0, peso = 0, max_eta_over40 = 0, max_eta_under40 = 0, max_peso_over40 = 0, max_peso_under40 = 0;
	float altezza = 0.0, BMI = 0.0, max_altezza_over40 = 0.0, max_altezza_under40 = 0.0, BMI_medio_under40 = 0.0, BMI_medio_over40 = 0.0;

	eta = GeneraEta();

	printf ("Eta: %d", eta);
}
Grazie a chi mi risponderà

17 Risposte

  • Re: Errore 'conflicting type'

    Il "Conflicting types" credo derivi dal fatto che hai dato lo stesso nome del tipo di dato alla variabile:
    data GeneraData (){
    	data data;
    	data.mese = GeneraMese();
    Devi distinguere il tipo di dato dalla variabile. Ad esempio
    data GeneraData (){
    	data miadata;
    	miadata.mese = GeneraMese();
    ecc. Poi il tipo di dato 'data' lo devi mettere in un .h se vuoi che lo vedano tutti i file, e mi sembra di capire che lo hai definito in 'file.c', mentre in 'random.h' non ce n'è traccia. Quindi il compilatore quando fa l'include di 'random.h' trova una dichiarazione con un tipo che non conosce (data).
    O lo definisci in 'random.h' o lo dichiari come extern, sempre in random.h.
  • Re: Errore 'conflicting type'

    Andrea Quaglia ha scritto:


    Il "Conflicting types" credo derivi dal fatto che hai dato lo stesso nome del tipo di dato alla variabile:
    data GeneraData (){
    	data data;
    	data.mese = GeneraMese();
    Devi distinguere il tipo di dato dalla variabile. Ad esempio
    data GeneraData (){
    	data miadata;
    	miadata.mese = GeneraMese();
    ecc. Poi il tipo di dato 'data' lo devi mettere in un .h se vuoi che lo vedano tutti i file, e mi sembra di capire che lo hai definito in 'file.c', mentre in 'random.h' non ce n'è traccia. Quindi il compilatore quando fa l'include di 'random.h' trova una dichiarazione con un tipo che non conosce (data).
    O lo definisci in 'random.h' o lo dichiari come extern, sempre in random.h.
    non cambia nulla, anzi se sposto la definizione del tipo nel random.h mi genera altri errori
  • Re: Errore 'conflicting type'

    Dove l'hai spostato esattamente?
  • Re: Errore 'conflicting type'

    oregon ha scritto:


    Dove l'hai spostato esattamente?
    ecco:
    
    
    #ifndef RANDOM_H_
    #define RANDOM_H_
    
    typedef struct {
    	int giorno;
    	int mese;
    	int anno;
    } data;
    
    int GeneraMese ();
    
    int GeneraGiorno (int mese);
    
    int GeneraAnno ();
    
    data GeneraData ();
    
    char* GeneraNome ();
    
    char* GeneraCognome ();
    
    char* GeneraMail (char* nome, char* cognome);
    
    char* GeneraPassword ();
    
    int GeneraEta ();
    
    float GeneraAltezza ();
    
    int GeneraPeso ();
    
    #endif /* RANDOM_H_ */
    
    
    e mi da errori su tutte le funzioni anche se definisco prima dell'#ifndef
  • Re: Errore 'conflicting type'

    Quali errori?
  • Re: Errore 'conflicting type'

    oregon ha scritto:


    Quali errori?
    Questo è il primo:
    
    
    multiple definition of `GeneraAltezza';
    
    
    questo è il secondo:
    
    
    src\random.o: in function `GeneraAnno':	
    
    
    e si ripetono per tutte le funzioni della libreria
  • Re: Errore 'conflicting type'

    E' un errore che non c'entra nulla con la typedef che hai spostato.

    Sicura che non hai altri file nel progetto? Con cosa compili?
  • Re: Errore 'conflicting type'

    oregon ha scritto:


    E' un errore che non c'entra nulla con la typedef che hai spostato.

    Sicura che non hai altri file nel progetto? Con cosa compili?
    sisi sicurissima, compilo con eclipse...

    sto impazzendo su questi problemi da stamattina.. ora ho rimesso la definizione del tipo nel random.c e mi dà solo il problema "unknown type name ..."
  • Re: Errore 'conflicting type'

    Stellina97 ha scritto:


    compilo con eclipse...

    sto impazzendo
    Ecco hai detto tutto

    1) rifai il progetto da zero
    2) cambia IDE
  • Re: Errore 'conflicting type'

    Eclipse e gcc?

    Comunque no ... a parte tanti altri errori che vedrai dopo, questo non c'è compilando con altri compilatori.

    Ho provato.
  • Re: Errore 'conflicting type'

    oregon ha scritto:


    Eclipse e gcc?

    Comunque no ... a parte tanti altri errori che vedrai dopo, questo non c'è compilando con altri compilatori.

    Ho provato.
    perfetto, quindi ora provo a rifare tutto daccapo.. se ancora non va, solo per questo progetto cambio compilatore..ù

    Grazie mille a tutti!!
  • Re: Errore 'conflicting type'

    Weierstrass ha scritto:


    Stellina97 ha scritto:


    compilo con eclipse...

    sto impazzendo
    Ecco hai detto tutto

    1) rifai il progetto da zero
    2) cambia IDE
    Magari potessi cambiare IDE! Purtroppo il prof vuole che venga usato eclipse perché ci sono dei tool che devono essere usati durante l'esame
  • Re: Errore 'conflicting type'

    A parte la questione dell'IDE, la segnalazione di multiple definition di GeneraAltezza è comunque strana.

    Hai cercato nei sorgenti GeneraAltezza per capire se è presente più volte la funzione?

    Al limite, fai uno zip del progetto con tutti i file e mettilo su un sito da dove scaricarlo.
  • Re: Errore 'conflicting type'

    oregon ha scritto:


    A parte la questione dell'IDE, la segnalazione di multiple definition di GeneraAltezza è comunque strana.

    Hai cercato nei sorgenti GeneraAltezza per capire se è presente più volte la funzione?

    Al limite, fai uno zip del progetto con tutti i file e mettilo su un sito da dove scaricarlo.
    Ho preso i 3 file, li ho messi in una directory e scritto un makefile al volo. Nessun errore (a parte millemila warning di 'unused variable') e la funzione di test (GeneraEta) funziona.
    E' Eclipse che mettendo le cose a modo suo, quando non fai le cose a modo (suo) si mette a sclerare. Nella fattispecie, un 'Clean..." dal menu 'Project' forse avrebbe risolto.
Devi accedere o registrarti per scrivere nel forum
17 risposte