Page 1 sur 2

Array() pour remplir un tableau

Publié : mar. 10/avr./2007 6:49
par Thyphoon
A moins d'avoir vraiment raté quelques choses je ne crois pas actuellement on puisse le faire avec Purebasic. Mais ça pourrait être intéressant de pouvoir charger simplement un tableau avec une commande style array
Exemple

Code : Tout sélectionner

Dim MonTableau.l(4)
MonTableau()= array(1,2,3,4);
ou encore

Code : Tout sélectionner

Dim MonTableau.s(4)
MonTableau()= array("Martin","Paul","Jacques","Pierre");
ou encore mieux

Code : Tout sélectionner

Dim MonTableau.s(4)
txt.s="martin|paul|jacques|Pierre")
MonTableau()=ArrayField(txt,"|")
Qu'en pensez vous

Publié : mar. 10/avr./2007 9:54
par lionel_om
Oui ca serait cool.
Car on peut les faire soit même ses fonctions, mais c'est relou à toujours à avoir à recoder ces quelques lignes...

Publié : mar. 10/avr./2007 12:40
par minirop
j'ai déjà essayer et j'ai pas réussi, quand je veux renvoyer une liste, çà renvoie que le dernier élément.
çà marche que si on la passe en paramètre.

sinon, y'a une technique pour avoir un nombre variable de paramètres ? (comme le ... en C)

Re: Array() pour remplir un tableau

Publié : mar. 10/avr./2007 18:31
par Backup
Thyphoon a écrit :A moins d'avoir vraiment raté quelques choses je ne crois pas actuellement on puisse le faire avec Purebasic. Mais ça pourrait être intéressant de pouvoir charger simplement un tableau avec une commande style array
Exemple

Code : Tout sélectionner

Dim MonTableau.l(4)
MonTableau()= array(1,2,3,4);
ou encore

Code : Tout sélectionner

Dim MonTableau.s(4)
MonTableau()= array("Martin","Paul","Jacques","Pierre");
ou encore mieux

Code : Tout sélectionner

Dim MonTableau.s(4)
txt.s="martin|paul|jacques|Pierre")
MonTableau()=ArrayField(txt,"|")
Qu'en pensez vous


comme ça par exemple :lol:


Global Dim a$(8 )
For k=1 To 7
    a$(k)= StringField ( "Je suis une chaîne contenant des champs" , k, " " )
Next

For b=1 To 7
     Debug a$(b)
Next b




Re: Array() pour remplir un tableau

