Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2038 connectés 

 

 

 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6
Auteur Sujet :

[C/C++] Défi: Trouvez les bogues ! (n°42)

n°222621
Musaran
Cerveaulté
Posté le 02-10-2002 à 02:52:06  profilanswer
 

Reprise du message précédent :
Juste une précision sur les "chaînes littérales" utilisées dans une expression:
(je viens de l'apprendre ici: http://david.tribble.com/text/cdiffs.htm)
 
En C(99), elles sont converties en char*.
En C++98, elles sont converties en const char*, puis en char*. Mais cette dernière conversion est dépréciée.
Dans les deux cas, elles ne sont pas modifiables.
 
Soignons bien notre code, si nous ne voulons pas faire partie des "break millions lines of code".
 
Je me demande comment une telle bévue a été possible, alors que le typage C++ est censé être très sur ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le 02-10-2002 à 02:52:06  profilanswer
 

n°222622
Musaran
Cerveaulté
Posté le 02-10-2002 à 02:52:53  profilanswer
 

Allez, puisque j'y suis:
[B]Trouvez le bogue n°18 ![/B]

Code :
  1. #include <stdio.h>
  2. int main(){
  3. int  i;
  4. puts("Tapez un caractère, puis entrée..." );
  5. i= getchar();
  6. if(i!=EOF){
  7.  char c= i;
  8.  printf("Vous avez tapé %c.\n",c);
  9. }
  10. return 0;
  11. }

Non, ce n'est pas du foutage de gueule, il y a un bogue !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°227786
Musaran
Cerveaulté
Posté le 14-10-2002 à 03:35:38  profilanswer
 

[B]Solution n° 18:[/B]
Celui-là mérites un roman à part: http://forum.hardware.fr/forum2.php3?post=26943&cat=10


Message édité par Musaran le 14-10-2002 à 03:36:06

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°227938
Musaran
Cerveaulté
Posté le 14-10-2002 à 23:22:34  profilanswer
 

[B]Trouvez les 10 bogues ! (n° 19 à 28)[/B]
Et aller, prix de gros, 10 bogues d'un coup !
De tous types, du plus évident au plus litigieux... et deux-trois pièges :D.
Fichier bogues.c

Code :
  1. # include "stdio.h"
  2. # include "stdlib.h"
  3. # define BUFSIZ 32
  4. # define _stringer (t) #t //transforme un mot du source en chaîne littérale
  5. /**/func () {
  6. /**/ void* buf;
  7. /**/ do {
  8. /**/  if (buf= malloc (BUFSIZ))
  9. /**/   if (scanf ("%"_stringer(BUFSIZ)"s", buf)) {
  10. /**/    //traiter la donnée...
  11. /**/   };
  12. /**/   else
  13. /**/    perror("echec de lecture" );
  14. /**/  free(buf);
  15. /**/ } while (!feof(stdin));
  16. /**/}


Comme d'habitude, il n'y a rien à gagner, si ce n'est la gloire d'être le premier à piger (pour la gloire, je ne garantis rien).


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°227970
El_gringo
Posté le 15-10-2002 à 08:48:41  profilanswer
 

Musaran a écrit a écrit :

[B]Trouvez les 10 bogues ! (n° 19 à 28)[/B]
Et aller, prix de gros, 10 bogues d'un coup !
De tous types, du plus évident au plus litigieux... et deux-trois pièges :D.
Fichier bogues.c

Code :
  1. # include "stdio.h"
  2. # include "stdlib.h"
  3. # define BUFSIZ 32
  4. # define _stringer (t) #t //transforme un mot du source en chaîne littérale
  5. /**/func () {
  6. /**/ void* buf;
  7. /**/ do {
  8. /**/  if (buf= malloc (BUFSIZ))
  9. /**/   if (scanf ("%"_stringer(BUFSIZ)"s", buf)) {
  10. /**/    //traiter la donnée...
  11. /**/   };
  12. /**/   else
  13. /**/    perror("echec de lecture" );
  14. /**/  free(buf);
  15. /**/ } while (!feof(stdin));
  16. /**/}


Comme d'habitude, il n'y a rien à gagner, si ce n'est la gloire d'être le premier à piger (pour la gloire, je ne garantis rien).




 

  • En cas d'erreur de lecture, scanf rend OEF, pas FALSE (0). 0, c'est si rien n'a été lu, sans erreur, bref, si rien n'était à lire.


  • C'est vachement mal indenté, le else correspond au 1er if et est aligné avec le 2e...


  • Le message d'erreur du else ne correspond pas à l'erreur. Si trop peut de mémoire est disponible pour réserver BUFSIZ octets...


Message édité par El_gringo le 15-10-2002 à 08:50:59
n°227977
El_gringo
Posté le 15-10-2002 à 08:51:26  profilanswer
 

Et je comprend pas l'histoire du _stringer #t
c quoi ça !??

n°234260
Musaran
Cerveaulté
Posté le 25-10-2002 à 05:13:24  profilanswer
 

Excuse-moi de t'avoir ignoré, mais la notification s'est désactivée, et bizarrement, j'ai raté le up du topic...
 

Citation :

En cas d'erreur de lecture, scanf rend OEF, pas FALSE (0). 0, c'est si rien n'a été lu, sans erreur, bref, si rien n'était à lire.

scanf renvoie:
EOF en cas d'erreur grave/plus de données.
Autrement, le nombre de champs saisis en entier.
 
Le 0 me semble improbable (aucune raison de refuser des caratères), et j'aurais dû penser à EOF... ce bogue-là est en plus !
 

Citation :

C'est vachement mal indenté, le else correspond au 1er if et est aligné avec le 2e...
...
Le message d'erreur du else ne correspond pas à l'erreur. Si trop peut de mémoire est disponible pour réserver BUFSIZ octets...

C'est voulu... c'est le bogue n°19 ! Le ";" n'a rien à faire ici, c'est tout.
 
Le "_stringer" permet de transformer un "mot" du source en chaîne.
Voici les étapes successives:

Code :
  1. scanf ("%"_stringer(BUFSIZ)"s", buf)
  2. scanf ("%"_stringer(32)"s", buf)
  3. scanf ("%""32""s", buf)
  4. scanf ("%32s", buf)


 
Il en reste plein à trouver...


Message édité par Musaran le 25-10-2002 à 05:14:29

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°234319
BifaceMcLe​OD
The HighGlandeur
Posté le 25-10-2002 à 10:42:37  profilanswer
 

En voici 2 :

  • Le point-virgule avant le "else" fait qu'il se rattache au "if (buf= malloc (BUFSIZ))"
  • Du coup, le "free(buf)" se retrouve à l'extérieur du "if (buf= malloc (BUFSIZ))", ce qui fait qu'on risque d'appeler "free" sur un pointeur sur lequel aucun "malloc" n'a été appelé...

n°235321
Musaran
Cerveaulté
Posté le 26-10-2002 à 23:40:13  profilanswer
 

Trop tard pour le ";"... déjà trouvé.
 
Souvenez-vous que j'ai une définition "large" du bogue.
Cela dit, il y en a quand même des gros... lisez bien.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°237692
Musaran
Cerveaulté
Posté le 31-10-2002 à 03:01:48  profilanswer
 

[B]Solution n° 21:[/B]
Il ne faut pas d'espace après les #.
La commande est "#include", pas le non-opérateur "#" suivi de la non-commande "include".
Je n'en suis pas tout à fait sûr, mais pas mal quand même.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le 31-10-2002 à 03:01:48  profilanswer
 

n°238028
leneuf22
Posté le 31-10-2002 à 16:56:16  profilanswer
 

[B]Bogue n° 29 :[/B]
 

Code :
  1. /*Le bulldozer fou*/
  2. #include <string.h>
  3. int main(void)
  4. {
  5. char szHello[] = "Hello, World !";
  6. char* pszWorld = szHello+7;
  7. strcpy(pszWorld, szHello);
  8. return 0;
  9. }


 
Un testeur ? Non ? Arf !


Message édité par leneuf22 le 06-11-2002 à 14:25:20
n°239242
Musaran
Cerveaulté
Posté le 04-11-2002 à 15:46:35  profilanswer
 

[B]Solution n° 22:[/B]

Code :
  1. #include "stdio.h" //danger
  2. #include <stdio.h> //mieux

Les includes standards se font avec <>, qui ne cherche que dans les répertoires standard.
Avec "", on risque de prendre un fichier du même nom qu'un bouffon aurait placé avec le source.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°239246
El_gringo
Posté le 04-11-2002 à 16:01:35  profilanswer
 

leneuf22 a écrit a écrit :

Bogue n° 29 :
 
/*Le bulldozer fou*/
#include <string.h>
int main(void)
{
char szHello[] = "Hello, World !";
char* pszWorld = szHello+7;
strcpy(pszWorld, szHello);
return 0;
}
 
Un testeur ? Non ? Arf !




 
Bah c pas bien méchant ça qd même !
Comme buldozer fou, y a autrement pire.

n°239310
BifaceMcLe​OD
The HighGlandeur
Posté le 04-11-2002 à 17:26:08  profilanswer
 

Musaran a écrit a écrit :

[B]Solution n° 21:[/B]
Il ne faut pas d'espace après les #.
La commande est "#include", pas le non-opérateur "#" suivi de la non-commande "include".
Je n'en suis pas tout à fait sûr, mais pas mal quand même.




Pas de chance, le standard C autorise des espaces entre le dièse et le mot-clé préprocesseur...  :D

n°239638
Musaran
Cerveaulté
Posté le 05-11-2002 à 00:37:18  profilanswer
 

Eh ben... il en faut pour que quelqu'un réagisse !
Bon, j'aurais appris quelque chose.
 
[B]Solution n° 23:[/B]

Code :
  1. #define BUFSIZ 32

BUFSIZ est déjà utilisé dans <stdio.h>.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°239671
El_gringo
Posté le 05-11-2002 à 09:24:02  profilanswer
 

Musaran a écrit a écrit :

Eh ben... il en faut pour que quelqu'un réagisse !
Bon, j'aurais appris quelque chose.
 
[B]Solution n° 23:[/B]

Code :
  1. #define BUFSIZ 32

BUFSIZ est déjà utilisé dans <stdio.h>.




 
...impossible à savoir sans compiler le truc !

n°240218
Musaran
Cerveaulté
Posté le 05-11-2002 à 23:13:02  profilanswer
 

Compiler est un excellent moyen pour trouver certains bogues. :D  


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°240256
smax
Posté le 05-11-2002 à 23:23:46  profilanswer
 

je me souviens avec BorlandC++ sous dos,
 
a la fin du fichier source, tu fais plein de retour a la ligne (une bonne centaine) et tu colles un ';' à la fin du fichier !!!
 
 
impossible de trouver l'erreur a partir des messages d'erreur du compilo !!!


---------------
Avoir un arbre dans son jardin n'empêche en rien de se promener en forêt.
n°240443
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 12:32:16  profilanswer
 

Citation :


/*Le bulldozer fou*/  
#include <string.h>  
int main(void)  
{  
char szHello[] = "Hello, World !";  
char* pszWorld = szHello+7;  
strcpy(pszWorld, szHello);  
return 0;  
}  


 
char* pszWorld = szHello+7;
elle est bizarre cette ligne ...
pszWorld est un pointeur, alors que szHello est un tableau, je ne comprends pas ce que fais '+7' sur un tableau
 
d'autre part strcpy prend 2 pointeurs, pour ses 2 paramètres, et pas de tableau

n°240449
bjone
Insert booze to continue
Posté le 06-11-2002 à 12:44:34  profilanswer
 

blackgoddess a écrit a écrit :

Citation :


/*Le bulldozer fou*/  
#include <string.h>  
int main(void)  
{  
char szHello[] = "Hello, World !";  
char* pszWorld = szHello+7;  
strcpy(pszWorld, szHello);  
return 0;  
}  


 
char* pszWorld = szHello+7;
elle est bizarre cette ligne ...
pszWorld est un pointeur, alors que szHello est un tableau, je ne comprends pas ce que fais '+7' sur un tableau
 
d'autre part strcpy prend 2 pointeurs, pour ses 2 paramètres, et pas de tableau




 
elle est pas bizarre, szHello+7 reviens à écrire &szHello[7].  
sinon c pas mal comme technique pour initialiser toute la mémoire :D


Message édité par bjone le 06-11-2002 à 12:44:50
n°240451
leneuf22
Posté le 06-11-2002 à 12:48:59  profilanswer
 

Un nom de tableau est un pointeur (un pointeur vers le premier élément du tableau)
 
szHello + 7
équivaut à
&szHello[0] + 7
équivaut à
&szHello[7]


Message édité par leneuf22 le 06-11-2002 à 12:52:46
n°240462
BifaceMcLe​OD
The HighGlandeur
Posté le 06-11-2002 à 13:18:24  profilanswer
 

Exact, un tableau en C est en fait un pointeur constant sur lequel on ne peut pas faire d'allocation mémoire explicite.
 
Et effectivement, il y a de l'écrasement mémoire dans l'air avec ce joli strcpy()...  ;)

