Page 1 sur 2

[Non Résolu] Création d'une variable par des arguments

Publié : ven. 17/févr./2012 15:15
par Robrock55
Bonjour, ou bonsoir ou bon appétit.

Le titre est peut-être pas très explicite. J'explique mon problème :
Je veux faire une procédure qui créé une variable selon un argument de cette procédure.

Avec procedure(nombre) par exemple, comment faire pour que je puisse avoir variable qui s'appelle si le nombre est 3, variable3 ?

J'espère avoir été compris.

Cordialement,

Robrock55

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 15:19
par Ar-S
ça ?

Code : Tout sélectionner

Procedure.s SetNumVariable(NumVariable.i)
  ProcedureReturn "variable"+Str(NumVariable)
EndProcedure

Debug SetNumVariable(58) 

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 16:10
par Robrock55
Et pour intéragir avec cette variable ?

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 16:21
par Ar-S
Robrock55 a écrit :Et pour intéragir avec cette variable ?
Je ne comprends pas ce que tu veux dire ?

ça ?

Code : Tout sélectionner

Procedure.s SetNumVariable(NumVariable.i)
  Shared MaVariable.s
  MaVariable = "variable"+Str(NumVariable)
	ProcedureReturn MaVariable
EndProcedure


M.s = SetNumVariable(58)
Debug M 
 
Explique ce que tu veux que ton code fasse si c'est pas ça.

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 17:13
par Demivec

Code : Tout sélectionner

NewMap monVars()
Procedure.s CreateNumVariable(NumVariable.i)
  Shared monVars()
  If Not FindMapElement(monVars(), "variable" + Str(NumVariable))
    AddMapElement(monVars(), "variable" + Str(NumVariable))
  EndIf 

  ProcedureReturn MapKey(monVars())
EndProcedure

Define.s a, b, c

a = CreateNumVariable(58)
b = CreateNumVariable(23)
Debug a ;variable58
Debug b ;variable23

monVars(a) = 3
monVars(b) = 12

Debug a + " = " + Str(monVars(a)) ;3
monVars(a) + 5
Debug a + " = " + Str(monVars(a)) ;8
monVars(a) = monVars(a) + monVars(b)

Debug a + " = " + Str(monVars(a)) ;20
Debug b + " = " + Str(monVars(b)) ;12

c = b
Debug c ;variable23
Debug c + " = " + Str(monVars(c)) ;12
Ce probablement n'est pas pour Débutants. :)


Vous pouvez également utiliser un tableau:

Code : Tout sélectionner

Dim monVars(100)

Define.i a, b, c ;indice

a = 58 
b = 23 
Debug a ;58 ;indice
Debug b ;23 ;indice

monVars(a) = 3
monVars(b) = 12

Debug "var" + Str(a) + " = " + Str(monVars(a)) ;3
monVars(a) + 5
Debug "var" + Str(a) + " = " + Str(monVars(a)) ;8
monVars(a) = monVars(a) + monVars(b)

Debug "var" + Str(a) + " = " + Str(monVars(a)) ;20
Debug "var" + Str(b) + " = " + Str(monVars(b)) ;12

c = b
Debug c ;23 ;indice
Debug "var" + Str(c) + " = " + Str(monVars(c)) ;12

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 17:30
par dayvid
Je dois avouer que cette question est très intéressante :P

Moi je serais passer par un fichier texte ! :idea:

Mais ceci est très utile pour crée sa propre variable (Nom + Valeur)

Ce sujet est a développer car très intéressant :wink:

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 18:13
par G-Rom
J'espère avoir été compris.
Oui, les variables n'existe plus une fois le programme compilé , tu peut néanmoins passer par les macros :

Code : Tout sélectionner

Macro set(num)
Variable#num.i  
EndMacro

set(3) = 255
Debug Variable3
Variable3 = 55

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 20:14
par dayvid
Pas mal G-Rom :)

Comment tu fait pour faire la même chose mais pour crée une variable texte ?

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 23:18
par nico
au lieu de .i tu met .s :lol:

Re: Création d'une variable par des arguments

Publié : ven. 17/févr./2012 23:55
par dayvid
Ah oui !!!

Pourtant j'ai essayer des truc comme ça et j'y suis pas arriver :lol:
mais tu as raison, et ça marche, merci :)

Comment quoi j'ai du me compliquer la vie :lol:

Code : Tout sélectionner

Macro set(num)
Variable#num.s
EndMacro

set(e) = "255"
Debug Variablee
Variablee = "55"

Re: Création d'une variable par des arguments

Publié : sam. 18/févr./2012 13:20
par Robrock55
G-Rom, c'est exactement ce que je cherchais. Merci beaucoup, ca fait 2 fois que tu m'apportes une grande aide, vraiment, merci beaucoup ;)

Re: [Non Résolu] Création d'une variable par des arguments

