Newsgroup: it.comp.lang.c++
Titolo: extern per struct

Salve,
in un file ho:
struct Giocatori {...};
Giocatori Giocatore[6];
con che sintassi mi posso riferire a Giocatore[6] da un'altro file?
Ho provato:
extern Giocatori Giocatore[6];
ma non funziona.
Grazie 

Noixe ha scritto:

???? un po' di details please ????
Hai allocato un array di strutture di 6 elementi, quindi
premesso che
1) la struttura Giocatori sia definita in un file .h incluso
  da tutti i tuoi files, altrimenti risuterà sconosciuta ai piu' ;-)
2) Non puoi accedere a Giocatore[6] ma al massimo a Giocatore[5]
    visto che gli indici per 6 elementi partono da 0 fino a 5  ;-)
brix

    visto che gli indici per 6 elementi partono da 0 fino a 5  ;-)
Non sto accedendo al 6 ma indicavo solo la dimensione.
Comunque ho risolto trasformando la struct in
struct {...} Giocatore[6];
ed inserendo negli altri file
extern struct {...} Giocatore[6];
Questa soluzione mi va bene perché non mi serve un nuovo tipo di dato per 
dichiarare altri identificatori ma solo un array di tale tipo di dato.
Ciao 


Devi mettere nel file xyz.h:
struct Giocatori {...};
extern Giocatori Giocatore[6];
A quel punto se includi il xyz.h puoi fare riferimento all'array Giocatore.
NB io avrei chiamato "Giocatore" la struttura e "giocatori" l'array.
E.

 dichiarare altri identificatori ma solo un array di tale tipo di dato.
Ed e' una soluzione pericolosa, sicuramente non consigliabile.
Se hai un tipo di dato comune, devi definirlo in un file di include !
se per caso dovessi aggiungere un qualsiasi campo nella struttura, cosa
fai ? insegui tutte le modifiche ????
Bye
brix
 

 fai ? insegui tutte le modifiche ????
Se lo metto nell'include ne avro' tanti diversi in ogni cpp che include 
l'header e non condivideranno gli stessi valori. 

 Giocatore.
Si, in pratica la struct deve essere definita in tutti i cpp.
Facendo in questo modo invece:
extern struct {...} Giocatore[6];
la struct è definita solo in un cpp. 

   
please ??????
Mi pare che le idee siano un poco confuse ..........
e' solo la definizione della STRUTTURA che metti nell' H !!!!
L' allocazione viene fatta in UN solo modulo sorgente !!!!!!!!!!!
Per esempio se definisco una struttura
typedef struct esempio{
    int pippo;
    int   pluto;
}ESEMPIO_T;
NON ESEGUO UNA ALLOCAZIONE DI MEMORIA!!!!!!!!!!
quindi la metto in un file esempio.h.....
Nel file pippo.cc ALLOCO la mia bella struttura
#include "esempio.h"           //
ESEMPIO_T      la_struttura;          // QUESTA e' l' allocazione di 
memoria!!!!
nel file pluto.cc
#include "esempio.h"           //
extern ESEMPIO_T la_struttura;   /* :-) */
Ciao
brix

 L' allocazione viene fatta in UN solo modulo sorgente !!!!!!!!!!!
Per definizione io intendo la struct senza typedef, se tu intendi invece la 
creazione di un alias è un'altro discorso.
In ogni caso la soluzione che ho trovato inizialmente va bene perché lavoro 
solo sulla struct del cpp principale e negli altri uso extern, senza nemmeno 
tener conto dell'header.
Ciao. 

   
Contento te.
ciao


Ascolta il consiglio che ti viene dato. Se duplichi la definizione della 
struct in ogni file .cpp senza includerla in un file comune vai incontro 
ad un rischio molto alto di trovarti con un bug veramente difficile da 
scovare.
E.

 scovare.
Lo so ma in questo programma ho solo due moduli cpp :)
Ciao 

Noixe ha scritto:

