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):

Code : Tout sélectionner

Structure Struct
  Name.s
  Type.b
  Variable
EndStructure
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):

Code : Tout sélectionner

Structure Struct
  Name.s
  Type.b
  Variable
EndStructure
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 !! :D)

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 :wink:

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

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 :wink:

Ce n'est pas "AllocateMemory(SizeOf(#Long))", mais AllocateMemory(SizeOf(Long))"

Btr :wink:

Publié : ven. 29/juin/2007 18:03
par Flype
@Cpl.Bator, @lionel_om
:lol:

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.