Oppure

Loading
09/09/17 20:16
AldoBaldo
Ricordo d'aver letto che si può anche (non si deve) definire una variabile globale con l'attributo extern direttamente in un file di intestazione, a patto di dichiararla e inizializzarla in uno qualsiasi dei file di implementazione che includano il file di intestazione stesso.

Ad esempio, potrei definire la variabile...

extern int gPincoPalla;

...nel file mia_intestazione.h, quindi dichiarare la variabile...

int gPincoPalla = 24;

...nel file mia_implementazione.c che include il file mia_intestazione.h.

La stessa variabile si può anche utilizzare (senza nessun ulteriore "richiamo" esplicito) anche nei file mio_secondo_file.c e mio_terzo_file.c, a patto che entrambi includano mia_intestazione.h.

Ho già provato a fare diverse volte qualcosa del genere ed è sempre filato tutto liscio come l'olio. E' davvero pratico.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
09/09/17 20:49
perillitommaso
Allora questo è l'header file:
#ifndef STRUTTURE_H_
#define STRUTTURE_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>

/*Inizio Costanti*/

/*Costanti per il RecommenderSystem*/
#define UTENTI 5 //costante numero di utenti simili da considerare per il recommender system
#define FILM 3 //numero di film/serie tv da considerare per il recommender system

/*Costanti per i file usati*/
#define FILEFILM "Film.txt" /*File che contiene i film della piattaforma*/
#define FILESERIETV "SerieTv.txt" /*File che contiene le serie tv della piattaforma*/
#define FILEUTENTI "Utenti.txt" /*File che contiene gli iscritti della piattaforma*/
#define FILEADMIN "Admin.txt" /*File che contiene le informazioni sugli admin della piattaforma*/
#define FILEPREFERENZE "Preferenze.txt" /*File che contiene le preferenze di ogni utente*/
#define FILELAVORO "Lavoro.txt" /*File di lavoro utile per algoritmi utilizzati nel programma*/
#define FILEFEEDBACK "FeedBack.txt" /*File che contiene le segnalazioni degli utenti*/
#define FILEDISTRIBUZIONE "Distribuzioni.txt" /*File che contiene le distribuzioni cinematografiche*/
#define DOMINIEMAIL "DominiEmail.txt" /*File che contiene i domini email possibili su questa piattaforma*/
#define FILENAZIONI "Nazioni.txt" /*File che contiene tutte le nazioni possibili*/
#define FILEGENERI "Generi.txt" /*File che contiene tutti i generi cinematografici*/

/*Costanti per l'utente/admin*/
#define NOME 30
#define COGNOME 30
#define USERNAME 20
#define PASSWORD 8
#define EMAIL 30
#define TELEFONO 10

/*Costanti per le segnalazioni*/
#define FEEDBACK 145
#define ANSWER 200

#define MENU 0//Costante che individua il menù

/*Costanti per il calcolo del tempo trascorso sulla piattaforma*/
#define GIORNO 1440 //giorno espresso in minuti
#define ORA 60//ora espressa in minuti
#define ANNO 525600 //anno espresso in minuti

/*Costanti per i film/serietv*/
#define TITOLO 20
#define GENERE 20
#define NAZIONE 20
#define REGISTA 20
#define DISTRIBUZIONE 30
#define ATTORI 60
#define TRAMA 500

/*Fine Costanti*/

/*Inizio tipi di dati*/

struct Utente_Admin{
	unsigned int Id;
	char Nome[NOME];
	char Cognome[COGNOME];
	char Username[USERNAME];
	char Password[PASSWORD];
	char Email[EMAIL];
	char Telefono[TELEFONO];
};

struct FeedBack{
	unsigned int iduser;
	char feedback[FEEDBACK];
	char answer[ANSWER];
	unsigned int letto; // 3 valori: 0= admin non ha visualizzato; 1=admin ha visualizzato e ha risposto; 2= utente ha visualizzato la risposta
};

