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

 

 

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

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

n°175116
Plucker
Posté le 11-07-2002 à 14:11:39  profilanswer
 

Reprise du message précédent :
[

musaran a écrit a écrit :

[B]Kristoph[/B] a trouvé le (2).
Quelle est la valeur de l'expression "ch = getchar()" ?
-Les spécifications du C moderne disent: la valeur de ch.
-Beaucoup d'implémentations utilisent le retour de getchar().
Donc ce code risque de marcher... alors qu'il ne devrait pas !
 




Ben je dirais que c'est bon parce que:
dans le cas 1 : retour de la valeur de ch, ch etant definis comme
char et donc signe', et EOF = -1 donc la conversion est correct.
dans le cas 2: trivial !
 
en fait il aurait fallu declarer unsigned ch ... et la boucle infinie !
 
Plucker

mood
Publicité
Posté le 11-07-2002 à 14:11:39  profilanswer
 

n°175422
tanguy
Posté le 11-07-2002 à 21:25:38  profilanswer
 

chrisbk a écrit a écrit :

 
c fort joli mais pkoi est ce qu'on pourrait pas faire ca avec visu ?




 

youdontcare a écrit :

 
vc il peut pas tracer des lignes et carrés à la con




 

letoII a écrit :

 
Ouai enfin si c juste que tu peux pas faire de diagramme UML c pas top grave, Visual a des lacunes plus graves je trouve




 

Harkonnen a écrit :

 
Tanguy > t'as déja entendu parler de Visio ?  




 
putain j'hallucine !
On leur montre une ferrari et ils la confondent avec une chaise
 
Le programme à l'écran c'est un logiciel qui s'appelle Together qui permet de concevoir et de programmer des logiciels
 
http://togethersoft.com/index.jsp
http://togethersoft.com/products/c [...] /index.jsp
 
Son principal avantage est qu'il permet le round trip engineering
C'est à dire la faculté de modifier le diagramme de classes et de répercuter les modifications sur le code source
inversement lorsque l'on modifie le code source, ca modifie le diagramme de classes automagiquement.
 
Par exemple, je crée une classe en un clic, ca me génére le .h et le .cc. je clique sur ajouter un constructeur et automatiquement il est ajouté.
Si je modifie les paramètres du constructeur que je viens d'ajouter, ca va modifier le diagramme UML
 
Ca fait aussi les diagrammes de séquences, l'audit du code source, le refactoring, la génération de la documentation, ca supporte le C++ et Java, on peut facilement implémenter les design patterns du GOF, intègre un frontend à CVS, le debug, constructeur d'interface graphique, export/import xmi, reconnait EJB J2EE XML  ect...
 
C'est LE soft de développement le plus avancé à l'heure actuelle
Eclipse, rational rose ou netbeans ne proposent pas le quart de ce que fait Together.
Ca fait 4 mois que je l'utilise et pour moi c'est révolutionnaire pour le développement. Tu peux vraiment te concentrer sur la conception, tu peux communiquer facilement avec les autres codeurs et tu détectes très rapidement les erreurs que tu fais.
 
http://tanguy.dyndns.org/~tanguy/together3.gif
 
Ce qu'on voit à l'image c'est le diagramme de classes d'un logiciel qui comporte en jaune des interfaces, en vert un joli design patterns, en rose des observer, un héritage en diamant...
ca représente un onglet dans Together. les autres onglets comportent des diagrammes similaires.
Sans Together il aurait fallu 10x plus de temps pour programmer ce qu'il y a à l'écran.
 
Pour ceux qui trouvent que c'est juste des traits et des rectangles, il vaut mieux qu'ils changent de métier.

n°175428
chrisbk
-
Posté le 11-07-2002 à 22:02:08  profilanswer
 

ben on dit pas, mais pkoi on pourrait pas le faire avec visu ?  
 
(et bon, quand on connait le prog, la seule chose qu'on voit c bien des traits et des rectangles)

n°175501
Musaran
Cerveaulté
Posté le 12-07-2002 à 00:34:54  profilanswer
 

Euh siouplait non, pas de géguerre sur les EDI ici.
Vous savez bien que c'est des sujets qui fachent, alors allez vous battre ailleurs.
 
 
Plucker:
-"unsigned char" (de 0 à 255)
-"signed char" (de -128 à 127)
-"char" est un type distinct.
Selon les implémentaions , "char" peut être comme signed ou unsigned.
 
Quoi qu'il en soit, "EOF" n'est PAS un caractère, et sa valeur (qui ne regarde personne soit dit en passant) n'est celle d'aucun caractère.
C'est pourquoi "getchar" renvoie un "int" plutôt qu'un "char": pour caser cette valeur.
Donc "ch=getchar()" ne peut valoir "EOF". Du moins ne devrait pas.
 
 
[B]Trouvez le bogue !(9)[/B]

Code :
  1. #include <stdio.h>
  2. int main(){
  3. char * chaineC = "Hello world" ;
  4. printf("%s\n" , chaineC) ;
  5. return 0 ;
  6. }


Ce code contient un bogue en puissance.
Un débutant faisant des essais pourrait tomber dessus... ou pas.


Message édité par Musaran le 23-07-2002 à 01:31:22

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°175524
LetoII
Le dormeur doit se réveiller
Posté le 12-07-2002 à 08:19:38  profilanswer
 

J'aurais plutôt mis  
 

Code :
  1. char chaineC[] = "Hello world" ;


Mais je pense que c plus cosmétique qu'autre chose.  


---------------
Le Tyran
n°175525
LetoII
Le dormeur doit se réveiller
Posté le 12-07-2002 à 08:21:51  profilanswer
 

tanguy a écrit a écrit :

 
 
 
 
 
 
 
 
putain j'hallucine !
On leur montre une ferrari et ils la confondent avec une chaise
 
Le programme à l'écran c'est un logiciel qui s'appelle Together qui permet de concevoir et de programmer des logiciels
 
http://togethersoft.com/index.jsp
http://togethersoft.com/products/c [...] /index.jsp
 
Son principal avantage est qu'il permet le round trip engineering
C'est à dire la faculté de modifier le diagramme de classes et de répercuter les modifications sur le code source
inversement lorsque l'on modifie le code source, ca modifie le diagramme de classes automagiquement.
 
Par exemple, je crée une classe en un clic, ca me génére le .h et le .cc. je clique sur ajouter un constructeur et automatiquement il est ajouté.
Si je modifie les paramètres du constructeur que je viens d'ajouter, ca va modifier le diagramme UML
 
Ca fait aussi les diagrammes de séquences, l'audit du code source, le refactoring, la génération de la documentation, ca supporte le C++ et Java, on peut facilement implémenter les design patterns du GOF, intègre un frontend à CVS, le debug, constructeur d'interface graphique, export/import xmi, reconnait EJB J2EE XML  ect...
 
C'est LE soft de développement le plus avancé à l'heure actuelle
Eclipse, rational rose ou netbeans ne proposent pas le quart de ce que fait Together.
Ca fait 4 mois que je l'utilise et pour moi c'est révolutionnaire pour le développement. Tu peux vraiment te concentrer sur la conception, tu peux communiquer facilement avec les autres codeurs et tu détectes très rapidement les erreurs que tu fais.
 
http://tanguy.dyndns.org/~tanguy/together3.gif
 
Ce qu'on voit à l'image c'est le diagramme de classes d'un logiciel qui comporte en jaune des interfaces, en vert un joli design patterns, en rose des observer, un héritage en diamant...
ca représente un onglet dans Together. les autres onglets comportent des diagrammes similaires.
Sans Together il aurait fallu 10x plus de temps pour programmer ce qu'il y a à l'écran.
 
Pour ceux qui trouvent que c'est juste des traits et des rectangles, il vaut mieux qu'ils changent de métier.
 




 
C bien joli tout ça mais on était surtout parti sur la qualité des compilo en eux même, et même si les fonctionalités de Together on l'air géniale ct pas franchement le sujet de départ (c bien beau d'avoir un chouete code mais si tu peux pas le compiler correctement après c moyen) et de toute manière ct pas le topic de départ donc on va arréter là :D


---------------
Le Tyran
n°175931
Musaran
Cerveaulté
Posté le 13-07-2002 à 00:42:39  profilanswer
 

letoII a écrit a écrit :

J'aurais plutôt mis

Code :
  1. char chaineC[] = "Hello world" ;

Mais je pense que c plus cosmétique qu'autre chose.


1) Il y a une différence plus que cosmétique.
2) Ta proposition corrige le problème.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°175955
LetoII
Le dormeur doit se réveiller
Posté le 13-07-2002 à 09:32:32  profilanswer
 

