Programmazione Modulare - Problema definizione variabili

di Frans_94 il
7 risposte
Ragazzi non capisco perchè ma facendo la programmazione modulare non mi riconosce nel file utenti.c la struttura che ho creato, sapreste dirmi se ho sbagliato in qualcosa? il codice è il seguente:

MAIN.C
#define BUFFER_SIZE 1024

//Librerie generali
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <windows.h>

#include "utenti.h"
#include "util.h"


int main(){
	
	titolo();
    
    int scelta;
    utente *testa_Utente = NULL;
    
    //Lettura utenti dal file
    FILE *fpU;
    fpU = fopen("utenti.csv", "r");
    
    testa_Utente = lettura_Utenti(fpU);
	
	 do {
        
        printf("\t \t \t 1. Login \n \n");
        printf("\t \t \t 2. Registrazione \n \n");
        printf("\t \t \t 3. Esci \n \n");
        printf("\t \t \t \t Scelta : ");
        scanf("%d", scelta);
        
        //Ripulisco la schermata
        clear_Console();
        titolo();
        
        switch (scelta) {
        	             
			/* REGISTRAZIONE Utente */   
            case 2:
            	printf("Benvenuto! \n Crea il tuo account \n");
                registrazione_utente(testa_Utente);
                clear_Console();
                titolo();
                break;
                
            default:
                clear_Console();
                titolo();
                break;
        }
        printf("-----------------------------\n");
        
    } while (scelta != 0);
    
    printf("\n");
    return 0;

	
system("PAUSE");
return 0;


}

UTENTI.H
/* utenti.h */

#include "utenti.c"

//Definizione struct UTENTE	
typedef struct utente utente;

extern void registrazione_utente (utente *testa);

extern int lettura_UltimoID(utente *testa_utente);

extern Utente *lettura_Utenti(FILE *fp);
UTENTI.C
/* utenti.c */

#define Char_size 20
 struct utente {
    int id;
    char nome[Char_size];
    char cognome[Char_size];
    char nick[Char_size];
    char password[Char_size];
    int permessi; // livello 1 = utente normale; livello 2 = admin (ha accesso a tutto);
    struct utente *next_Utente; //puntatore al prossimo nodo
};
 
 /*
 * Funzione: registrazione_utente
 * ----------------------------
 *   Permette la registrazione di un nuovo utente, con salvatggio dei dati sul file "utenti.csv" nella struct utente
 *
 *   @param testa : puntatore all'inizio lista utenti, una lista contenente tutte gli utenti caricati dal file "utenti.csv"
 */
 [color=#804080][color=#FF0000]void registrazione_utente (utente *testa) {[/color][/color]
    
	// Puntatori a variabili tipo utente : Salvataggio in TESTA alla lista
	utente *nuovo_Nodo = NULL;
    utente *temp;
    utente *curr, *prec;
    prec = NULL;
    curr = testa;

    nuovo_Nodo = (utente *)malloc(sizeof(utente));
	
	// ? ------------------------------------------
    int ultimoID=0, i; 
	
	//flag test_Input = TRUE : errore inserimento
    bool test_Input = false; 
    bool continua_Inserimento = true;
    //flag per controllare univocità del campo nickname
	bool flag = false; 
    
    // Apertura File con lista utenti
    FILE *fp;
    fp = fopen("utenti.csv", "a+");

	/* Inserimento NOME */
    do {
        test_Input = false;
        printf("\t \t \t Nome: ");
        fgets(nuovo_Nodo -> nome, Char_size, stdin);
        
        // Prima lettera in MAIUSCOLO e ultimo carattere è 0
        nuovo_Nodo->nome[strlen(nuovo_Nodo -> nome) - 1] = 0;
        nuovo_Nodo->nome[0] = toupper(nuovo_Nodo -> nome[0]);
		
		// Campo Nome non compilato
        if (strlen(nuovo_Nodo -> nome) == 0) {
            continua_Inserimento = false;
            clear_Console();
            titolo();
            break;
        }

        if (test_Input == true) {
            clear_Console();
            titolo();
            puts("\t \t \t ----------");
            printf("\t \t \t Attenzione!");
            puts("\t \t \t \n Nome non valido.");
            puts("\t \t \t -----------------------------");
        }

    } while (test_Input == true); // WHILE cicla per vero
    
    /* Inserimento COGNOME */
    if (continua_Inserimento == true) {

        clear_Console();
        titolo();

        do {
            test_Input = false;
        	printf("\t \t \t Cognome: ");
        	fgets(nuovo_Nodo -> cognome, Char_size, stdin);
        
        	// Prima lettera in MAIUSCOLO e ultimo carattere è 0
        	nuovo_Nodo -> cognome[strlen(nuovo_Nodo -> cognome) - 1] = 0;
        	nuovo_Nodo -> cognome[0] = toupper(nuovo_Nodo -> cognome[0]);
		
			// Campo Cognome non compilato
       		if (strlen(nuovo_Nodo -> cognome) == 0) {
            continua_Inserimento = false;
            clear_Console();
            titolo();
            break;
        }
       
        fclose(fp);

        //Inserimento in TESTA
            nuovo_Nodo -> next_Utente = testa;
            testa = nuovo_Nodo;   

        clear_Console();
        titolo();
        printf("\t \t \t Registrazione avvenuta con successo.\n");
        printf("\t \t \t Benvenuto/a %s. \n", nuovo_Nodo -> nome);
        pausa();

    }
}

Ho cercato di ridurre il codice. L'errore sorge sulla stringa in rosso ed è il seguente:
- [Error] unknown type name 'utente'

7 Risposte

  • PRIMO ORRORE CONCETTUALE:

    il file ".c" INCLUDE il file ".h" NON VICEVERSA.


    SECONDO ORRORE CONCETTUALE:

    caso mai l'inclusione del ".c" va messa DOPO le dichiarazioni di tipo. Ma in questo caso NON SERVE che il. c includa il. h

    MA COMUNQUE NON POTRA' MAI funzionare:
    hai:

    . h include. c include. h include. c... all'infinito

    Hai una dipendenza circolare che NON SI DEVE MAI E POI MAI AVERE.
  • Grazie mille per la celere risposta e per avermi evidenziato gli ORRORI. È la prima volta che creo librerie.

    Quindi cosa mi consigli di fare?
  • Vorrei usare questa libreria che ho creato per non appesantire il main di codice
  • Scusami, ma tu non parti studiando dai libri la teoria del linguaggio come hanno fatto tutti?
    Se scrivi a ruota libera del codice senza conoscere le basi è ovvio che ci saranno "orrori" ad ogni linea.

    La programmazione è una cosa seria, non si riesce senza studiare o copiando codice preso da youtube.

    Chiami librerie i .h (che non lo sono), credi di creare librerie ma non lo fai, semplicemente dividi il programma in più moduli .c, includi in modo sbagliato i sorgenti. Tutte nozioni che stanno nei primi capitoli di un libro di c, non bisogna saltarli.
  • Sinceramente mi sono informato su internet, tutto qui! Grazie comunque. Se riesci a darmi qualche dritta, te ne sono grato.
  • La dritta è quella di studiare come fare le inclusioni dei file su un libro di c e lasciare stare internet. Tutto qui
  • Vado subito, grazie ancora per l attenzione!
Devi accedere o registrarti per scrivere nel forum
7 risposte