Mah.... guarda.... la sostanza sta tutta qua:
"
In other words, unless you talk to a C shared-library through the Extern
keyword, you should not use structures. "
In effetti, come ha ben intuito
sotema, Minisini (ma anche altri, come ho riportato) ritiene sia più opportuno utilizzare le risorse più propriamente
native del linguaggio Gambas.
Lui non può, però, negare la
concessione di un uso delle
Strutture (più proprie del C ) nei casi di gestione di librerie esterne. Infatti - come in modo un po' forte ti risposi in questa discussione - passare a funzioni esterne scritte in C una risorsa come un array di tipo
Variant, significa non conoscere i sorgenti (....scritti in C
fra l'altro !) del linguaggio Gambas.
La
Struttura del linguaggio C, in fondo, è un elemento semplice, un'area di memoria riservata, nella quale si allineano uno dopo l'altro vari membri in base al loro tipo di dato. Il problema gigantesco (questo sì che è un "problema" di Gambas) è che Gambas non riesce - o meglio, non sempre, non in tutti i casi riesce - a gestire precisamente le
Strutture passate o da passare ad una funzione esterna scritta in C. Questa è una delle ragioni principali per la quale Tobias Boege ritiene opportuno creare in tali casi un apposito Componente di Gambas scritto in C.... io però appartengo ad un'altra scuola di pensiero, secondo la quale devi essere tu programmatore in questi casi difficili a conciliare in qualche modo tutto e a calcolare gli esatti allineamenti e compensazioni.
Su questo argomento ho abbozzato questi due
mattoni micidiali:
http://www.gambas-it.org/wiki/index.php?title=Gestire_con_sicurezza_le_Strutture_esternehttp://www.gambas-it.org/wiki/index.php?title=Gestire_con_un_Puntatore_le_Strutture_esterneIn Gambas il suo
Variant è definito da un paio di
Strutture:
/* Gambas VARIANT datatype definition */
typedef
struct {
GB_TYPE type;
union {
char _boolean;
unsigned char _byte;
short _short;
int _integer;
int64_t _long;
float _single;
double _float;
GB_DATE_VALUE _date;
char *_string;
intptr_t _pointer;
void *_object;
int64_t data;
}
value;
}
PACKED
GB_VARIANT_VALUE;
typedef
struct {
GB_TYPE type;
GB_VARIANT_VALUE value;
#if __WORDSIZE == 64
int64_t _pad;
#endif
}
GB_VARIANT;
comprensibili solo da gambas.