Publié : mar. 10/avr./2007 18:53
par Thyphoon
Dobro a écrit :[



comme ça par exemple :lol:


Global Dim a$(8 )
For k=1 To 7
a$(k)= StringField ( "Je suis une chaîne contenant des champs" , k, " " )
Next

For b=1 To 7
Debug a$(b)
Next b



Et bien oui c'est déjà ce que je fais ...mais pour des tableau d'entier c'est pas pratique, surtout quand les chiffre qu'on veut mettre dedans ce sont des constantes...
Je me sers se constante pour la fabrication de menu dans mon jeu
exemple

Code : Tout sélectionner

Dim menu..l(10)
Enumeration
#Menu_Ouvrir
#Menu_fermer
#Menu_souder
#Menu_Examiner
Endenumeration

Select Objet
  case #Porte
    Menu()={#Menu_Ouvrir,#Menu_Fermer,#Menu_souder,#Menu_Examiner}
  case #titoire
 Menu()={#Menu_Ouvrir,#Menu_Fermer}
 case #sol
 Menu()={#Menu_Examiner}
etc...

Endselect
On pourrait le fair ça serait super pratique !
et pour afficher mon menu et bien
j'affiche text(#Menu_Ouvrir)
ce qui me permet de faire du multilangue

je sais si je suis tres claire :p

Re: Array() pour remplir un tableau

Publié : mar. 10/avr./2007 19:36
par Backup
Thyphoon a écrit : Je me sers se constante pour la fabrication de menu dans mon jeu
utilise des variables et puis c'est tout :D !

au lieu de "#Menu_Ouvrir " , tu ecris , "Menu_Ouvrir#" et voila ! :D

les constantes sont utilisés souvent a tord et a travers ! :D

souvent cela "Fige" le programme car les constantes sont par définition Figé
donc pas de possibilités, d'adaptation du code en cas de changement ...

je prefere de loin utiliser des variables, qui me laisse faire ce que je veux :D
sans etre coincé !! :D

(sauf pour les cas ou l'on sait que cela ne changera pas ex :"#PI " )

La mode des constantes a tout bout de champs, n'est pas bonne !
a mon avis :D

Re: Array() pour remplir un tableau

Publié : mar. 10/avr./2007 21:08
par Thyphoon
Dobro a écrit : utilise des variables et puis c'est tout :D !

au lieu de "#Menu_Ouvrir " , tu ecris , "Menu_Ouvrir#" et voila ! :D

les constantes sont utilisés souvent a tord et a travers ! :D

souvent cela "Fige" le programme car les constantes sont par définition Figé
donc pas de possibilités, d'adaptation du code en cas de changement ...

je prefere de loin utiliser des variables, qui me laisse faire ce que je veux :D
sans etre coincé !! :D

(sauf pour les cas ou l'on sait que cela ne changera pas ex :"#PI " )

La mode des constantes a tout bout de champs, n'est pas bonne !
a mon avis :D
là je suis pas entierrement d'accord avec toi. Les constantes servent pour ce qui ne bouge pas. Or lorsque je fais un menu il y a un grand nombre de possibilité qui ne bouge pas et sont fixe et ça s'implifie énormement tout
En retour de mon menu
je peux faire un

Code : Tout sélectionner

select retourmenu
 case #Menu_Ouvrir
 case #Menu_Fermer
 etc...
Endselect
pour afficher mon menu pour chaque ligne il me suffit d'un Drawtext(x,y,Text(#Menu_Ouvrir))
C'est quand même plus simple que de créer une variable pour chaque possibilité du menu sans compté que le temps de comparer une chaine de caractère par rapport a un entier est quand même important
Sans compter que dans le code c'est parlant et que c'est tres simple a rajouter une nouvelle possibilité :P
En tout cas de toute les tests et experience que j'ai fait dessus cette semaine j'ai pas trouvé mieux !!! Mais je reste ouvert ;)

Publié : mar. 10/avr./2007 22:05
par nico
Avec une macro ça devrait être possible pour un nombre limité de données mais rien n'empêche d'écrire plusieurs fois la fonction.

Publié : mar. 10/avr./2007 23:34
par Backup
une idée a creuser peut etre :D


  ; Array by Dobro


  Declare array(par$)
CallDebugger
Global Dim MonTableau(5)



MonTableau(0)=array( "1,2,3,4" ) ; attention :monTableau va de 1 a 5 !!!


For b=1 To 5
     Debug MonTableau(b)
Next b




Procedure array(par$)
    nb= CountString (par$, "," )+1
     For i=1 To nb
        p=p+4
         PokeL (MonTableau()+p, Val ( StringField ( par$, i, "," ) ))
     Next i
EndProcedure



sinon Flype avait fait ça :

Code : Tout sélectionner

Dim tableau.c(26)

PokeS(@tableau(0), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 26)

For i = 0 To 25
  Debug Chr(tableau(i))
Next 

:D

Publié : mer. 11/avr./2007 19:58
par erix14
Voici un exemple qui exploite directement les chaînes en mémoire, l'affectation des données est instantanée :)

Code : Tout sélectionner

Structure TString
	String.s{10}[$7FFFFFFF]
EndStructure

*MonTableau.TString = ?MonTableau
DataSection
	MonTableau:
	Data.s "ENZO     ","AUDREY   ","MOHAMED  ","AURELIE  ","QUENTIN  ","MANON    ","JULIEN   ","JADE     ","LUCAS    ","LEA      ","ETHAN    "
	Data.s "CHLOE    ","THOMAS   ","EMMA     ","NATHAN   ","CAROLINE ","NICOLAS  ","CAMILLE  ","ALEXANDRE","MARIE    ","THEO     ","PAULINE  "
	Data.s "HUGO     ","SARAH    ","YANIS    ","LILOU    ","RAYAN    ","JULIE    ","ANTOINE  ","MELISSA  ","ROMAIN   ","INES     ","XAVIER   ","FANNY    "
	Data.s "SACHA    ","LOLA     ","LOUIS    ","ABIGAIL  ","OLIVIER  ","CLARA    ","RAPHAEL  ","MATHILDE ","TOM      ","SABRINA  ","MAXIME   "
	Data.s "LAURA    ","BENJAMIN ","ALEXIA   ","CLEMENT  ","OCEANE   ","JULES    ","AMBRE    ","PIERRE   ","AMANDINE ","AXEL     ","ANAIS    "
	Data.s "MAXENCE  ","SOPHIE   ","MAEL     ","MARGAUX  ","GABRIEL  ","EMILIE   ","GUILLAUME","CORALIE  ","EVAN     ","URSULE   ","MALIKA   "
	Data.s "SEBASTIEN","OPHELIE  ","ARTHUR   ","ELODIE   ","KEVIN    ","CELIA    ","MATHIEU  ","LOUISE   ","NOAH     ","ALINE    ","DAVID    "
	Data.s "LENA     ","LEO      ","CHARLOTTE","MATHIS   ","CELINE   ","PAUL     ","NOEMIE   ","FLORIAN  ","EMELINE  ","TRISTAN  ","LOUNA    "
	Data.s "SIMON    ","GAETANE  ","MATTHIEU ","SOLENE   ","VINCENT  ","ALICE    ","CEDRIC   ","LUCIE    ","TIMEO    ","MARION   ","ESTEBAN  "
EndDataSection

For i = 0 To 99
  Debug *MonTableau\String[i]
Next

Publié : mer. 11/avr./2007 21:19
par Thyphoon
Tres bon ce code !

Le seul Hic c'est que j'ai besoin de creer des tableaux a la volé et donc le contenu n'est pas fixe. Donc difficile d'utiliser les Datas... Mais ça me donne une idée...

Publié : mer. 11/avr./2007 22:14
par Backup
Thyphoon a écrit :Tres bon ce code !

Le seul Hic c'est que j'ai besoin de creer des tableaux a la volé et donc le contenu n'est pas fixe. Donc difficile d'utiliser les Datas... Mais ça me donne une idée...
les listes chainées sont faites pour ça non ? 8O

Publié : jeu. 12/avr./2007 7:32
par lionel_om
Thyphoon a écrit :Tres bon ce code !

Le seul Hic c'est que j'ai besoin de creer des tableaux a la volé et donc le contenu n'est pas fixe. Donc difficile d'utiliser les Datas... Mais ça me donne une idée...
Mais si tes possibilités de tableaux sont réduits, tu peux tout de même utiliser se principe en créant un tableau assez grand pour stocker tout tes cas. Puis tu change le pointeur du tableau vers la bonne zone qd tu le veux...

Lio

Publié : jeu. 12/avr./2007 8:31
par erix14
Petite précision, les données ne sont pas figées. Tu peux changer les données à la volée, pas contre les chaines sont limitées à 9 caractères dans cet exemple.

Code : Tout sélectionner

Structure TString
	String.s{10}[$7FFFFFFF]
EndStructure

*MonTableau.TString = ?MonTableau
DataSection
	MonTableau:
	!rb 20
	Data.s "Thyphoon "
	!rb 60
	Data.s "Fin      "
EndDataSection

*MonTableau\String[5] = "Eric"

For i = 0 To 9
  Debug *MonTableau\String[i]
Next
L'instruction rb permet de réserver de la mémoire.

Publié : ven. 13/avr./2007 8:54
par Flype
erix14 a écrit :Voici un exemple qui exploite directement les chaînes en mémoire, l'affectation des données est instantanée :)

Code : Tout sélectionner

Structure TString
	String.s{10}[$7FFFFFFF]
EndStructure

*MonTableau.TString = ?MonTableau
DataSection
	MonTableau:
	Data.s "ENZO     ","AUDREY   ","MOHAMED  ","AURELIE  ","QUENTIN  ","MANON    ","JULIEN   ","JADE     ","LUCAS    ","LEA      ","ETHAN    "
	Data.s "CHLOE    ","THOMAS   ","EMMA     ","NATHAN   ","CAROLINE ","NICOLAS  ","CAMILLE  ","ALEXANDRE","MARIE    ","THEO     ","PAULINE  "
	Data.s "HUGO     ","SARAH    ","YANIS    ","LILOU    ","RAYAN    ","JULIE    ","ANTOINE  ","MELISSA  ","ROMAIN   ","INES     ","XAVIER   ","FANNY    "
	Data.s "SACHA    ","LOLA     ","LOUIS    ","ABIGAIL  ","OLIVIER  ","CLARA    ","RAPHAEL  ","MATHILDE ","TOM      ","SABRINA  ","MAXIME   "
	Data.s "LAURA    ","BENJAMIN ","ALEXIA   ","CLEMENT  ","OCEANE   ","JULES    ","AMBRE    ","PIERRE   ","AMANDINE ","AXEL     ","ANAIS    "
	Data.s "MAXENCE  ","SOPHIE   ","MAEL     ","MARGAUX  ","GABRIEL  ","EMILIE   ","GUILLAUME","CORALIE  ","EVAN     ","URSULE   ","MALIKA   "
	Data.s "SEBASTIEN","OPHELIE  ","ARTHUR   ","ELODIE   ","KEVIN    ","CELIA    ","MATHIEU  ","LOUISE   ","NOAH     ","ALINE    ","DAVID    "
	Data.s "LENA     ","LEO      ","CHARLOTTE","MATHIS   ","CELINE   ","PAUL     ","NOEMIE   ","FLORIAN  ","EMELINE  ","TRISTAN  ","LOUNA    "
	Data.s "SIMON    ","GAETANE  ","MATTHIEU ","SOLENE   ","VINCENT  ","ALICE    ","CEDRIC   ","LUCIE    ","TIMEO    ","MARION   ","ESTEBAN  "
EndDataSection

For i = 0 To 99
  Debug *MonTableau\String[i]
Next
C'est vrai que cette façon de faire est pratique, je l'utilise aussi souvent.
Ceci dit, en principe, il vaut mieux écrire String.s{10}[0] plutot que String.s{10}[$7FFFFFFF], enfin je pense.