Choisir les datas qu'on veut lire.
Choisir les datas qu'on veut lire.
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?
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?
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
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

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
Dernière modification par Backup le ven. 26/nov./2004 16:05, modifié 1 fois.
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é.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 !
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
Dernière modification par nico le ven. 26/nov./2004 17:22, modifié 1 fois.
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
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 !
en fait, le principe existe deja ! ce sont les listes chainées !!

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 !!

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.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 !!
Tu maitrises les listes chainées ?

Dernière modification par Anonyme2 le sam. 27/nov./2004 6:06, modifié 1 fois.