n°240493
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 14:25:26  profilanswer
 

ok d'accord :) (les tableaux n'étaient pas très clairs pour moi, now c bcp mieux :))


---------------
-( BlackGoddess )-
n°240496
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 14:33:39  profilanswer
 

ah ! g p-e trouvé alors le buldozer fou :
strcpy(pszWorld, szHello);
va vouloir donc en fait copier szHello[0] dans pszWorld[0] donc dans szHello[7], donc déjà lorsqu'on va arriver à copier szHello[7] dans pszWorld[7], donc dans szHello[13] (il me semble) ca va recopier szHello[0], or la strcpy s'arrête de copier lorsqu'il rencontre un caractère 0, il ne risque pas d'en trouver, il va donc y avoir une boucle infinie. Mais avant ca, szHello pointe vers un tableau de 15 charactères si je compte bien, donc lorsqu'il va arriver à vouloir copier szHello[9] dans pszWorld[9] donc dans szHello[15], il va faire une erreur car szHello[15] n'existe pas.
 
Mon raisonnement est-il juste ?


---------------
-( BlackGoddess )-
n°240515
leneuf22
Posté le 06-11-2002 à 14:47:48  profilanswer
 

"il va faire une erreur car szHello[15] n'existe pas"
 
Un programme C ne sait jamais si il a dépassé la limite du tableau : il n'y aura pas d'erreur à cause de ça :)
 