struct Preference{
	unsigned int idUser;
	unsigned int scelta;// 2: film; 1: serie tv
	unsigned int idFilmSerieTv;
	int voto;
	char genere[GENERE];
};

struct Film_SerieTv{
	unsigned int Id;
	char Titolo[TITOLO];
	char Genere[GENERE];
	char Nazione[NAZIONE];
	char Regista[REGISTA];
	char Distribuzione[DISTRIBUZIONE];
	char Attori[ATTORI];
	unsigned int Anno;
	unsigned int Durata;
	char Trama[TRAMA];
	unsigned int Stagioni;
	unsigned int Episodi;
	unsigned int Num_Visualizzazioni;
	float voto;
};

struct RecommenderSystem{
	int idFilmSerieTv;
	int visto;
};

/*Fine tipi di dato*/


extern unsigned int idUser;//Variabile che memorizza l'id dell'utente che ha effettuato l'accesso
extern unsigned int AnnoAttuale;


#endif /* STRUTTURE_H_ */


Quindi devo dichiarare le due variabili globali extern e poi in ogni source file che ne fa uso devo solo inizializzarle? Oppure mi basta inizializzarle nel main ?

Nota Bene: Ho provato a inizializzare le due variabili globali negli altri source file e mi da errore, quindi credo che dovrei lasciare il mondo come sta dato che di default le variabili extern sono inizializzate a 0 ( quello che voglio appunto )
Ultima modifica effettuata da perillitommaso 09/09/17 21:03
aaa
09/09/17 23:39
Mikelius
Chiamo in causa qualcuno più preparato, io so che:
L'importante è che sia "DEFINITA" in uno solo, e "DICHIARATA" in tutti gli altri come extern
poi, l header verà incluso dentro i source, quindi non dovrebbe cambiare se metterla li o in un *.c .
Il problema risiede quando includi nel source file, in cui definisci una variabile, includi anche l header dove è dichiarata extern, creado una sorta di doppia dichiarazione.

@perillitommaso ti ricordo che le stringhe finiscono tutte con il carattere 'Chiamo in causa qualcuno più preparato, io so che:
L'importante è che sia "DEFINITA" in uno solo, e "DICHIARATA" in tutti gli altri come extern
poi, l header verà incluso dentro i source, quindi non dovrebbe cambiare se metterla li o in un *.c .
Il problema risiede quando includi nel source file, in cui definisci una variabile, includi anche l header dove è dichiarata extern, creado una sorta di doppia dichiarazione.

@perillitommaso ti ricordo che le stringhe finiscono tutte con il carattere '{parsed_message}' , quindi devi dichiarare le stringhe (Array di char) tenendo conto di 1 carattere in più di quello che vuoi tu.' , quindi devi dichiarare le stringhe (Array di char) tenendo conto di 1 carattere in più di quello che vuoi tu.
Ultima modifica effettuata da Mikelius 09/09/17 23:44
aaa
10/09/17 5:47
AldoBaldo
Mikelius, hai ragione! Avrò già controllato e ricontrollato non so quante volte questo particolare, ma mi faccio sempre ingannare nell'uso dei due termini. Devo avere qualche neurone che fa contatto in modo ballerino, perché per qualche ragione dovrei controllare ogni volta (pensa che prima di scrivere la risposta precedente son stati lì a ponderare ben bene su come usare i termini... poi ho sbagliato per l'ennesima volta). Chiedo venia.
Ultima modifica effettuata da AldoBaldo 10/09/17 5:47
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
10/09/17 13:40
perillitommaso
Attualmente, con l'header impostato come ho mostrato nel commento di prima, il compilatore non mi rileva nessun errore sintattico quindi potrebbe andare bene così, l'importante è che le variabili esterne siano visibili in tutti i Source File dato che in quasi tutti le uso, vi terrò aggiornati comunque :)
aaa