musaran a écrit a écrit :

1) Il y a une différence plus que cosmétique.
2) Ta proposition corrige le problème.




 
Ha, ben tant mieu alors :D
 
J'aime pas avoir la réponse sans savoir pkoi elle est bonne :D


Message édité par LetoII le 13-07-2002 à 09:32:53

---------------
Le Tyran
n°175956
youdontcar​e
Posté le 13-07-2002 à 09:50:52  profilanswer
 

musaran a écrit a écrit :

1) Il y a une différence plus que cosmétique.


quelle différence entre char var[] et char* var ?

n°175966
LetoII
Le dormeur doit se réveiller
Posté le 13-07-2002 à 11:45:40  profilanswer
 

A mon avis dans le prmier cas le compilo réserve de la place soit sur la pile soit dans le ségment de donnée pour la chaine, dans le deuxième tu déclare un pointeur sur une chaine qui est crée sur la pile... Ouai c pas flagrant là différence ne fait, heu ça doit pas être ça :D
 
Edit: En fait si par ce que y a de forte chance que la chaine disparaisse après l'instruction dans le 2eme cas:

Code :
  1. char *chaine = "chaine";


 
Alors que dans le prmier elle fait partie des variables locale de la fonction.


Message édité par LetoII le 13-07-2002 à 11:50:50