Guarda che il verbo "definire" in C++ (e anche in C) ha un significato 
ben preciso!
Mi sembra che tu lo confonda con "dichiarare" (che ha un altro 
significato ben preciso).
In soldoni una "dichiarazione" specifica come è fatto un tipo (o il 
prototipo di una funzione) ma non comporta di allocare nessuna memoria 
(ne dati ne codice) e tipicamente sta in un file header.
La "definizione" invece comporta di allocare la memoria per un oggetto 
di un determinato tipo (o di definire il corpo di una funzione) e di 
solito si fa in un file cpp.
GM

 ha scritto:

"Due" sono tantissimi in termini di design.

 ben preciso).
No
Infatti brix99luftballons ha scritto quanto segue:
"1) la struttura Giocatori sia definita in un file .h incluso
  da tutti i tuoi files, altrimenti risuterà sconosciuta ai piu' ;-)"
Poi dopo ha specificato che con "definita" intendeva l'uso di typedef. 

 "Due" sono tantissimi in termini di design.
Si ma a questo punto, prima di mettere mano all'editor, bisognerebbe fare 
un'analisi del problema e solo alla fine scrivere il codice.
Siccome si tratta di un programmino per uso quasi personale non mi sembra il 
caso, anche perché forse lo sviluppo è durato meno di quanto durerebbe 
un'analisi :)
Ciao 

   
Sorry :-(
In effetti doveva essere "dichiarata" nel .h e "definita" in solo modulo ...
brix

 un'analisi :)
Noto che hai l'antipatica abitudine di ribattere a tutti i buoni
consigli che ti vengono dati con i tuoi "sì, ma...".
Esistono delle regole di buona programmazione che si possono applicare
anche a programmi semplici. Se si può fare, non si capisce bene perché
non si debba fare. Non è in fin dei conto troppo oneroso offrire al
proprio codice un certo grado di generalità. Almeno ammetti che il tuo
non è il modo migliore di programmare e che non sei poi così
interessato a cambiarlo.

Noixe ha scritto:

Hai ragione, era brix99luftballons a mescolare definire e dichiarare

 sei poi così interessato a cambiarlo.
Umh... non mi pare di aver detto che la mia metodologia sia la migliore, e 
sono disposto a seguire correttamente le regole sono nel momento in cui si 
dovesse prospettare la realizzazione di progetti di un certo livello, 
soprattutto se in team, ma non credo capiterà.
Ciao 

 ma dipende quanto cosa attuarle.
Precisamente.
Quando il costo e', come nel caso presente, notevolmente piu' basso
della scrittura di tre risposte di difesa inutile di posizioni
insostenibili, la mia opinione e' che si faccia piu' bella figura a
ringraziare e scrivere una decina righe di include, di cui alcune di
copia e incolla, 3 di codice generabile con macro, e 4 di spazi vuoti,
proprio per voler essere eleganti. Nota che l'unica riga di questo
costosissimo design che dovrai scrivere a mano e':
#include "DichiarazioneStruttura.h"
due volte. La seconda pero' puo' essere ancora un copia e incolla.
--*PaN!*
 
-- 
I'm using an evaluation license of nemo since 263 days.
You should really try it!
http://www.malcom-mac.com/nemo

 due volte. La seconda pero' puo' essere ancora un copia e incolla.
Eh eh, dimentichi il codice esistente che devo togliere. 

Scusa Noixe,
Noixe  ha scritto:
 > Siccome si tratta di un programmino per uso quasi personale non mi 
sembra il
 > caso, anche perché forse lo sviluppo è durato meno di quanto durerebbe
 > un'analisi :)
se fossi stato in te, avrei seguito il consiglio, anche perche' avresti 
gia' finito, anziche' stare qui a dibattere e avresti imparato una buona 
prassi di programmazione.
Perdonami la franchezza.
Luca.

 un'analisi :)
Probabilmente non hai capito la natura dell'errore a cui rischi di 
andare incontro. Il tuo è veramente un caso dei più subdoli che possano 
capitare, e chi ti avverte lo fa, evidentemente, perché ci è già passato.
Se sei sicuro che non modificherai più il codice, compilalo e butta il 
sorgente. Se invece decidi di mantenere il sorgente vuol dire che c'è la 
remota possibilità che prima o poi tu ci metta nuovamente le mani. 
Allora è meglio se lo correggi. Se ti da fastidio creare un terzo file 
puoi anche mettere tutto in un unico file, sarà meno elegante ma almeno 
è più sicuro.
E.