Choisir les datas qu'on veut lire.

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Choisir les datas qu'on veut lire.

Message 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?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Merci Nico! :wink:

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

Message par Backup »

j'ai rebondi sur l'idee de Nico (cool) :D
Merci Nico t'es Geant ! :D

voici la mem chose en procedure ya plus qu'a transformer en librairie :D

cette facon qu'on a avec le pure pour creer des commandes me rapelle la philosophie du Forth :D

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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Et comment tu lui passes le label, à ta procédure? :wink:
Restore DonneesNumeriques
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

L'idée de Chris est très bonne (hein Fred :D ), 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 :D

Par exemple Restore devrait pouvoir accepter une adresse directe ou un pointeur pas seulement un label.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

:?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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é.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 
Dernière modification par nico le ven. 26/nov./2004 17:22, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

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

Message par Backup »

bah ! c'est encore Denis le plus fort ! :D

bon ben fred tu transforme ça en assembleur (avec le pure ça doit pas etre dur :D )

pis tu nous rajoute une petite commande dans le purebasic Merci ! :D


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 !! :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 !! :lol:
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 ? :jesors:
Dernière modification par Anonyme2 le sam. 27/nov./2004 6:06, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Tu maitrises les listes chainées ?
:lol: :lol: :lol:
Répondre