[C] Des accolades "just pour le fun" ?

Des accolades "just pour le fun" ? [C] - C - Programmation

Marsh Posté le 04-01-2007 à 15:03:34    

deleted

Message cité 1 fois
Message édité par MagicBuzz le 01-02-2010 à 13:41:28
Reply

Marsh Posté le 04-01-2007 à 15:03:34   

Reply

Marsh Posté le 04-01-2007 à 15:06:31    

MagicBuzz a écrit :

Je suis en train de lire des sources en C (ou C++, j'en sais pouic, ça a changé en cours de route ;))
 
Et j'ai des blocs de ce genre :

Code :
  1. rating = 0;
  2.   {
  3.    int b = ge->last_speed;
  4.    if ((b-=85) >= 0)
  5.     rating += b >> 2;
  6.   }
  7.   {
  8.    byte age = ge->last_age;
  9.    (age >= 3) ||
  10.    (rating += 10, age >= 2) ||
  11.    (rating += 10, age >= 1) ||
  12.    (rating += 13, true);
  13.   }


 
A quoi servent ces accolades ? Juste pour faire joli ? Ou si le compilateur fait quelquechose de particulier avec ?


 
non ca sert pas a faire joli, ca s'appelle un scope. Sortie de la zone des {} les variables ne sont plus accessibles donc tu économises de la ram.

Reply

Marsh Posté le 04-01-2007 à 15:13:01    

MagicBuzz a écrit :

:heink:
 
Pis ça, je pige pas du tout ce que ça peut faire :heink:
 

Code :
  1. (age >= 3) ||
  2.    (rating += 10, age >= 2) ||
  3.    (rating += 10, age >= 1) ||
  4.    (rating += 13, true);



 
oh putain, un monguer qui se met à fairte du C :/

Reply

Marsh Posté le 04-01-2007 à 15:18:50    

Tamahome a écrit :

non ca sert pas a faire joli, ca s'appelle un scope. Sortie de la zone des {} les variables ne sont plus accessibles donc tu économises de la ram.


 
Ca évite également d'avoir une définition d'une variable, soit en plein milieu du code, soit en début de fonction alors que la variable ne sert que dans une partie très restreinte de la fonction.
Bref, ça peut aussi servir à améliorer la lisibilité du programme.

Reply

Marsh Posté le 04-01-2007 à 15:22:36    

Elmoricq a écrit :

Ca évite également d'avoir une définition d'une variable, soit en plein milieu du code, soit en début de fonction alors que la variable ne sert que dans une partie très restreinte de la fonction.
Bref, ça peut aussi servir à améliorer la lisibilité du programme.


 
tu peux aussi t'en servir pour "masquer" la définition d'une variable existante... alors la lisibilité...

Reply

Marsh Posté le 04-01-2007 à 15:27:35    

Je parle bien de "possibilité", pour la lisibilité. [:dawao]
 
C'est juste un argument de plus en faveur du fait que les accolades sont pas là pour faire beau.

Reply

Marsh Posté le 04-01-2007 à 15:27:56    

MagicBuzz a écrit :

kadreg > monguer ? :??:


 
c'est une construction classique en perl :o

Reply

Marsh Posté le 04-01-2007 à 15:28:22    

Tamahome a écrit :

tu peux aussi t'en servir pour "masquer" la définition d'une variable existante... alors la lisibilité...


Non, moi je dis non.
Certes on peut très bien utiliser les particularités de certaines syntaxes pour polluer un programme... mais mis à part dans certaines réunions, ce n'est généralement pas dans ce but là qu'on utilise ces syntaxes.
Pour ma part, je tend à croire que celui qui utilisera un raccourci syntaxique dans son programme le fera dans un but utilitaire (économie de mémoire, économie algorithmique, optimisation, etc...) et non pas pour pourir la vie de celui qui va le relire...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-01-2007 à 15:32:26    

ne jamais présumer de la qualité du code :)

Reply

Marsh Posté le 04-01-2007 à 17:59:17    

MagicBuzz a écrit :

sinon, pour le coup du monguer et du = suivit d'un = avec un + ça quoi ce charabiat ?

 

