Newsgroup: it.comp.lang.c++
Titolo: Struttura di dati non visibile dai moduli VCL

Aiuto!
Ho un problema con una struttura di dati in un file "settings.h" che devo 
rendere visibile da tutto il codice.
La struttura è grande, ma la riassumo così:
	struct Daticomuni
	{
	char path_file_1 [ 200 ];
	int file_presente;
	float perc_impostata;
	int primo_attuale;
	...
	}DATICOMUNI;
Devo renderla visibile a tutti gli altri moduli .cpp e .h (ne ho diversi) in 
modo da poterli utilizzare da qualsiasi modulo.
Non vedo la partenza del programma ( il WinMain ) , in quanto sto 
utilizzando il Borland Builder con i moduli "VCL".
Tentativi già effettuati:
- Ho provato ad #includere questo modulo in testa al primo modulo VCL, ma 
negli altri moduli i dati non risultano definiti.
- Ho provato ad #includere questo modulo in testa a tutti i moduli VCL, ma 
il compilatore sostiene che ho definito piu' volte gli stessi dati.
- Ho provato ad utilizzare dei comandi per il linker, come si fa nelle 
librerie :
  #ifndef SETTINGS
  #define SETTINGS
	struct Daticomuni
	{
	char path_file_1 [ 200 ];
	int file_presente;
	float perc_impostata;
	int primo_attuale;
	...
	}DATICOMUNI;
  #endif
- Ho provato a dichiarare come esterno tutto il file da tutti i moduli VCL:
  #extern "C"
	{
	#include "settings.h"
	}
  il compilatore non ha molto gradito. Anche ignorandolo, non potevo 
comunque utilizzare questi dati perchè le modifiche fatte da un modulo non 
influenzavano gli stessi dati quando ero in un altro. ( Probabilmente c'è 
semplicemente una copia della stessa struttura per ogni modulo )
- Ho provato a fare come si fa per gli interi, ovvero ho messo in tutti i 
moduli:
  #extern DATICOMUNI;  oppure  #extern DATICOMUNI Daticomuni;
  o equivalenti, ma non sono riuscito a convincerlo.
- Ho provato inserendo "static", o aggiungendo "typedef" davanti alla 
dichiarazione della struttura, ma niente da fare.
--- Risultato finale:  picche! ---
Sto solo chiedendo al compilatore di tenersi in memoria una struttura in 
modo da poterla utilizzare da dovunque! Non mi sembra una cosa così strana!
Non posso proprio continuare il mio programma se non ho un'area comune dove 
ho dei dati visibili ed utilizzabili da dovunque. E non posso neanche 
realizzare il programma senza le VCL, perchè ci metterei troppo.
Probabilmente mi sto perdendo in un bicchier d'acqua, ma non so proprio 
trovare il trucco per risolvere questo problema.
Se qualcuno ha una qualche idea...sarà la benvenuta!																      Un 
insonne
_________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at 
http://www.hotmail.com
.
-- 
Posted from [62.110.105.41] by way of 
f238.law14.hotmail.com
 [64.4.21.238] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

utilizzando il Borland Builder con i moduli "VCL".
Perche' non lo vedi ?
Se vai su Project/View Source te lo fa vedere.

 modo da poterla utilizzare da dovunque! Non mi sembra una cosa così strana!
No. Dichiarala in tutti i moduli e definiscila in uno solo. Semplice.
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

   #endif
Devi distinguere la definizione della struttura ( struct Daticomuni {...}; 
) dalla definizione della variabile( struct Daticomuni DATICOMUNI; ); per 
cui
// settings.h
// definizione del tipo di dato
#ifndef SETTINGS
#define SETTINGS
struct Daticomuni {
....
};
#endif
// definizione della variabile
extern struct Daticomuni DATICOMUNI;
// end settings.h
// settings.c
#include "setting.h"
struct Daticomuni DATICOMUNI;
// end settings.c
In questa maniera tutti i file avranno un riferimento extern ad una 
variabile DATICOMUNI di tipo Daticomuni. In piu' il file "settings.c" 
conterra' l'istanza della variabile. ( E' l'unico punto in cui la variabile 
DATICOMUNI   *NON* e' dichiarata extern ).

WinMain. Ed e' in questo codice che andrai a inizializzare la tua struttura.
L'inizializzazione e' fattibile sia nel corpo del WinMain, sia allo
scatenarsi dell'OnCreate del form principale (che e' il primo che
viene creato con Application.CreateForm nel WinMain).