Seul le compilo a une chance de t'avertir à temps, quand tu spécifies un index trop grand : dans notre cas, il ne risque pas de t'avertir !


Message édité par leneuf22 le 06-11-2002 à 14:50:34
n°240535
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 14:59:30  profilanswer
 

oui, mais je veux dire : c'est un bogue non ? car on ne sait absolument pas ce qu'il va samuser à aller copier (et ca peut durer longtemps si la plage mémoire ne contient pas à un moment un caractère 0)


---------------
-( BlackGoddess )-
n°240590
leneuf22
Posté le 06-11-2002 à 15:20:31  profilanswer
 

Le programme ne rencontrera JAMAIS 0 car strcpy recopie un caractère de szHello et le met à la fin de szHello après avoir écrasé le "World !" ! Comme ça on est sur d'écraser un quelconque zéro qui serait sur le chemin du bulldozer ! (sinon ça ne serait pas un vrai bulldozer fou !)
 
 
En théorie :
"Hello, World !"
devient
"Hello, Horld !" //Le H se met sur le W
puis
"Hello, Herld !" //Le e se met sur le o
et
"Hello, Helld !" //Le l se met sur le r
 
et encore
 
"Hello, Hello, " // juste après ça, le H du 2eme Hello va venir se placer après l'espace, et écrasera le \0. Tout ce qui est sur le passage du bulldozer sera écrasé.
 