---------------
Le Tyran
mood
Publicité
Posté le 13-07-2002 à 11:45:40  profilanswer
 

n°175969
Kristoph
Posté le 13-07-2002 à 11:57:47  profilanswer
 

Ca devient un peu tordu. A ce niveau la j'ai ca pour vous :
 
Ce code contient un bug en puissance
 

Code :
  1. int main()
  2. {
  3.    return 0;
  4. }


 
 
 
 
 
 
 
 
 
 
Réponse : c'est du C ou du C++.

n°176080
ChoBaron
Posté le 14-07-2002 à 03:00:36  profilanswer
 

musaran a écrit a écrit :

[B]Trouvez le bogue !(9)[/B]

Code :
  1. #include <stdio.h>
  2. int main(){
  3. char * chaineC = "Hello world" ;
  4. printf("%s\n" , chaineC) ;
  5. return 0 ;
  6. }


Ce code contient un bogue en puissance.
Un débutant faisant des essais pourrait tomber dessus... ou pas.




 
il faut faire une allocation mémoire de la chaine

n°176084
Musaran
Cerveaulté
Posté le 14-07-2002 à 05:45:15  profilanswer
 

youdontcare a écrit a écrit :

quelle différence entre char var[] et char* var ?  



Code :
  1. char chaineC[] = "Hello world" ;//tableau local
  2. char* chaineC  = "Hello world" ;//pointeur sur un tableau global

C'est très différent pour sizeof par exemple.
 

LetoII a écrit a écrit :

y a de forte chance que la chaine disparaisse après l'instruction dans le 2eme cas


Non, jamais.
 
Je vous laisse encore chercher, puis je vous fait un cours magistral.
 
Kristoph:
C'est valide en C et C++. Pas de bogue.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°176085
Musaran
Cerveaulté
Posté le 14-07-2002 à 05:48:39  profilanswer
 

ChoBaron a écrit a écrit :

il faut faire une allocation mémoire de la chaine


Pas du tout.
Disons, éventuellement si je veux écrire dedans.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°176087
ChoBaron
Posté le 14-07-2002 à 07:15:24  profilanswer
 

Disons le \0 alors

n°176167
ITM
Avatar peint à la main
Posté le 14-07-2002 à 19:17:59  profilanswer
 

C'est pas bugué mais c'est tellement excellent!
C'est du C ;)
 

Code :
  1. #include <stdio.h>
  2. char
  3. *T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s",
  4. K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;X(){r  [r
  5. [r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x&     7)
  6. -1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g       =J
  7. ),x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2         +(
  8. x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A            ,1
  9. ][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l              ()
  10. );}B(){*J&&B((D=*J,Q[2]<D&&D<k[1]&&(*g++=1                ),
  11. !(D-W&&D-9&&D-10&&D-13)&&(!*r&&(*g++=0)                   ,*
  12. r=1)||64<D&&D<91&&(*r=0,*g++=D-63)||D                     >=
  13. 97&&D<123&&(*r=0,*g++=D-95)||!(D-k[                       3]
  14. )&&(*r=0,*g++=12)||D>k[3]&&D<=k[                          1]
  15. -1&&(*r=0,*g++=D-47),J++));}j(                            ){
  16. putchar(A);}b(){(j(A=(*K)[D*                              W+
  17. r[2]*Y+x]),++x<Y)&&b();}t                                 ()
  18. {(j((b(D=q[g],x=0),A=W)                                   ),
  19. ++q<(*(r+1)<Y?*(r+1):                                     Y)
  20. )&&t();}R(){(A=(t(                                        q=
  21. 0),'\n'),j(),++r                                          [2
  22. ]<N)&&R();}O()                                            {(
  23. j((r[2]=0,R(                                              ))
  24. ),r[1]-=q)                                                &&
  25. O(g-=-q)                                                  ;}
  26. C(){(                                                     J=
  27. gets                                                      (K
  28. [1]))&&C((B(g=K[2]),*r=!(!*r&&(*g++=0)),(*r)[r]=g-K[2],g=K[2
  29. ],r[
  30. 1]&&
  31. O())
  32. );;}
  33. main
  34. (){C
  35. ((l(
  36. (J=(
  37. A=0)
  38. [K],
  39. A[M]
  40. =(F=
  41. (k=(
  42. M[!A
  43. ]=(Q
  44. =T+(
  45. q=(Y
  46. =(W=
  47. 32)-
  48. (N=4
  49. ))))
  50. +N)+
  51. 2)+7
  52. )+7)
  53. ),Y=
  54. N<<(
  55. *r=!
  56. -A))
  57. );;}


 
