Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BOUCLE INFINIE AVEC UN FOR (ET SI)


Information sur la source

Catégorie :Trucs & Astuces Niveau : Débutant Date de création : 05/06/2003 Date de mise à jour : 05/06/2003 01:31:14 Vu : 2 397

Note :
4 / 10 - par 2 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

Description

Bon çà n'a aucun intérêt dans ce cas, mais dans un for j'avais cherché à incrémenter le compteur pour sauter les valeurs paires... Et voici l'astuce que j'avais trouvé, Delphi refusant qu'on touche à la variable compteur...
 

Source

  • program toto;
  • {$APPTYPE CONSOLE}
  • uses SysUtils;
  • var i: Integer;
  • begin
  • for i := 0 to 1 do begin
  • writeln('i=', i);
  • asm
  • mov eax, i
  • sub eax, 1
  • mov i, eax
  • end;
  • end;
  • end.
program toto;

{$APPTYPE CONSOLE}

uses SysUtils;

var i: Integer;

begin
  for i := 0 to 1 do begin
    writeln('i=', i);
    asm
      mov eax, i
      sub eax, 1
      mov i, eax
    end;
  end;
end.

Conclusion

Je sais que çà ne sert à rien là, pas la peine de demander l'intérêt :p
 

Commentaires et avis

signaler à un administrateur
Commentaire de Djidane1208 le 05/06/2003 09:28:03

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

signaler à un administrateur
Commentaire de Bestiol le 05/06/2003 10:07:52

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

signaler à un administrateur
Commentaire de Bestiol le 05/06/2003 10:10:02

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

signaler à un administrateur
Commentaire de klem le 05/06/2003 11:03:32

Tu aurait aussi pu réduire ton code asm à une ligne :
  mov i, 0
ce qui marche aussi bien...

signaler à un administrateur
Commentaire de Emandhal le 05/06/2003 11:07:58

Il était pas déjà sortit ce code sur ce site? Parce que ça me dit quelquechose...

signaler à un administrateur
Commentaire de Nebula le 05/06/2003 11:55:50

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 ?)

signaler à un administrateur
Commentaire de Bestiol le 05/06/2003 12:27:44

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

signaler à un administrateur
Commentaire de Nebula le 05/06/2003 12:43:23

Odd() ? je la connaissais pa celle là, merci :p

signaler à un administrateur
Commentaire de Bestiol le 05/06/2003 17:14:28

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 !

signaler à un administrateur
Commentaire de Nebula le 05/06/2003 17:55:37

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)

signaler à un administrateur
Commentaire de bgK le 05/06/2003 18:01:54

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

signaler à un administrateur
Commentaire de Cyrille2 le 08/06/2003 00:04:12 administrateur CS

J'avais déjà posté une source de ce genre ... http://www.delphifr.com/article.aspx?Val=2338 sauf que j'utilise pas les registres pour assigner une constante a une var...

signaler à un administrateur
Commentaire de Nebula le 08/06/2003 01:00:25

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, @+

signaler à un administrateur
Commentaire de Nebula le 08/06/2003 01:03:44

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

signaler à un administrateur
Commentaire de Zeroc00l le 04/05/2004 21:34:53

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 !

signaler à un administrateur
Commentaire de Amadeos le 16/03/2006 18:36:01

asm
mov i,0 //1 cycle.
end

En 1 instructions simples.. ca doit marcher. le but c'est d'etre dans la vbl.


signaler à un administrateur
Commentaire de Cyrille2 le 17/03/2006 17:09:34 administrateur CS

Amadeos => http://www.delphifr.com/article.aspx?Val=2338 ;)

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.