Page 1 sur 1
Type de variable dans une structure
Publié : jeu. 28/juin/2007 12:26
par lepiaf31
Bonjour, je voudrais réaliser une structure où le type d'une variable dépend de la valeur d'une autre variable (de la meme structure):
Par exemple, si Type=1 alors le type de 'Variable' est long. Si Type=2 alors le type de 'Variable' est string.
Mais je ne sais pas du tout comment faire
merci a vous
Re: Type de variable dans une structure
Publié : jeu. 28/juin/2007 12:58
par Backup
lepiaf31 a écrit :Bonjour, je voudrais réaliser une structure où le type d'une variable dépend de la valeur d'une autre variable (de la meme structure):
Par exemple, si Type=1 alors le type de 'Variable' est long. Si Type=2 alors le type de 'Variable' est string.
Mais je ne sais pas du tout comment faire
merci a vous
je ferai comme ça :
Code : Tout sélectionner
:)
Structure a
type.b
l.l
b.b
s.s
EndStructure
a.a
CallDebugger
a\ type.b=1
If a\ type=1
a\l=10
Debug a\l ; a type long
ElseIf a\ type=2
a\b=5
Debug a\b ; a type octet
ElseIf a\ type=3
a\s="coucou"
Debug a\s ; a type chaine
EndIf
en clair j'utilise la structure comme un type personalisé (c'est fait pour ça !!

)
dans mon exemple considere
"a\l" comme un "a.l"
"a\b" comme un "a.b"
"a\s" comme un "a.s"
Fred a choisi "" comme symbole alors que dans d'autre language il sagit
bien du "."
Publié : jeu. 28/juin/2007 13:17
par Guimauve
Pour être plus optimisé encore on fait comme suit :
Code : Tout sélectionner
Structure Struct
Name.s
Type.b
StructureUnion
String.s
Long.l
EndStructureUnion
EndStructure
Faîtes un test avec SizeOf() vous allez voir pourquoi.
A+
Guimauve
Publié : jeu. 28/juin/2007 15:52
par minirop
et pourquoi pas utiliser le type VARIANT qui est fait expres pour çà ?
Publié : jeu. 28/juin/2007 16:13
par Backup
minirop a écrit :et pourquoi pas utiliser le type VARIANT qui est fait expres pour çà ?
ha bon ? montre moi un exemple en purebasic !!!

Publié : jeu. 28/juin/2007 17:50
par minirop
je l'ai jamais utiliser mais tu peux aller voir sa structure dans l'explorateur (ALT+S)
Publié : jeu. 28/juin/2007 17:54
par Flype
variant est certes fait pour mais bon il est plutot fait pour s'interfacer avec certaines fonctions windows... c'est particulier quand même. StructureUnion semble plus adapté ici.
Publié : jeu. 28/juin/2007 19:07
par Anonyme
ou bien avec des pointeurs on peut s'en sortir :
Code : Tout sélectionner
Structure Struct
Type.b
*Pointeur.l
EndStructure
Procedure CreateVar(*Var.Struct)
With *var
Select \type
Case 0 : \Pointeur = AllocateMemory(#Long)
Case 1 : \Pointeur = AllocateMemory(#Float)
Case 2 : \Pointeur = AllocateMemory(#Quad)
;etc...
EndSelect
EndWith
ProcedureReturn *Var\Pointeur
EndProcedure
a.Struct
a\Type = 1
Res = CreateVar(a)
PokeF(Res,10.5)
Float.f = PeekF(Res)
Debug Float
Publié : ven. 29/juin/2007 16:51
par lionel_om
Code : Tout sélectionner
Structure Struct
Type.b
*Pointeur.l
EndStructure
Procedure CreateVar(*Var.Struct)
With *var
Select \type
Case 0 : \Pointeur = AllocateMemory(SizeOf(#Long))
Case 1 : \Pointeur = AllocateMemory(SizeOf(#Float))
Case 2 : \Pointeur = AllocateMemory(SizeOf(#Quad))
;etc...
EndSelect
EndWith
ProcedureReturn *Var\Pointeur
EndProcedure
a.Struct
a\Type = 1
Res = CreateVar(a)
PokeF(Res,10.5)
Float.f = PeekF(Res)
Debug Float
Ce n'est pas "AllocateMemory(#Long)", mais AllocateMemory(SizeOf(#Long))"
Lio

Publié : ven. 29/juin/2007 16:55
par minirop
Flype a écrit :StructureUnion semble plus adapté ici.
VARIANT utilise StructureUnion

Publié : ven. 29/juin/2007 17:22
par Anonyme
Structure Struct
Type.b
*Pointeur.l
EndStructure
Procedure CreateVar(*Var.Struct)
With *var
Select \type
Case 0 : \Pointeur = AllocateMemory(SizeOf(#Long))
Case 1 : \Pointeur = AllocateMemory(SizeOf(#Float))
Case 2 : \Pointeur = AllocateMemory(SizeOf(#Quad))
;etc...
EndSelect
EndWith
ProcedureReturn *Var\Pointeur
EndProcedure
a.Struct
a\Type = 1
Res = CreateVar(a)
PokeF(Res,10.5)
Float.f = PeekF(Res)
Debug Float
Ce n'est pas "AllocateMemory(#Long)", mais AllocateMemory(SizeOf(#Long))"
Lio
Ce n'est pas "AllocateMemory(SizeOf(#Long))", mais AllocateMemory(SizeOf(Long))"
Btr

Publié : ven. 29/juin/2007 18:03
par Flype
@Cpl.Bator, @lionel_om
il faut penser aussi à libérer la memoire pour chaque var créé.
@minirop
oui c'est vrai. mais variant est un type windows qui comporte des dizaines de types 'windowzien' pas forcement utile. pour un usage perso, je fais ma propre structure. par contre, lors d'accès à des fonctions windows qui ont besoin d'un variant, ok. ceci dit, si quelqu'un qui cherche tout les types possibles et imaginables, suffit de faire Ctrl+S sur 'VARIANT' dans l'IDE, ya tout ce qui faut.