Pas mal, hein?


---------------
iteme.free.fr | Mon feedback
n°177575
Ace17
Posté le 17-07-2002 à 09:49:58  profilanswer
 

OUahou!!!!!!!! Ca compile ca???

n°177591
Ace17
Posté le 17-07-2002 à 09:59:53  profilanswer
 

Non, ca ne compile pas...dommage

n°178454
ITM
Avatar peint à la main
Posté le 18-07-2002 à 22:26:10  profilanswer
 

Excuse moi, mais ça compile parfaitement bien!
Ca dessine des bonhommes en ASCII, c'est excellent !


---------------
iteme.free.fr | Mon feedback
n°178481
Ace17
Posté le 18-07-2002 à 23:59:32  profilanswer
 

ITM a écrit a écrit :

 
 
char
*T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s",
K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;
X() ici on déclare X
{r  [r
[r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x&     7)
-1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g=J) ici on l'invoque
,x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2         +(
x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A            ,1
][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l              ()
);}B(){*J&&B((D=*J,Q[2]<D&&D<k[1]&&(*g++=1                ),
!(D-W&&D-9&&D-10&&D-13)&&(!*r&&(*g++=0)                   ,*
r=1)||64<D&&D<91&&(*r=0,*g++=D-63)||D                     >=
97&&D<123&&(*r=0,*g++=D-95)||!(D-k[                       3]
)&&(*r=0,*g++=12)||D>k[3]&&D<=k[                          1]
-1&&(*r=0,*g++=D-47),J++));}j(                            ){
putchar(A);}b(){(j(A=(*K)[D*                              W+
r[2]*Y+x]),++x<Y)&&b();}t                                 ()
{(j((b(D=q[g],x=0),A=W)                                   ),
++q<(*(r+1)<Y?*(r+1):                                     Y)
)&&t();}R(){(A=(t(                                        q=
0),'\n';),j(),++r                                          [2
]<N)&&R();}O()                                            {(
j((r[2]=0,R(                                              ))
),r[1]-=q)                                                &&
O(g-=-q)                                                  ;}
C(){(                                                     J=
gets                                                      (K
[1]))&&C((B(g=K[2]),*r=!(!*r&&(*g++=0)),(*r)[r]=g-K[2],g=K[2
],r[
1]&&
O())
);;}
main
(){C
((l(
(J=(
A=0)
[K],
A[M]
=(F=
(k=(
M[!A
]=(Q
=T+(
q=(Y
=(W=
32)-
(N=4
))))
+N)+
2)+7
)+7)
),Y=
N<<(
*r=!
-A))
);;}
 




 
Le nombre de parametres passé a X est incorrect


Message édité par Ace17 le 19-07-2002 à 00:01:05
n°179073
Musaran
Cerveaulté
Posté le 20-07-2002 à 02:03:48  profilanswer
 

Il est temps de répondre.
 
[B]Solution (7):[/B]

Code :
  1. vector<vector<int> > VecVec ; //espace séparant les deux ">"

L'analyseur syntaxique du C/C++ est dit "gourmand": il prends le plus gros morceau qu'il reconnaisse.
C'était juste pour rappeler que la syntaxe du C++ n'est pas analysée en fonction du contexte: il ne va pas interpréter le symbole ">>" comme ">"+">" juste parceque ce serait plus approprié.
 
[B]Solution (9):[/B]
Les chaînes C littérales "..." sont des [B]constantes[/B].
"chaineC" est un pointeur sur caractères non constants, et permet donc de (tenter de) modifier la constante.
Si votre compilateur et votre OS gèrent les pages de données en lecture seule, cela ferait une violation de mémoire.
Pourquoi les compilateurs ne protestent pas ? Sans doute parceque c'est tellement courant...

