En GFA, y a-t-il un moyen plus rapide que BYTE / CARD / LONG pour lire une donnée en mémoire ?
J'ai une boucle WHILE...WEND pour faire une recherche avec BYTE{adresse%} mais je trouve pas ça super rapide.
Des indices ?
Strider :
Salut
En GFA, y a-t-il un moyen plus rapide que BYTE / CARD / LONG pour lire une donnée en mémoire ?
J'ai une boucle WHILE...WEND pour faire une recherche avec BYTE{adresse%} mais je trouve pas ça super rapide.
Des indices ?![]()

WHILE position% < maximum%
IF BYTE{position%}=90 AND BYTE{ADD(position%,1)}=80
... etc ...
END IF
ADD position%,1
WEND
), je devrais de remplacer les 2 BYTE par 1 INT ?
Rajah Lone :
@Strider : OUI !!!!!!!
surtout là, INT{position%}=truc&, avec le truc& à base de 90+80 (genre truc&=CVI(chr$(90)+chr$(80) ?) que tu auras défini EN DEHORS de ton WHILE-WEND.
Tu incrémentes de 2, et comme ça une seule lecture, sur une adresse paire (pas bien de lire sur les impaires, ça lui fait faire des manips qui consomme du temps, il me semble).
Et puis, un ADD position%,1 c'est inutile, il vaut mieux un "INC position%" si le décalage n'est que de 1.
WHILE position% < maximum%
IF BYTE{position%}=90
IF BYTE{SUCC(position%)}=80
... etc ...
END IF
END IF
INC position%
WEND
dépasse maximum%, c'est plus prudent si ton maximum% se trouve dans une zone mémoire qui ne pourrait pas t'appartenir.
WHILE position% < maximum%
IF BYTE{position%}=90 AND BYTE{ADD(position%,1)}=80 AND BYTE{ADD(position%,2)}=70 AND BYTE{ADD(position%,3)}=60
' traitement
END IF
ADD position%,2
WEND
WHILE position% < maximum%
IF BYTE{position%}=90 AND BYTE{ADD(position%,1)}=80 AND BYTE{ADD(position%,2)}=70 AND BYTE{ADD(position%,3)}=60
' traitement
END IF
ADD position%,2
WEND
WHILE position% < maximum%
IF LONG{position%}=recherche%
' traitement
END IF
ADD position%,2
WEND
recherche1&=CVI('SN')
recherche2&=CVI('DH')
WHILE position% < maximum%
IF INT{position%}=recherche1&
IF INT{ADD(position%,2)}=recherche2&
' traitement
END IF
END IF
ADD position%,2
WEND
Rajah Lone :
t'as essayé avec ?
recherche1&=CVI('SN') recherche2&=CVI('DH') WHILE position% < maximum% IF INT{position%}=recherche1& IF INT{ADD(position%,2)}=recherche2& ' traitement END IF END IF ADD position%,2 WEND
Rajah Lone
'autre part, j'ai jamais dit qu'un position%+2 était plus rapide qu'un ADD(position%,2).
C'est l'instruction (et pas la fonction) ADD position%,2 qui est plus rapide que position%=position%+2
Strider :
Les deux premiers codes donnent les MEMES résultats, contrairement à ce que Rajah et moi croyions![]()
c'est peut-être pour ça qu'ils donnent les MEMES résultats
ADD(position%,1) -> position%+1 ADD(position%,2) -> position%+2 ADD(position%,3) -> position%+3
for i%=position% to maximun%
IF BYTE{i%}=90 AND BYTE{ADD(i%,1)}=80 AND BYTE{ADD(i%,2)}=70 AND BYTE{ADD(i%,3)}=60
' traitement
END IF
next i%
for i%=position% to maximun% step 4
IF long(i%)=$xxxx
' traitement
END IF
next i%

Rajah Lone :
@GT Distrait : STEP 2, sinon on risque de passer à côté![]()

for i%=position% to maximun%-2 step 2
move.l #"SNDH",d0 Boucle: cmp.l (a0),d0 (On pourrait faire le bricolage a coup de mot j'ai je crois que ca risque d'ètre encore plus lent !) beq.s Found addq.w #2,a0 cmpa.l a1,a0 blt.s Boucle jsr Pas_trouver Found : traitement...


cmpa.l a1,a0 blt.s Boucle
Seb fait référence à cet article (le site est à nouveau up) : http://removers.free.fr/spip/article.php?id_article=81 (pour résumer, le "blt.s Boucle" n'est pas correct pour a1 > 2 Go)