Type de variable dans une structure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Type de variable dans une structure

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Type de variable dans une structure

Message 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 "."
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

et pourquoi pas utiliser le type VARIANT qui est fait expres pour çà ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !!! :?
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

je l'ai jamais utiliser mais tu peux aller voir sa structure dans l'explorateur (ALT+S)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
Anonyme

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

Flype a écrit :StructureUnion semble plus adapté ici.
VARIANT utilise StructureUnion :wink:
Anonyme

Message 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:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
Répondre