Code :
  1. char* str   ="ABC"; //imprudent
  2.             str[0]='a'  ; //utilisation erronée
  3. const char* str   ="ABC"; //solution1: pointeur sur constante globale, "*str=" illégal
  4.       char  str[] ="ABC"; //solution2: tableau      variable  local  , "*str=" légal


Je prépare un post pour en parler plus en détail et de façon plus générale.


Message édité par Musaran le 20-07-2002 à 02:04:46

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°179074
Musaran
Cerveaulté
Posté le 20-07-2002 à 02:06:07  profilanswer
 

[B]Trouvez le bogue !(10 à 15)[/B]

Code :
  1. #include <ctype.h>
  2. #include <stdio.h>
  3. void main(){
  4. printf("Le caractère de valeur  64 est: %c\n",064) ;
  5. printf("Le caractère de valeur 128 est: %c\n",128) ;
  6. printf("Entrez un caractère :\m" ) ;
  7. char in = getchar() ;
  8. if(isalpha(in) == TRUE)
  9.  printf("Vous avez entré la lettre ""'%s'"" qui a pour valeur: %u.\n",in,in) ;
  10. }


Message édité par Musaran le 21-07-2002 à 01:16:11

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°179293
LetoII
Le dormeur doit se réveiller
Posté le 20-07-2002 à 21:10:13  profilanswer
 

musaran a écrit a écrit :

[B]Trouvez le bogue !(10 à 17)[/B]

Code :
  1. #include <ctype.h>
  2. #include <stdio.h>
  3. void main(){
  4. printf("Le caractère de valeur  64 est: %c\n",064) ;
  5. printf("Le caractère de valeur 128 est: %c\n",128) ;
  6. printf("Entrez un caractère :\m" ) ;
  7. char in = getchar() ;
  8. if(isalpha(in) == TRUE)
  9.  printf("Vous avez entré la lettre ""'%s'"" qui a pour valeur: %u.\n",in,in) ;
  10. }






 
Y a u ntruc qui va pas là:

Code :
  1. printf("Vous avez entré la lettre ""'%s'"" qui a pour valeur: %u.\n",in,in) ;


ce serait pas plutôt:

Code :
  1. printf("Vous avez entré la lettre \'%c\' qui a pour valeur: %u.\n",in,in) ;


 


---------------
Le Tyran
n°179324
red factio​n
Posté le 20-07-2002 à 23:53:55  profilanswer
 

ITM a écrit a écrit :

C'est pas bugué mais c'est tellement excellent!
C'est du C ;)
 

Code :
  1. #include <stdio.h>
  2. char
  3. *T="IeJKLMaYQCE]jbZRskc[SldU^V\\X\\|/_<[<:90!\"$434-./2>]s",
  4. K[3][1000],*F,x,A,*M[2],*J,r[4],*g,N,Y,*Q,W,*k,q,D;X(){r  [r
  5. [r[3]=M[1-(x&1)][*r=W,1],2]=*Q+2,1]=x+1+Y,*g++=((((x&     7)
  6. -1)>>1)-1)?*r:r[x>>3],(++x<*r)&&X();}E(){A||X(x=0,g       =J
  7. ),x=7&(*T>>A*3),J[(x[F]-W-x)^A*7]=Q[x&3]^A*(*M)[2         +(
  8. x&1)],g=J+((x[k]-W)^A*7)-A,g[1]=(*M)[*g=M[T+=A            ,1
  9. ][x&1],x&1],(A^=1)&&(E(),J+=W);}l(){E(--q&&l              ()
  10. );}B(){*J&&B((D=*J,Q[2]<D&&D<k[1]&&(*g++=1                ),
  11. !(D-W&&D-9&&D-10&&D-13)&&(!*r&&(*g++=0)                   ,*
  12. r=1)||64<D&&D<91&&(*r=0,*g++=D-63)||D                     >=
  13. 97&&D<123&&(*r=0,*g++=D-95)||!(D-k[                       3]
  14. )&&(*r=0,*g++=12)||D>k[3]&&D<=k[                          1]
  15. -1&&(*r=0,*g++=D-47),J++));}j(                            ){
  16. putchar(A);}b(){(j(A=(*K)[D*                              W+
  17. r[2]*Y+x]),++x<Y)&&b();}t                                 ()
  18. {(j((b(D=q[g],x=0),A=W)                                   ),
  19. ++q<(*(r+1)<Y?*(r+1):                                     Y)
  20. )&&t();}R(){(A=(t(                                        q=
  21. 0),'\n'),j(),++r                                          [2
  22. ]<N)&&R();}O()                                            {(
  23. j((r[2]=0,R(                                              ))
  24. ),r[1]-=q)                                                &&
  25. O(g-=-q)                                                  ;}
  26. C(){(                                                     J=
  27. gets                                                      (K
  28. [1]))&&C((B(g=K[2]),*r=!(!*r&&(*g++=0)),(*r)[r]=g-K[2],g=K[2
  29. ],r[
  30. 1]&&
  31. O())
  32. );;}
  33. main
  34. (){C
  35. ((l(
  36. (J=(
  37. A=0)
  38. [K],
  39. A[M]
  40. =(F=
  41. (k=(
  42. M[!A
  43. ]=(Q
  44. =T+(
  45. q=(Y
  46. =(W=
  47. 32)-
  48. (N=4
  49. ))))
  50. +N)+
  51. 2)+7
  52. )+7)
  53. ),Y=
  54. N<<(
  55. *r=!
  56. -A))
  57. );;}


 