à la base, c'est un prog open source, et y'a un bug par là dedans. le bug tout con à la base, je me dis "allez, tiens, chuis dans un grand jour, je vais filer un coup de main". mais là c'est mal parti :D sur 10 lignes j'en pige une et demie :D

 

Bon, déjà, "a += b" est un raccourci qui signifie "a = a + b" (on peut donc faire a -= b, a /= b, a *= b, a &= b, etc).

 

Quant au code sur lequel tu t'interroges, c'est ultra-simple : dans l'expression "a || b", si a est vrai, alors la condition b n'est pas évaluée (idem pour "a && b" : si "a" est faux, alors "b" n'est pas évalué).

 

A partir de là, c'est facile de voir ce que fait le code [:dawa]


Message édité par Elmoricq le 04-01-2007 à 18:00:08
Reply

Marsh Posté le 04-01-2007 à 17:59:17   

Reply

Marsh Posté le 04-01-2007 à 18:28:45    

et ça correspond à quoi les conditions avec des , au milieu ?

Reply

Marsh Posté le 04-01-2007 à 20:09:11    

truc du jour : en C, un statement renvoie une valeur.  
 
donc a = 20 va renvoyer à un membre gauche 20 (il y est pas, mais si, c'est vrai, tu peux l'affecter, comme  
 

Code :
  1. ge->rating = rating = or + 2;

 
 
fait une double affectation.  
 

Code :
  1. rating = or + 2;
  2. ge->rating = rating


 

Reply

Marsh Posté le 04-01-2007 à 20:15:46    

la même principe marche aussi pour  
 

Code :
  1. (A>20) || b=10


 
L'expression A>20 est évaluée. Si elle retourne true, c'est pas la peine de continuer dans le OU, donc l'affectation b=10 n'est pas réalisée.  Si elle retourne false, on va continuer d'évaluer l'espression, donc réaliser l'affectation.
 

Reply

Marsh Posté le 04-01-2007 à 20:18:52    

MagicBuzz a écrit :


Pas plus que : (sâchant que "or" c'est une variable quand même)

Code :
  1. ge->rating = rating = or + 2;


 

La première fois que tu l'a écrit en parlant de C# j'ai cru que or était un keyword standard pour ||, ça faisait une soupe assez bizarre à comprendre...

 

(d'ailleurs ça peut faire mal une variable 'or' si quelqu'un inclut <iso646.h>, qui est un header standard (c99)...)


Message édité par 0x90 le 04-01-2007 à 20:19:32

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 04-01-2007 à 20:53:48    

la , en C est l'opérateur séquentiel, ça veut dire fait ce qu'il y a avant, puis fait ce qu'il y a après, puis renvoie la valeur de ce qu'il y a après.
donc :
rating += 10
age >= 1 (aucun effet de bord)
et enfin: renvoie la valeur de "age >= 1"

 

( c'est assez rarement utilisé à vrai dire, pour des raisons de lisibilités surtout )

Message cité 1 fois
Message édité par 0x90 le 04-01-2007 à 20:54:23

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 04-01-2007 à 20:56:33    

0x90 a écrit :


( c'est assez rarement utilisé à vrai dire, pour des raisons de lisibilités surtout )


 
le seul cas ou je le vois dans la vraie vie, c'est dans les inits de boucle for.

Reply

Marsh Posté le 04-01-2007 à 21:02:50    

Bon.

 

Tu poses cette question :

MagicBuzz a écrit :

sinon, pour le coup du monguer et du = suivit d'un = avec un + ça quoi ce charabiat ?

 

J'y réponds et, tu remarqueras, sans aucune allusion n'y rien, malgré la trivialité de la question. J'y réponds, tout simplement.

 

Et je me mange ça :

MagicBuzz a écrit :

nan, mais c'est bon, je suis pas mongolien non plus.

 

a += 20; je sais parfaitement ce que ça fait.

 

C'est la seconde fois que je te vois te ramener avec tes gros sabots dans la catégorie C et que je subis ton arrogance.
Alors tu sais quoi ? A partir de maintenant, tu peux aller te faire foutre avec tes questions. [:florentg]


Message édité par Elmoricq le 04-01-2007 à 21:03:53
Reply

Marsh Posté le 04-01-2007 à 21:05:16    

Un truc du genre :
rating += 3*(age<1)+(3-(age>3?3:age))*10;
Ça peut le faire aussi [:dawa]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 04-01-2007 à 21:10:15    

J'ai cité ta question, pourtant, je me trompe où ? [:petrus dei]

 

edit : le fourbe, il a édité sa réponse [:o_doc]


Message édité par Elmoricq le 04-01-2007 à 21:10:33
Reply

Marsh Posté le 04-01-2007 à 21:17:36    

Bon, ok, 'dmettons que je me sois enflammé.

 

"a = b = c + 2" signifie : "c+2 assigné à b, puis b assigné à a"

 

En plus simple, on peut initialiser en cascade, comme suit : "a = b = c = d = 1;"

 

J'crois que c'est aussi possible en C#.


Message édité par Elmoricq le 04-01-2007 à 21:17:49
Reply

Marsh Posté le 05-01-2007 à 00:14:59    

MagicBuzz a écrit :

avec des valeurs séparées par des virgules, ça se sert habituellement pour passer des paramètres à une fonction


La virgule est un opérateur, tout comme le signe "+", "<", "&" et bien d'autres encore.
Ca sert à séquentialiser les opérations.
 
Peut-être que tu as l'habitude de le voir dans les paramètres d'une fonction mais on peut le trouver dans bien d'autres instructions...
int i=0, j=0, k=0;
for (i=0, j=10; i < 100; i++, j--)
free(p), p=NULL;
 
Tu peux même l'y mettre juste pour pourir la vie des autres programmeurs qui bossent avec toi
i=(j=2, 1);
 
Ce qui est une manière tordue d'écrire
i=1;
j=2;
...
 

elianor a écrit :

la même principe marche aussi pour  
 

Code :
  1. (A>20) || b=10


 
L'expression A>20 est évaluée. Si elle retourne true, c'est pas la peine de continuer dans le OU, donc l'affectation b=10 n'est pas réalisée.  Si elle retourne false, on va continuer d'évaluer l'espression, donc réaliser l'affectation.


C'est parfaitement vrai... mais dans le principe je trouve un peu "bancal" de chercher un truc faux pour faire l'affectation.
D'un point de vue purement "logique", je verrais plutôt ça comme "je fais l'affectation si l'assertion est vraie"

Code :
  1. (A<=20) && b=10


 
Ceci dit, cela n'enlève rien à la valeur pédagogique de l'exemple qui ne m'était jamais venue à l'esprit...


Message édité par Sve@r le 05-01-2007 à 00:26:59

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-01-2007 à 00:17:24    

dans les paramètres d'une fonction ce n'est pas un opérateur cela dit.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-01-2007 à 00:25:38    

0x90 a écrit :

dans les paramètres d'une fonction ce n'est pas un opérateur cela dit.


Ah ??? C'est peut-être vrai si tu le dis... mais sincèrement je ne trouve aucun empêchement quelconque à ce que ce soit aussi un opérateur même dans les paramètres.
En effet, lorsque les paramètres sont évalués, ils le sont séquentiellements ce qui correspond donc parfaitement à la fonction de la virgule qui est de séquentialiser ses éléments...  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-01-2007 à 00:48:24    

MagicBuzz a écrit :

y'a pas des options de compilation (comme en C#) qui permet d'empêcher ça ?


Non, parce que c'est autorisé en C. Par contre gcc a une option pour signaler le shadowing... : -Wshadow

 

cette option est dans mon mode paranoïaque :

 

http://mapage.noos.fr/emdel/codage.htm#cfg_compilo_gcc

 



Message édité par Emmanuel Delahaye le 05-01-2007 à 00:49:20

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2007 à 00:55:17    

Sve@r a écrit :

sincèrement je ne trouve aucun empêchement quelconque à ce que ce soit aussi un opérateur même dans les paramètres.
En effet, lorsque les paramètres sont évalués, ils le sont séquentiellements


Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2007 à 01:04:36    

Emmanuel Delahaye a écrit :

Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator)


 
J'étais entrain d'aller vérifier dans la norme, tu sais pas ou c'est dedans par hasard ? (à moins que ce soit uniquement spécifié par la non spécification d'un sequence point au moment ou ils parlent de la sémantique d'une définition de fonction)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-01-2007 à 01:08:21    

MagicBuzz a écrit :


Pourquoi ils n'ont pas simplement fait ça ? (pour la première par exemple)

 
Code :
  1. // TODO
  2. static char *FormatCommaNumber(char *buff, int32 number, const char* last)
  3. {
  4. char cnum[10];
  5. int32 num, lnum, i;
  6. num = number;
  7. if (num < 0)
  8. {
  9.  *buff++ = '-';
  10.  num = -num;
  11. }
  12. lnum = sprintf(cnum, "%u", num);
  13. for (i = lnum; i > 0; i--)
  14. {
  15.  *buff++ = cnum[lnum - i];
  16.  if (i != 1 && i % 3 == 1) *buff++ = ',';
  17. }
  18. *buff = '\0';
  19. return buff;
  20. }



Pour s'économiser l'appel à sprintf [:spamafote]
(après, effectivement est-ce que l'optim est bien nécessaire, j'en doute fortement... mais vu qu'OTTD c'est codé par des assembleux spa étonnant ce genre d'optim, même moi ça me fait mal au coeur les appels à sprintf pour ça :/)


Message édité par 0x90 le 05-01-2007 à 01:09:22

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-01-2007 à 01:19:01    

Emmanuel Delahaye a écrit :

Sauf que pour des paramètres, l'ordre d'évaluation n'est pas défini... Grosse différence avec l'opérateur virgule (comma operator)


 
Tiens ? Maintenant que tu le dis, c'est vrai que j'ai déjà eu des surprises avec ce genre de truc
printf("%d %d %d\n", i++, i++, i++)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-01-2007 à 01:29:35    

0x90 a écrit :

à moins que ce soit uniquement spécifié par la non spécification d'un sequence point au moment ou ils parlent de la sémantique d'une définition de fonction


C'est ça.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2007 à 01:30:28    

Sve@r a écrit :

printf("%d %d %d\n", i++, i++, i++)...


Horrible ! Comportement indéfini.

 


Message édité par Emmanuel Delahaye le 05-01-2007 à 01:30:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-01-2007 à 01:31:06    


Ah, jl'ai trouvé en explicite, 6.5.2.2.10 \o/


Message édité par 0x90 le 05-01-2007 à 01:33:08

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 06-01-2007 à 10:33:13    

Reply

Marsh Posté le 06-01-2007 à 10:41:43    

tbp a écrit :

Pour un catalogue des joyeusetés, voir http://www.literateprogramming.com/ctraps.pdf


Archivaid. Merci.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-01-2007 à 11:34:43    

MagicBuzz a écrit :

ah ok :)

 

en plus ça existe en C# aussi, ça me revient :)
m'en sert jamais :ange:


Et tu as tort. [:dawao]
Toujours limiter la taille des portées/scopes: le code est plus clair (car les variables sont plus localisées), et plus rapide, car les variables sont sur la pile. Enfin pas en C# et en Java, mais en tout cas tu sollicites bcp moins le GC, puisque la durée de vie des variables s'arrête à la sortie de la portée. (D'aileurs, tu n'es pas sans savoir que ces varaibles s'appellent historiquement des variables automatiques, parce qu'elles sont automatiquement détruites à la sortie du scope.)
Les GC, c'est bien, mais il est tjrs bon de leur faciliter le travail au maximum.

 

(et oui, le 1er bout de code que tu as montré est assez moche)


Message édité par el muchacho le 06-01-2007 à 11:52:16
Reply

Marsh Posté le 08-01-2007 à 11:07:55    

MagicBuzz a écrit :

Sauf que moi j'utilise les règles de dev établies par IBM : pas plus de 10 lignes par fonction dans la mesure du possible.


 
10, c'est pas beaucoup. D'expérience, 25 est une bonne limite.

Citation :


De plus, je déclare mes variables le plus tard possible (genre une variable local est déclarée dans un bloc while/for/if plutôt que globalement,  


Alors on est d'accord.

Citation :


étant donné que le GC est justement là pour éviter de recréer éffectivement la variable à chaque passage) -> c'est même conseillé dans la MSDN

Le GC (Garbage Collector, je suppose) n'a rien à voir là dedans... Ca ne concerne que la mémoire allouée dynamiquement. En plus, en C, ça n'existe pas en natif.
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-01-2007 à 12:13:30    

MagicBuzz a écrit :

je parle pour le C# puisque je bosse en C# ;)


Alors par pitié, parles de ce que tu connais et arrêtes de divaguer sur le C. La drogue çay mal tu sais.


Message édité par tbp le 08-01-2007 à 12:14:17
Reply

Marsh Posté le 08-01-2007 à 12:13:32    

MagicBuzz a écrit :

je parle pour le C# puisque je bosse en C# ;)


Sur un forum C. Mais c'est supair !
 
depuis, le projet en C sur lequel je fais des petits devs, là, ne supporte pas la déclaration tardive. je ne sais pas si c'est typique au C ou un paramètre du projet, mais en tout cas, "for (int i = ...)" lève une erreur de compilation.
 
Bah, cette construction fonctionne en C99. Mais en C90, on fait un bloc et c'est tout.

Code :
  1. /* n'importe ou dans une fonction : */
  2.    {
  3.       int i;
  4.       for (i = 0; i < n; i++)
  5.       {
  6.          int j;
  7.          for (j = 0; j < m; j++)
  8.          {
  9.              ... a[i][j] ... ;
  10.          }
  11.       }
  12.    }


Citation :


en C#, au contraire, le GC récupère les handles des variables non utilisées. plutôt que de faire manuellement un malloc puis un free aussitôt que la variable est déclarée puis détruire, il touche à rien, et si une variable du même type pointe le bout de son nez, il réutilise une variables "libre". en termes de perfs, on arrive donc à être plus rapide en développant sans se soucier de la mémoire allouée qu'en C où on passe son temps à allouer et libérer des zones mémoire.


[C]
Pas si on utilise les variables locales (pas trop grandes). Mais ça dépend de l'usage. Parfois, il faut retourner l'adresse d'un objet alloué dynamiquement. J'espère que le GC ne vient pas se mêler de ce qui ne le regarde pas...
 

Citation :

genre la création d'une variable dans une boucle, en C, c'est parfaitement horrible niveau perfs, il faut toujours la déclarer en dehors du scope de la boucle. en C#, ça ne pose pas de problème.

Tu sors ça d'où ? Tu as fait des mesures ? Tu peux le prouver.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-01-2007 à 12:33:29    

MagicBuzz a écrit :

Car dans le premier cas à chaque itération le programme va se faire chier allouer un espace mémoire pour la string, puis la désaouler.


J'espère qu'il y une injonction t'interdisant d'approcher un compilateur C à moins de 10m, sinon on est perdu.
C'est assez fascinant de voir combien le fait de ne rien paner au C ne t'empeche en rien de pontifier.

Reply

Marsh Posté le 08-01-2007 à 12:57:19    

MagicBuzz a écrit :

fait ça en C :

Code :
  1. for (i = 0; i < 1000; i++)
  2. {
  3.    char* str;
  4.    sprinf(str, "%d", i);
  5. }




Comportement indéfini. Reviens ici quand tu saura de quoi tu parles...
 
On va pas d'embéter sur le forum C#, OK ?
 
Le code manquant est ici :  
http://mapage.noos.fr/emdel/clib.htm
Module CHRO (et les autres si nécessaire...)
 

Code :
  1. #include <stdio.h>
  2. #include "ed/inc/chro.h"
  3. #define M 10
  4. #define N 1000000
  5. static void test_a (void)
  6. {
  7.    char s[32];
  8.    long i;
  9.    for (i = 0; i < M; i++)
  10.    {
  11.       long j;
  12.       for (j = 0; j < N; j++)
  13.       {
  14.          sprintf (s, "%ld", i * j);
  15.       }
  16.    }
  17. }
  18. static void test_b (void)
  19. {
  20.    long i;
  21.    for (i = 0; i < M; i++)
  22.    {
  23.       long j;
  24.       for (j = 0; j < N; j++)
  25.       {
  26.          char s[32];
  27.          sprintf (s, "%ld", i * j);
  28.       }
  29.    }
  30. }
  31. int main (void)
  32. {
  33.    chro_s *c = chro_create ();
  34.    if (c != NULL)
  35.    {
  36.       long ms;
  37.       chro_start (c);
  38.       test_a ();
  39.       chro_stop (c);
  40.       chro_elapsed (c, &ms);
  41.       printf ("A : %lu ms\n", (unsigned long) ms);
  42.       chro_start (c);
  43.       test_b ();
  44.       chro_stop (c);
  45.       chro_elapsed (c, &ms);
  46.       printf ("B : %lu ms\n", (unsigned long) ms);
  47.       chro_delete (c), c = NULL;
  48.    }
  49.    return 0;
  50. }



A : 7875 ms
B : 7953 ms
 
Press ENTER to continue.


Un léger overhead, c'est possible. Pas de quoi se taper le cul par terre...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 08-01-2007 à 13:18:48

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-01-2007 à 13:48:09    

Emmanuel Delahaye a écrit :

Un léger overhead, c'est possible. Pas de quoi se taper le cul par terre...


 
Bruit dans la mesure. Parce que si je vire le static des 2 fonctions et que je déplie un vieux gcc 3.4.4 cygming tout moisis,


00401050 <_test_a>:
  401050:       push   %ebp
  401051:       mov    %esp,%ebp
  401053:       push   %edi
  401054:       xor    %edi,%edi
  401056:       push   %esi
  401057:       push   %ebx
  401058:       sub    $0x3c,%esp
  40105b:       xor    %esi,%esi
  40105d:       mov    $0xf423f,%ebx
  401062:       lea    0xffffffc8(%ebp),%eax
  401065:       mov    %esi,0x8(%esp)
  401069:       movl   $0x402000,0x4(%esp)
  401071:       add    %edi,%esi
  401073:       mov    %eax,(%esp)
  401076:       call   401900 <_sprintf>
  40107b:       dec    %ebx
  40107c:       jns    401062 <_test_a+0x12>
  40107e:       inc    %edi
  40107f:       cmp    $0x9,%edi
  401082:       jle    40105b <_test_a+0xb>
  401084:       add    $0x3c,%esp
  401087:       pop    %ebx
  401088:       pop    %esi
  401089:       pop    %edi
  40108a:       leave
  40108b:       ret
  40108c:       lea    0x0(%esi),%esi
 
00401090 <_test_b>:
  401090:       push   %ebp
  401091:       mov    %esp,%ebp
  401093:       push   %edi
  401094:       xor    %edi,%edi
  401096:       push   %esi
  401097:       push   %ebx
  401098:       sub    $0x3c,%esp
  40109b:       xor    %esi,%esi
  40109d:       mov    $0xf423f,%ebx
  4010a2:       lea    0xffffffc8(%ebp),%eax
  4010a5:       mov    %esi,0x8(%esp)
  4010a9:       movl   $0x402000,0x4(%esp)
  4010b1:       add    %edi,%esi
  4010b3:       mov    %eax,(%esp)
  4010b6:       call   401900 <_sprintf>
  4010bb:       dec    %ebx
  4010bc:       jns    4010a2 <_test_b+0x12>
  4010be:       inc    %edi
  4010bf:       cmp    $0x9,%edi
  4010c2:       jle    40109b <_test_b+0xb>
  4010c4:       add    $0x3c,%esp
  4010c7:       pop    %ebx
  4010c8:       pop    %esi
  4010c9:       pop    %edi
  4010ca:       leave
  4010cb:       ret
  4010cc:       lea    0x0(%esi),%esi


 
Autrement dit, strictement la même chose.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed