begin process at 2010 02 09 20:45:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > BOUCLE INFINIE AVEC UN FOR (ET SI)

BOUCLE INFINIE AVEC UN FOR (ET SI)


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 597

Auteur : Nebula

Ecrire un message privé
Site perso
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


 Sources du même auteur

Source avec Zip Source avec une capture LISTBOX POUR CLIENTS IRC
Source avec Zip Source avec une capture COLOR PICKER (CAPTURE D'ÉCRAN, ZOOM ET CONVERSION DE COULEUR...
Source avec Zip Source avec une capture RICHEDIT AVEC SUPPORT DES THÈMES XP
Source avec Zip Source avec une capture FORCER LA TRANSPARENCE DES FENÊTRES (WINDOWS XP ET SUPÉRIEUR...
Source avec Zip Source avec une capture UNITÉS SQLITE POUR DELPHI

 Sources de la même categorie

Source avec Zip Source avec une capture UTILISER UNE DLL INCLUSE EN RESSOURCES par Bacterius
Source avec Zip Source avec une capture IMAGE DANS UN TDBGRID par HAFTARIFOUAD
Source avec Zip Source avec une capture [ASTUCE] COMMENT VOIR UN ITEM, D'UNE LISTBOX, TRONQUÉ DANS U... par cirec
Source avec Zip Source avec une capture MESSAGEDLG PERSONNALISÉ par HAFTARIFOUAD
Source avec Zip Source avec une capture COMMENT DESSINER SUR UN TCANVAS LE TEXTE D'UNE FORMULE CHIMI... par pseudo3

Commentaires et avis

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

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

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

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

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

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

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

Commentaire de Nebula le 05/06/2003 12:43:23

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

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 !

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)

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

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

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

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

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 !

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.


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

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales