Page 1 sur 1
Choisir les datas qu'on veut lire.
Publié : ven. 26/nov./2004 1:30
par Chris
Je cherche depuis un moment pour voir si il n'y aurait pas une commande qui permette de lire les datas autrement qu'en commençant à la première.
Par exemple, la cinquième, puis la première, puis la septième, etc...
Il me semble me souvenir que j'avais une commande qui savait faire ça dans mon vieux basic sur Atari.
Il n'y a pas un paramètre caché sur Read ou sur Restore?
Publié : ven. 26/nov./2004 12:36
par nico
Code : Tout sélectionner
; Nico
Restore DonneesNumeriques
*Pointeur=?DonneesNumeriques:
; C'est juste un exemple simple, tu peux empêcher que les même datas
; soient lus plusieurs fois en mémorisant dans un tableau les valeurs
; de Aleatoire pour savoir si le nombre est déjà sorti.
For a=1 To 9
Aleatoire = Random(9)
*Pointeur_donnees = *Pointeur + (Aleatoire*4)
Debug PeekL(*Pointeur_donnees)
Next a
DataSection
DonneesNumeriques:
Data.l 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
EndDataSection
Publié : ven. 26/nov./2004 13:24
par Chris
Merci Nico!
Mais ça me paraît quand même bien compliqué, tout ça.
Ce serait bien d'avoir un paramètre ou une commande qui permette d'aller chercher une seule data dans le liste, selon les besoins.
Fred, tu peux pas nous faire ça?
Publié : ven. 26/nov./2004 16:02
par Backup
j'ai rebondi sur l'idee de Nico (cool)
Merci Nico t'es Geant !
voici la mem chose en procedure ya plus qu'a transformer en librairie
cette facon qu'on a avec le pure pour creer des commandes me rapelle la philosophie du Forth
Code : Tout sélectionner
; Nico
; legere modif par Dobro
Declare nicodata(num)
; ********** appel de la procedure ***********
nicodata(5) ; lit le 5eme data
nicodata(1) ; lit le 1er data
; ****************************************
Procedure nicodata(num)
Restore DonneesNumeriques
num=num-1
*Pointeur=?DonneesNumeriques:
*Pointeur_donnees = *Pointeur + (num*4)
Debug PeekL(*Pointeur_donnees)
EndProcedure
; ********* les datas ***************
DataSection
DonneesNumeriques:
Data.l 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
EndDataSection
Publié : ven. 26/nov./2004 16:05
par Chris
Et comment tu lui passes le label, à ta procédure?
Restore DonneesNumeriques
Publié : ven. 26/nov./2004 16:07
par Anonyme2
L'idée de Chris est très bonne (hein Fred

), on pourrait se déplacer dans une table de données facilement etc.
C'est vrai que le jeu d'instructions des data aurait besoin d'un certain embompoint
Par exemple
Restore devrait pouvoir accepter une adresse directe ou un pointeur pas seulement un label.
Publié : ven. 26/nov./2004 16:07
par Backup
ben tu laisse un label constant !! puisqu'il n'est la que pour reperer les data !
puisque chaque data est recuperable individuellement t'a plus besion des label !!
c'est sa position dans le code (au data) qui compte !

Publié : ven. 26/nov./2004 16:16
par Chris
Dobro a écrit :ben tu laisse un label constant !! puisqu'il n'est la que pour reperer les data !
puisque chaque data est recuperable individuellement t'a plus besion des label !!
c'est sa position dans le code (au data) qui compte !

Tu peux très bien avoir besoin de plusieurs groupes de datas, il faut pouvoir envoyer le pointeur, (avec Restore), sur le bon groupe, sinon, tu récupères le premier groupe déclaré.
Publié : ven. 26/nov./2004 17:21
par nico
Code : Tout sélectionner
; Nico
Procedure test(*Pointeur)
For a=1 To 9
Aleatoire = Random(9)
*Pointeur_donnees = *Pointeur + (Aleatoire*4)
Debug PeekL(*Pointeur_donnees)
Next a
EndProcedure
*Ref1=?DonneesNumeriques1
*ref2=?DonneesNumeriques2
test(*Ref1)
test(*ref2)
DataSection
DonneesNumeriques1:
Data.l 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
DonneesNumeriques2:
Data.l 111, 222, 333, 444, 555, 666, 777, 888, 999, 1111
EndDataSection
Publié : ven. 26/nov./2004 17:21
par Anonyme2
Voilà une petite procedure pour lire les long comme Chris voulait
Code : Tout sélectionner
; Sur une idée de Chris
; Code de base de Nico
; Modif de Dobro
; et le reste de Denis
;
; On passe en paramètre l'adresse de base de la zone de début de lecture
; Index est le numéro de l'élément à lire en commençant à 1
Procedure.l ReadDataLong(AdresseDatas.l, index)
; AdresseDatas.l --> adresse des datas
; index --> le déplacement par rapport à l'adresse de base, à multiplier par 4
If AdresseDatas ; on quitte si AdresseDatas = 0, et le retour vaut 0
AdresseFinale = AdresseDatas + ((Index-1) * 4)
MOV eax, AdresseFinale
MOV [PB_DataPointer], eax ; on attribue au pointeur de datas l'adresse finale
; équivalent au Restore
Read Retour ; on lit la valeur
EndIf
ProcedureReturn Retour
EndProcedure
; le programme pour les tests
Debug ReadDataLong(?DonneesNumeriques, 4)
Debug ReadDataLong(?DonneesNumeriques, 7)
;pour la 2eme zone
Debug ReadDataLong(?DonneesNumeriques2, 10)
Debug ReadDataLong(?DonneesNumeriques2, 5)
End
; ********* les datas ***************
DataSection
DonneesNumeriques:
Data.l 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
DonneesNumeriques2:
Data.l 120, 22, 31, 47, 511, 699, 1700, 18800, 90000, -1000
EndDataSection
Publié : ven. 26/nov./2004 18:50
par Backup
bah ! c'est encore Denis le plus fort !
bon ben fred tu transforme ça en assembleur (avec le pure ça doit pas etre dur

)
pis tu nous rajoute une petite commande dans le purebasic Merci !
on pourrait se déplacer dans une table de données facilement etc.
en fait, le principe existe deja ! ce sont les listes chainées !!

Publié : ven. 26/nov./2004 20:39
par Anonyme2
Dobro a écrit : on pourrait se déplacer dans une table de données facilement etc.
en fait, le principe existe deja ! ce sont les listes chainées !!

Il ya une différence entre l'accès par data et celle des listes chainées, c'est que les datas, il n'y a pas besoin de les charger, elles sont déjà en place.
Tu maitrises les listes chainées ?

Publié : sam. 27/nov./2004 1:27
par Backup