Publié : sam. 18/févr./2012 21:49
par Robrock55
Euh en fait ca ne marche pas réellement comme je le souhaite.
La macro marche nickelle, mais en fait quand je l'utilise je connais pas la valeur de num.

Code : Tout sélectionner

Macro set(num)
  variable#num
EndMacro

i = 1

set(i) = 3
;Donneras variablei = 3 et non variable1 = 3 comme je le voudrais.
Si vous pouviez me donner la technique si elle existe, je vous en serez reconnaissant.
J'avais essayer de passer par le retour d'une procédure de cette manière :

Code : Tout sélectionner

Macro set(num)
  variable#num
EndMacro

Procedure value(num)  
  ProcedureReturn num
EndProcedure

i=1

set(value(i)) = 3
Et là PAF la mega erreur

Re: [Non Résolu] Création d'une variable par des arguments

Publié : sam. 18/févr./2012 23:24
par Backup
en fait je lis ce que tu ecris depuis le début , et je pense que tu fait fausse route quelque part

comme souvent,pour les problèmes qui semblent insoluble,
le vrais soucis viens de la façon de poser le probleme !

en clair l'énoncé est déja le probleme !

alors , pourquoi veut tu des variables differente ?
en basic une variable qui porte le meme nom mais qui a une case mémoire differente
s'appelle une variable indicé (un tableau)

exemple :

Code : Tout sélectionner

dim toto(10)

toto(1)=56

toto(3)= 89

toto( 8 ) = 456

debug toto(1)
debug toto(3)
debug toto(8)

comme tu peux le voir la variable toto(1) est différente de toto(3)

dans le meme genre tu as aussi l'emploi des structures ..

Code : Tout sélectionner

structure toto
	a.l
	b.l
	c.l
chaine.s
endstructure

toto.toto

toto\a=15
toto\b=5
toto\c=456
toto\chaine.s=" coucou "


debug toto\a
debug toto\b
debug toto\c
debug toto\chaine
l'avantage tu peux mélanger les genres ( chaine et numérique )

bref tu peux t'en sortir , avec pleins de solution que d'employer des bidouilles innommable :)


autre exemple avec un tableau :

Code : Tout sélectionner

global dim roro(100)

procedure titi (argument , valeur)
roro(argument)=valeur
endprocedure

titi (20,150 ) ; on attribut la valeur 150 a la variable roro(20)  " roro20 "

debug roro(20)


; mais on aurai pu faire directement sans passer par une procedure
roro(20)=190 ; c'est comme si j'avais ecris roro20=190

debug roro(20)


Re: [Non Résolu] Création d'une variable par des arguments

Publié : dim. 19/févr./2012 10:23
par Robrock55
Bon je repose mon problème autrement. Je suis toujours dans la progra de mon jeu en "fausse POO Purebasic" (pendez le !)
Et donc là j'en suis à la sauvegarde d'un niveau.
J'ai choisis de l'enregistrer dans un fichier tel que :
  • Un byte indiquant le nombre de planètes
  • La position X de la 1ere planète
  • La position Y de la 1ere planète
  • Les unités de la 1ere planète
  • ... (les autres attributs de cette planète)
  • La position X de la 2eme planète
  • La position Y de la 2eme planète
  • ...
Donc j'ai fait une fonction read_level() et je dois créer mon objet après la lecture des attributs de la planète.

Mon code actuel :

Code : Tout sélectionner

;=======================
;=== Bubble Army PC ====
;=== Robrock55 =========
;=== read_level().pb ===
;=======================

Procedure read_level(level.s,*faction1,*faction2,*faction3,*faction4)
  
  i = 1 ;variable pour le for/To
  ;variables de sotckages provisoires
  posX.l = 0
  posY.l = 0
  size.b = 0
  units.w = 0
  faction.b = 0
  *faction.Class_Faction = 0
  planetsNumber.b = 0
  #FILE_ID = 0
  
  ReadFile(#FILE_ID,level)
  planetsNumber = ReadByte(#FILE_ID)
  For i = 1 To planetsNumber
    posX = ReadLong(#FILE_ID)
    posY = ReadLong(#FILE_ID)
    size = ReadByte(#FILE_ID)
    units = ReadWord(#FILE_ID)
    faction = ReadByte(#FILE_ID)
    
    Select faction
      Case 1
        *faction = *faction1
      Case 2
        *faction = *faction2
      Case 3
        *faction = *faction3
      Case 4
        *faction = *faction4
    EndSelect
    
    ;-CONSTRUCTEUR QUI NE FONCTIONNE PAS, LE PROBLEME SE SITUE ICI
    Global set_pointer_planet(i).Class_Planet = New_Class_Planet(units,posX,posY,size,*faction)
    
  Next

  ProcedureReturn 1
EndProcedure   
  
Et donc je souhaite créer une planète tel que *planet1 puis *planet2 etc...

Re: [Non Résolu] Création d'une variable par des arguments

Publié : dim. 19/févr./2012 10:41
par G-Rom
Une simple liste chainee fait l'affaire ;)