BOUCLE INFINIE AVEC UN FOR (ET SI)

cs_Djidane1208 Messages postés 10 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 5 juin 2003 - 5 juin 2003 à 09:28
cs_Amadeos Messages postés 1 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 16 mars 2006 - 16 mars 2006 à 18:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12583-boucle-infinie-avec-un-for-et-si

cs_Amadeos Messages postés 1 Date d'inscription mercredi 22 septembre 2004 Statut Membre Dernière intervention 16 mars 2006
16 mars 2006 à 18:36
asm
mov i,0 //1 cycle.
end

En 1 instructions simples.. ca doit marcher. le but c'est d'etre dans la vbl.
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
4 mai 2004 à 21:34
Intéressant comme méthode pour contourner la propreté d'un code... :p

Une question :
Dans une procédure j'initialise pas mal de valeurs.
Parmis ces valeurs, deux sont des Integer... parfaites pour faire des compteurs de boucle avant d'être initialisé à zéro. On évite ainsi la création de deux variables, ce qui prend du temps pour allouer la mémoire et la libérer.
Pour l'initialisation ce n'est pas très important mais pour d'autres procédure souvent appelées ça peut se révéler sympathique comme optimisation...

Le problème est que lorsque j'essaye de compiler, Delphi me dit que ces deux variables ne sont pas créées dans la procédure et, donc, que je ne peux pas y accéder en tant que variable de boucle "For".

Comment en assembleur pourrait-on faire pour que eax (et ebx pour la deuxieme boucle ) se retrouvent avec les bonnes valeurs qui me permettraient de gagner un petit peu de temps (*1 000 000 ca fait bcp).
Mais cela n'est valable que si il y'a besoin d'écrire une ligne de code spécifique pour mettre en place eax et ebx ...

Merci d'avance !
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
8 juin 2003 à 01:03
Bah, de toute façon, sur un 586 :

mov reg, mem ; 1 cycle
add eax, 1 ; 1 cycle
mov mem, reg ; 1 cycle

=> 3 cycles au total

add mem, imm ; 3 cycles

=> 3 cycles aussi

Conclusion : aucune importance dans ce cas :p
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
8 juin 2003 à 01:00
Ah ben la voila cette fameuse source :p

Désolé d'avoir réinventé la roue, mais comme je l'ai dit dans l'intitulé de la source, je ne voulais pas assigner une constante mais avoir un pas de 2, cad i=0,2,4,6,8,etc... D'ou l'utilisation d'EAX pour ajouter 1 à i (j'ai pas testé ADD i, 1 mais je suppose que çà doit marcher aussi)...

Voila, @+
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
5 juin 2003 à 18:01
Personellement, j'utilise ((Valeur and 1) = 0) pour savoir si un nombre est pair. à mon avis, c'est le plus rapide (sans utiliser l'assembleur)
Par contre, je ne conaissais pas Odd non plus ... merci ...
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
5 juin 2003 à 17:55
Bah, j'y regarde bien, mais y'a tellement de trucs que c'est tantôt décourageant (on passe son temps à chercher une fonction au milieu d'une pléthore de propositions), tantôt encourageant (quand on tombe sur une fonction qui fait exactement ce qu'on veut... c'est quand même bien foutu Delphi, d'ailleurs je l'apprécie vraiment depuis que je me suis mis au C, mdr)
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
5 juin 2003 à 17:14
Y a pas de quoi !!
Tu sais, tu peux chercher dans le fichier d'aide de Delphi... En recherchant dans les unités par catégories de fonctions, ça te permet souvent de trouver ce que tu veux !
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
5 juin 2003 à 12:43
Odd() ? je la connaissais pa celle là, merci :p
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
5 juin 2003 à 12:27
Effectivement, ça permet de faire sauter le modulo... Mais à ce moment là, utilise la fonction Odd(), qui renvoie true si le nombre passé en paramètre est pair !!
(C'est ce que je voulais mettre à côté de "Ou que", mais j'ai du zapper !! ;o) )

Sinon, Emandhal, ce source est déjà sorti, disons... indirectement !
Elle avait pour but de modifier la variable (comme ici !) pour refaire un ou plusieurs tours de boucles si jamais il y avait besoin, pendant un traitement de données par exemple ! Mais c'es vrai que ça revient au même dans le principe...

Bonne prog' !
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
5 juin 2003 à 11:55
Emandhal > Je sais pas s'il était déjà sorti, c'est possible, je suis surement pas le premier crétin à faire un truc pareil :p

Klem> Certes mais dans la boucle originale je voulais que le compteur aie un pas de 2, donc je faisais un ADD EAX, 1 et çà marchait impec (i = 0, 2, 4, 6, etc...)

Bestiol> moui mais l'asm présente l'avantage de faire sauter le calcul du modulo (bon en meme temps, avec les processeurs actuels, en a t'on vraiment besoin ?)
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
5 juin 2003 à 11:07
Il était pas déjà sortit ce code sur ce site? Parce que ça me dit quelquechose...
cs_klem Messages postés 30 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 septembre 2005
5 juin 2003 à 11:03
Tu aurait aussi pu réduire ton code asm à une ligne :
mov i, 0
ce qui marche aussi bien...
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
5 juin 2003 à 10:10
Ah... un autre petit commentaire :
Pour sauter les valeurs paires, il te suffisait d'effectuer les instructions de ta boucle que si (i mod 2 <> 0) !!
Ou que
Pas besoin d'assembleur pour ça !!
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
5 juin 2003 à 10:07
Et non !! C'est obligatoire de faire ça en assembleur... Sinon, le compilateur te mettra une erreur à la compilation : "Affectation à la variable dfe boucle impossible" !!
L'asm est donc justifié... Mais c'est vrai qu'en elle-même, cette boucle ne sert à rien, car on peut faire While True Do ...
cs_Djidane1208 Messages postés 10 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 5 juin 2003
5 juin 2003 à 09:28
Je ne comprend même pas pourquoi t as mis ça en asm...
Il suffit de soustraire à la variable de boucle 1 à chaque fois comme ça la variable de boucle n'augmente pas...
Rejoignez-nous