jusqu'à devenir :
"Hello, Hello, Hello, Hello, Hello, H..."etc !
 
Tu vois bien que le caractère lu ne pourra jamais avoir 0 pour valeur : strcpy se charge d'aménager le chemin du bulldozer avant son passage :)
 
L'erreur sera une violation d'accès, car un prog n'a pas le droit de modifier toute la mémoire :)


Message édité par leneuf22 le 06-11-2002 à 15:38:59
n°240639
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 15:23:58  profilanswer
 

ah oui tres juste :) chui zeureux c le 1er bogue ke je trouve :)


---------------
-( BlackGoddess )-
n°240683
BifaceMcLe​OD
The HighGlandeur
Posté le 06-11-2002 à 15:54:46  profilanswer
 

Moralité : par sécurité, utilisez toujours strncpy plutôt que strcpy.  ;)

n°240898
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 21:46:31  profilanswer
 

Musaran tu as écrit :
 
  char  tabChar1[] = {'H','e','l','l','o',' ','W','o','r','l','d','\0'};
  char  tabChar2[] = "Hello World";
  char *ptrChar    = "Hello World";
 
tabChar1 est un tableau de taille appropriée (12).
Si c'est dans une fonction, le tableau est alloué localement, donc sur la pile. Et désalloué à la "}" fermant le bloc de code.
Qu'il soit copié depuis un original global ou généré par le code exécutable, on n'en sait rien, et on n'a pas besoin de le savoir...
 
tabChar2 est exactement pareil à tabChar1.
C'est juste une forme d'écriture simplifiée...
 
je ne suis absolument pas d'accord : dans le 1er cas, la chaine est écrite dans le segment de données de l'exécutable, alors que dans le 2eme cas la chaine est écrite caractère par caractère dans le code !


---------------
-( BlackGoddess )-
n°240952
leneuf22
Posté le 06-11-2002 à 22:47:01  profilanswer
 

Non, Musaran a raison !
 
char gaga[] = {'g', 'a', 'g', 'a', '\0' };
est un RACCOURCI de
char gaga[] = "gaga";
 
les 2 sont des tableaux alloués de la même façon, et dans la même mémoire.
 
c'est
char* gaga = "gaga";
qui est différent : stocké en mémoire statique (aussi appellée mémoire permanente), et peut être utilisé par différents pointeurs, alors que les 2 premiers exemples sont stockés sur la pile.
 
merci mon bouquin !
Si tu en cherches un je peux te conseiller :)


Message édité par leneuf22 le 06-11-2002 à 22:56:34
n°241080
Musaran
Cerveaulté
Posté le 07-11-2002 à 05:23:44  profilanswer
 

En bref, un tableau utilisé dans une expression se "décompose" automatiquement en pointeur sur son premier élément.
C'est ce qui arrive avec "tab[i]", qui signifie en fait "*(tab+i)".
L'arithmétique des pointeurs fait que "tab+i" est un pointeur sur le i-ème élément du tableau.
 
Malgré la facilité apparente, il ne faut pas céder à la tentation d'assimiler un tableau C à un simple pointeur.
Le tableau est bien un tableau avant décomposition éventuelle. Par exemple:

Code :
  1. int tab[3][4];
  2. sizeof tab; //taille de 12 int, pas d'un pointeur
  3. cout << typeid(tab).name() ; //"int[3][4]" (C++)
  4. void f(int (*tabarg)[4]){} ; //recevra tab (seule la première dimension se décompose en pointeur)


 

BlackGoddess a écrit a écrit :

je ne suis absolument pas d'accord : dans le 1er cas, la chaine est écrite dans le segment de données de l'exécutable, alors que dans le 2eme cas la chaine est écrite caractère par caractère dans le code !


Et non... donnée locale, générée on ne sait comment par le compilateur.
Je le mentionne justement parceque c'est piégeux.
C'est l'un des rares cas où une chaine littérale du source n'est pas une constante littérale compilée.
Autre cas: extern "C", où la chaîne est un genre de paramètre de mot-clef.
Il y en a aussi avec certaines directives #pragmas.


Message édité par Musaran le 07-11-2002 à 05:24:21

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°241148
gilou
Modérateur
Modosaurus Rex
Posté le 07-11-2002 à 12:08:09  profilanswer
 

BlackGoddess a écrit a écrit :

Musaran tu as écrit :
 
  char  tabChar1[] = {'H','e','l','l','o',' ','W','o','r','l','d','\0'};
  char  tabChar2[] = "Hello World";
  char *ptrChar    = "Hello World";
 
tabChar1 est un tableau de taille appropriée (12).
Si c'est dans une fonction, le tableau est alloué localement, donc sur la pile. Et désalloué à la "}" fermant le bloc de code.
Qu'il soit copié depuis un original global ou généré par le code exécutable, on n'en sait rien, et on n'a pas besoin de le savoir...
 
tabChar2 est exactement pareil à tabChar1.
C'est juste une forme d'écriture simplifiée...
 
je ne suis absolument pas d'accord : dans le 1er cas, la chaine est écrite dans le segment de données de l'exécutable, alors que dans le 2eme cas la chaine est écrite caractère par caractère dans le code !




 
Comme le dit tres bien A Koenig ici:

Citation :

Another example of this sort of thing happens surprisingly often. One file of a program will contain a declaration like:
char filename[] = "/etc/passwd";
and another will contain this declaration:
char *filename;
Although arrays and pointers behave very similarly in some contexts, they are not the same. In the first declaration, filename is the name of an array of characters. Although using the name will generate a pointer to the first element of that array, that pointer is generated as needed and not actually kept around.
In the second declaration, filename is the name of a pointer. That pointer points wherever the programmer makes it point. If the programmer doesn?t give it a value, it will have a zero (null) value by default.
The two declarations of filename use storage in different ways; they cannot coexist.


 
Extrait de ce livre http://www.research.att.com/~ark/bibliography/pitfalls.small.jpeg que tout programmeur C devrait avoir lu ET maitrisé surtout maintenant qu'il est disponible en PDF sur le web: http://www.literateprogramming.com/ctraps.pdf
 
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
n°241595
blackgodde​ss
vive le troll !
Posté le 08-11-2002 à 00:50:39  profilanswer
 

(je comprends pas tres bien l'anglais) mais je suis pas fou !!!!!! g testé le char Test[] = "Test"; et char Test[] = {'T','e','s','t',0}; et g compilé le prog, et l'ai ensuite désassemblé, et je certifie que dans le 1er cas "Test" est écrit dans le segment de data, dans le 2eme cas {'T','e','s','t',0}; est écrit par codage, avec les code ASCII des caractères les 1 apres les autres, donc je maintiens mon point de vue : les 2 méthodes sont DIFFERENTES


---------------
-( BlackGoddess )-
n°241613
Musaran
Cerveaulté
Posté le 08-11-2002 à 02:13:34  profilanswer
 

gilou a écrit a écrit :

Extrait de ce livre http://www.research.att.com/~ark/b [...] small.jpeg que tout programmeur C devrait avoir lu ET maitrisé surtout maintenant qu'il est disponible en PDF sur le web: http://www.literateprogramming.com/ctraps.pdf



Miam !


Message édité par Musaran le 08-11-2002 à 02:14:56

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°241618
Musaran
Cerveaulté
Posté le 08-11-2002 à 02:25:40  profilanswer
 

BlackGoddess a écrit a écrit :

(je comprends pas tres bien l'anglais) mais je suis pas fou !!!!!! g testé le char Test[] = "Test"; et char Test[] = {'T','e','s','t',0}; et g compilé le prog, et l'ai ensuite désassemblé, et je certifie que dans le 1er cas "Test" est écrit dans le segment de data, dans le 2eme cas {'T','e','s','t',0}; est écrit par codage, avec les code ASCII des caractères les 1 apres les autres, donc je maintiens mon point de vue : les 2 méthodes sont DIFFERENTES




 
Particularité de compilateur.
Du point de vue du langage, il n'y a pas de différence.
À moins que quelqu'un trouve une référence du standard quelque part...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°241714
bjone
Insert booze to continue
Posté le 08-11-2002 à 12:44:32  profilanswer
 

BlackGoddess a écrit a écrit :

(je comprends pas tres bien l'anglais) mais je suis pas fou !!!!!! g testé le char Test[] = "Test"; et char Test[] = {'T','e','s','t',0}; et g compilé le prog, et l'ai ensuite désassemblé, et je certifie que dans le 1er cas "Test" est écrit dans le segment de data, dans le 2eme cas {'T','e','s','t',0}; est écrit par codage, avec les code ASCII des caractères les 1 apres les autres, donc je maintiens mon point de vue : les 2 méthodes sont DIFFERENTES




 
y fait quoi le compilo ? un push ou des mov dans la pile ?

n°241727
bjone
Insert booze to continue
Posté le 08-11-2002 à 13:10:53  profilanswer
 

haha très drôle  :heink:  
 
je viens de zieuter ce que le VC7 de Visual Studio.Net faisait, effectivement avec {'T','e','s','t',0}, la chaine est généré par mov de BYTEs sur la pile.

n°241921
blackgodde​ss
vive le troll !
Posté le 08-11-2002 à 18:56:00  profilanswer
 

mais moi ca me fait pas rire du tout :p


---------------
-( BlackGoddess )-
n°241973
Ace17
Posté le 08-11-2002 à 20:57:47  profilanswer
 

bjone a écrit a écrit :

haha très drôle  :heink:  
je viens de zieuter ce que le VC7 de Visual Studio.Net faisait, effectivement avec {'T','e','s','t',0}, la chaine est généré par mov de BYTEs sur la pile.




 
Mais quel intéret?

n°241984
bjone
Insert booze to continue
Posté le 08-11-2002 à 21:42:13  profilanswer
 

sais pas.
je vois pas l'interet par rapport à l'avoir dans le segment de donnée...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6

Aller à :
Ajouter une réponse
 

Sujets relatifs
comment trouvez mon site???[JS] JEU: Trouvez l'erreur :o)
Un petit défi : echecs et IA[DEFI DELPHI] - Delayer un buffer pour les Visualization Winamp
Defi programmation JAVA ou autreDefi PHP n°3 !!!
Plus de sujets relatifs à : [C/C++] Défi: Trouvez les bogues ! (n°42)


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)