Pas mal, hein?
 




 
tu compile ca avec quoi  :heink:

n°179339
Musaran
Cerveaulté
Posté le 21-07-2002 à 01:13:19  profilanswer
 

musaran a écrit a écrit :

[B]Trouvez le bogue !(10 à 17)[/B]


Oups, erreur d'intervalle et deux fois le même bogue.
De 10 à 15 donc.
 
[B]Solution (10):[/B]
Oui bien sûr, %c pour un char.
Par contre, pas besoin de backslash pour une apostrophe dans une chaîne: "...'%c'...".
Pareillement, pas besoin de backslash pour un caractère guillemet seul: '"'.


Message édité par Musaran le 22-07-2002 à 00:39:47

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°179382
Kristoph
Posté le 21-07-2002 à 04:35:07  profilanswer
 

Code :
  1. printf("Le caractère de valeur  64 est: %c\n",064) ;


 
064 c'est de loctal donc ce n'est pas le caractere 64 prevu.
 
Bon au dodo maintenant ;)

n°179383
gilou
Modérateur
Modzilla
Posté le 21-07-2002 à 06:01:20  profilanswer
 

tanguy a écrit a écrit :

 
Pour moi visual est une bouze et le restera, je vois pas pourquoi ca changerait (ils sont eu des années + plein de fric pour le faire).
Le seul truc qui fait jouir les blaireaux c'est la complétion de visual. Forcément quand on voit l'API du SDK, c'est tellement mal foutu que sans la complétion ca serait impossible à utiliser...  
 
bon on va s'arreter là...




 
Ben si tu devais te fader de debugger sur un Mac avec CodeWarrior, tu comprendrais a quel point Visual C++ est un outil appreciable...[J'ai connu pire: le debug avec les outils Metaware de code pour Windows 3.1]
 
Moi j'ai utilisé pas mal d'outils sous SunOs/Dec Ultrix/Aix/HP-UX/Linux/Dos...Win2K/Mac Os9 pour compiler du C et C++ et je jeterrais pas la pierre a Visual C++.
Avec un certain nombre d'additifs (les librairies Dinkumware...) c'est un compilo (en ligne, j'utilise pas leur systeme merdique de projets) utilisable. J'utilise l'IDE uniquement pour debugger (j'edite sous emacs), et c'est un assez bon outil pour ça.
 
A+,


Message édité par gilou le 21-07-2002 à 06:04:55

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°179391
Kristoph
Posté le 21-07-2002 à 10:44:55  profilanswer
 

Allez, en voila d'autres réponses :
 

Code :
  1. if(isalpha(in) == TRUE)


 
TRUE n'est pas définie dans la norme C que je sache, donc ça n'a que peut de chances de marcher.
 
Dans le cas ou TRUE est définie, le comportement de la comparaison n'est pas garanti quand même. En effet, le "true" en C est un int different de 0. Donc si TRUE vaut 1 et que isalpha(in) retourne -1 pour dire vrai, tu l'as dans l'os car ton test echoue alors qu'il devrait réussir.
 

n°179397
tanguy
Posté le 21-07-2002 à 13:02:10  profilanswer
 

gilou a écrit a écrit :

 
 
Ben si tu devais te fader de debugger sur un Mac avec CodeWarrior, tu comprendrais a quel point Visual C++ est un outil appreciable...[J'ai connu pire: le debug avec les outils Metaware de code pour Windows 3.1]
 
Moi j'ai utilisé pas mal d'outils sous SunOs/Dec Ultrix/Aix/HP-UX/Linux/Dos...Win2K/Mac Os9 pour compiler du C et C++ et je jeterrais pas la pierre a Visual C++.
Avec un certain nombre d'additifs (les librairies Dinkumware...) c'est un compilo (en ligne, j'utilise pas leur systeme merdique de projets) utilisable. J'utilise l'IDE uniquement pour debugger (j'edite sous emacs), et c'est un assez bon outil pour ça.
 
A+,




On est plus à l'époque de windows 3.1, depuis les outils on grandement évolués.
moi j'ai commencé avec Visual, je l'ai utilisé pendant longtemps parceque tout le monde utilise ca et que je pensais tout simplement qu'il n'y avait pas grand chose de mieux.
Mais essaye Together pour le C++ et le Java, charges juste les sources d'un soft et tu vas voir que c'est magique.
C'est sur que si tu compares Visual à CodeWarrior...

n°179398
R3g
fonctionnaire certifié ITIL
Posté le 21-07-2002 à 13:15:13  profilanswer
 

Kristoph a écrit a écrit :

Allez, en voila d'autres réponses :
 

Code :
  1. if(isalpha(in) == TRUE)


 
TRUE n'est pas définie dans la norme C que je sache, donc ça n'a que peut de chances de marcher.
 
Dans le cas ou TRUE est définie, le comportement de la comparaison n'est pas garanti quand même. En effet, le "true" en C est un int different de 0. Donc si TRUE vaut 1 et que isalpha(in) retourne -1 pour dire vrai, tu l'as dans l'os car ton test echoue alors qu'il devrait réussir.
 
 




 
Que je sache, et meme si ce n'est pas une norme ,TRUE devrait être défini comme !0 , et dans ce cas, ca marche.

n°179399
R3g
fonctionnaire certifié ITIL
Posté le 21-07-2002 à 13:17:14  profilanswer
 

red faction a écrit a écrit :

 
 
tu compile ca avec quoi  :heink:  




Ca se compile avec un compilo C ANSI. Ce programme est un des gagnants d'un concours dont j'ai oublié le nom qui vise à écrire le code C le plus crade possible. Ca doit avoir deja une paire d'années, mais c'est vraiment très bien fait. J'ai deja essayé de comprendre comment ca marche, mais j'ai pas reussi :(

n°179406
Ace17
Posté le 21-07-2002 à 14:31:48  profilanswer
 

http://www.es.ioccc.org/main.html
Pour ceux que ca intéresse ( Merci a ITM! )

n°179683
Musaran
Cerveaulté
Posté le 22-07-2002 à 00:51:56  profilanswer
 

Kristoph a trouvé:
Solution(11): oui, il faut faire attention à cette base octale. Accessoirement, pourquoi exite-t'elle alors que la binaire non ?
Solution(12): TRUE, c'est dans quel define ? C'est lié à  Windows ?
Solution(13): La valeur de TRUE ne devrait pas être importante. Et isalpha retourne "différent de 0" si vrai.
Difficile d'avoir une égalité dans ces conditions.
Donc t'as perdu R3g !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°179803
Ace17
Posté le 22-07-2002 à 11:18:56  profilanswer
 

pas mal ta signature musaran!
dans quel cas ca devient un viol (du point de vue de la programmation!)?

n°180086
R3g
fonctionnaire certifié ITIL
Posté le 22-07-2002 à 16:31:14  profilanswer
 

musaran a écrit a écrit :

Solution(13): La valeur de TRUE ne devrait pas être importante. Et isalpha retourne "différent de 0" si vrai.
Difficile d'avoir une égalité dans ces conditions.
Donc t'as perdu R3g !
 




Je comprends pas :
en admettant qu'on aie #define TRUE !0 (ce que je crois vrai, oui ca doit etre dependre de windows), et que isalpha renvoie "different de 0", c'est à dire n'importe quoi sauf 0,
 alors (isalpha() == TRUE) equivaut à (isalpha() == !0), ce qui est equivalent à (isalpha() != 0), ce qui est vrai. CQFD  :D  
 
Peux-tu m'expliquer où j'ai faux ?

n°180111
bjone
Insert booze to continue
Posté le 22-07-2002 à 16:48:20  profilanswer
 

musaran a écrit a écrit :

Euh siouplait non, pas de géguerre sur les EDI ici.
Vous savez bien que c'est des sujets qui fachent, alors allez vous battre ailleurs.
 
 
Plucker:
-"unsigned char" (de 0 à 255)
-"signed char" (de -127 à 128)
-"char" est un type distinct.
Selon les implémentaions , "char" peut être comme signed ou unsigned.
 
Quoi qu'il en soit, "EOF" n'est PAS un caractère, et sa valeur (qui ne regarde personne soit dit en passant) n'est celle d'aucun caractère.
C'est pourquoi "getchar" renvoie un "int" plutôt qu'un "char": pour caser cette valeur.
Donc "ch=getchar()" ne peut valoir "EOF". Du moins ne devrait pas.
 
 
[B]Trouvez le bogue !(9)[/B]

Code :
  1. #include <stdio.h>
  2. int main(){
  3. char * chaineC = "Hello world" ;
  4. printf("%s\n" , chaineC) ;
  5. return 0 ;
  6. }


Ce code contient un bogue en puissance.
Un débutant faisant des essais pourrait tomber dessus... ou pas.




 
signed char : -128 à +127 :D

n°180366
Musaran
Cerveaulté
Posté le 23-07-2002 à 01:29:28  profilanswer
 

Ace17 a écrit a écrit :

pas mal ta signature musaran!
dans quel cas ca devient un viol (du point de vue de la programmation!)?


"La transmission d'arguments entre une fonction et et son appelant est comme un baiser, ça ne doit pas être un viol."
J'ai lu ça dans un livre sur l'art de la programmation.
Il y est dit qu'on doit être clair sur ce à quoi une fonction accède, et de quelle façon.
Notamment, qu'on ne doit pas abuser des information reçues par une fonction pour mettre son nez là où ce n'est pas prévu.
Par exemple:

Code :
  1. int mode ;//dans un source lointain, on en ignore même l'existence
  2. void strdo(const char* pc){
  3. mode = txt_mode ; //danger, modification globale à fin locale
  4. *(char*)pc = '0' ; //violation! Le const spécifie qu'on ne doit pas modifier
  5. SysDeactivateMemoryProt() ; //excessif pour une fonction basique
  6. }

Ça a l'air bête résumé comme ça, mais il y a plein de moyens détournés de faire l'équivalent.
 
"Même avec les clés, un voleur reste un voleur".
Ce qui veut dire que c'est pas parce qu'on sait comment accéder à quelque chose que c'est légitime de le faire.
 

R3g a écrit a écrit :

Peux-tu m'expliquer où j'ai faux ?


Là: "(isalpha() == !0), ce qui est equivalent à (isalpha() != 0)".
Non, c'est pas des formules mathématiques mais des intructions, et tu ne peux pas faire ce genre de "simplifications".
!0 vaut 1, mais la valeur de isalpha n'étant pas connue exactement, un test d'égalité a peu de chance de marcher !
 

bjone a écrit a écrit :

signed char : -128 à +127 :D


J'ai tendance à être bogué vers minuit.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°180398
R3g
fonctionnaire certifié ITIL
Posté le 23-07-2002 à 09:15:42  profilanswer
 

musaran a écrit a écrit :

!0 vaut 1, mais la valeur de isalpha n'étant pas connue exactement, un test d'égalité a peu de chance de marcher !



 
Ok d'accord ! Je pensais nahivement que !0 avait une valeur indéterminée (mais differente de 0) !

n°181207
Musaran
Cerveaulté
Posté le 24-07-2002 à 00:31:27  profilanswer
 

"si indéterminé==indéterminé..."
Aucun sens pour moi.
 
Il est spécifié (C++) que !0 vaut 1.
Mais ! est avant tout un opérateur logique (vrai-faux).
Il vaut mieux penser en termes de !false vaut true (et inversement).
Et si on a un entier plutôt qu'un booléen, il est plus sain de faire une comparaison avec un entier pour produire un booléen.
 
Ça évites ce genre de bogue /*int*/==true.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°181261
R3g
fonctionnaire certifié ITIL
Posté le 24-07-2002 à 09:26:24  profilanswer
 

en fait mon idee c'etait plutot si (tout sauf 0 == tout sauf 0).
mais bon, ca y est j'ai compris, je discute plus :)

n°181406
Ace17
Posté le 24-07-2002 à 11:05:13  profilanswer
 

musaran a écrit a écrit :

 
[B]Trouvez le bogue !(9)[/B]

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char * chaineC = "Hello world";
  5. printf("%s\n" , chaineC) ;
  6. return 0;
  7. }


Ce code contient un bogue en puissance.
Un débutant faisant des essais pourrait tomber dessus... ou pas.




 
J'ai toujours pas compris ou était l'erreur


Message édité par Ace17 le 24-07-2002 à 11:05:54
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-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR