Aide à la compréhension d'un exo

Aide à la compréhension d'un exo - C - Programmation

Marsh Posté le 27-07-2006 à 11:40:37    

Bonjour,
 
je suis en train d'essayer de comprendre ce que fait ce code que j'ai trouvé sur un livre de C :

Code :
  1. void p(void *c, size_t s, unsigned int l){
  2.   static size_t ts[] = { sizeof(int), sizeof(int*), sizeof(int**)};
  3.   static void * (*tf[])(void *) = {&c1, &c2};
  4.   unsigned int i,j;
  5.   for(i=0U; i<s/2U; ++i){
  6.     for(j=0U; j>ts[i]; ++j){
  7.       char tmp;
  8.       tmp = *((char *)c+i*ts[l]+j);
  9.       *((char *)c+i*ts[l]+j) = *((char *)c+(s-1-i)*ts[l]+j);
  10.       *((char *)c+(s-1-i)*ts[l]+j) = tmp;
  11.     }
  12.   }
  13.   if(l!=0U)
  14.     for(i=0U; i<s; ++i, c=(void *))(((char *)c)+ts[l]))
  15.       p( (*(tf[l-1U]))(c), s, l-1U);
  16. }


 
J'ai essayé en faisant des dessins mais je n'arrive pas à savoir ce que fait ce programme.
Si quelqu'un pouvait me l'indiquer
 
Merci

Reply

Marsh Posté le 27-07-2006 à 11:40:37   

Reply

Marsh Posté le 27-07-2006 à 11:56:33    

[:mlc]
 
C'est quoi ce code pourri ?
Rassure-moi, l'exercice c'est de le corriger, non ?


Message édité par Elmoricq le 27-07-2006 à 11:56:47
Reply

Marsh Posté le 27-07-2006 à 12:10:03    

Pour le comprendre il faudrait déjà connaître ce que font les fonctions c1, et c2.
Tu peux poster tout le code (on pourra tester et te dire ce que ça fait)  :whistle:
En regardant bien, j'ai l'impression que la double boucle ne fait rien :

Code :
  1. for(i=0U; i<s/2U; ++i){
  2.     for(j=0U; j>ts[i]; ++j){
  3.       char tmp;
  4.       tmp = *((char *)c+i*ts[l]+j);
  5.       *((char *)c+i*ts[l]+j) = *((char *)c+(s-1-i)*ts[l]+j);
  6.       *((char *)c+(s-1-i)*ts[l]+j) = tmp;
  7.     }
  8.   }

j est intialisé avec 0, et j dois être plus grand s'un élément de ts qui est au minimum 2. Me trompe-je ?

Message cité 1 fois
Message édité par Trap D le 27-07-2006 à 12:14:57
Reply

Marsh Posté le 27-07-2006 à 12:15:31    

Nan et puis faudra aussi qu'on m'explique l'utilité de la seconde boucle for(;; ) [:el g]
 
edit : grillé de 30s pour la seconde boucle for :o
 
edit 2 : et puis surtout, ts[] ne compte que 3 éléments, si on s'amuse rien qu'à donner sizeof(double) pour valeur à "s", on risque sérieusement le segfault :o


Message édité par Elmoricq le 27-07-2006 à 12:16:55
Reply

Marsh Posté le 27-07-2006 à 12:15:49    

c'est un peu le fouilli quand meme ce code

Reply

Marsh Posté le 27-07-2006 à 14:06:46    

Trap D a écrit :

Pour le comprendre il faudrait déjà connaître ce que font les fonctions c1, et c2.
Tu peux poster tout le code (on pourra tester et te dire ce que ça fait)  :whistle:


J'ai recopié tout le code que voici

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void a(int ***r, size_t n){
  4.   unsigned int i,j,k;
  5.   for(i=0U; i<n; ++i){
  6.     for(j=0U; j<n; ++j){
  7.       for(k=0U; k<n; ++k) printf("%d ",r[i][j][k]);
  8.       printf("\n" );
  9.     }
  10.     printf("\n\n" );
  11.   }
  12. }
  13. void cc(int ****r, size_t n){
  14.   unsigned int i,j,k;
  15.   *r = malloc(n * sizeof(int **));
  16.   for(i=0U; i<n; ++i){
  17.     (*r)[i] = malloc(n *sizeof(int *));
  18.     for(j=0U; j<n; ++j){
  19.       (*r)[i][j] = malloc(n * sizeof(int));
  20.       for(k=0U; k<n; ++k)
  21.         (*r)[i][j][k] = i*n*n+j*n+k;
  22.       }
  23.    }
  24. }
  25. void cl(int ****r, size_t n){
  26.   unsigned int i,j;
  27.   for(i=0U; i<n; ++i){
  28.     for(j=0U; j<n; ++j) free((*r)[i][j]);
  29.     free((*r)[i]);
  30.   }
  31.   free((*r));
  32.   *r = NULL;
  33. }
  34. void * c2(void *c) { return *(int ***)c; }
  35. void * c1(void *c) { return *(int **)c; }
  36. void p(void *c, size_t s, unsigned int l){
  37.   static size_t ts[] = { sizeof(int), sizeof(int*), sizeof(int**)};
  38.   static void * (*tf[])(void *) = {&c1, &c2};
  39.   unsigned int i,j;
  40.   for(i=0U; i<s/2U; ++i){
  41.     for(j=0U; j<ts[l]; ++j){
  42.       char tmp;
  43.       tmp = *((char *)c+i*ts[l]+j);
  44.       *((char *)c+i*ts[l]+j) = *((char *)c+(s-1-i)*ts[l]+j);
  45.       *((char *)c+(s-1-i)*ts[l]+j) = tmp;
  46.     }
  47.   }
  48.   if(l!=0U)
  49.     for(i=0U; i<s; ++i, c=(void *)(((char *)c)+ts[l]))
  50.       p( (*(tf[l-1U]))(c), s, l-1U);
  51. }
  52. void pA(int ***m, size_t s){ p(m,s,2U); }
  53. int main(void){
  54.   int ***m; cc(&m,3); a(m,3); pA(m,3); cl(&m,3);
  55.   return EXIT_SUCCESS;
  56. }

Message cité 1 fois
Message édité par Gattuso le 28-07-2006 à 07:57:47
Reply

Marsh Posté le 27-07-2006 à 14:08:25    

Ça plante bien aussi avec p( (*(tf[l-1U]))(c), s, l-1U); car tf a 2 éléments, donc si l est supérieur ou égal à 3 on plante.
Qui a pu inventer un truc pareil ?

Reply

Marsh Posté le 27-07-2006 à 14:21:40    

Le résultat est intéressant, mais on peut faire plus beaucoup plus simple.
Il y a deux erreurs, un size au lieu de sizeof et il y a une parenthèse mal placée dans for(i=0U; i<s; ++i, c=(void *))(((char *)c)+ts[l]))
[edit]  
Amusant, qu'on mette for(j=0U; j<ts[i]; ++j) ou for(j=0U; j>ts[i]; ++j) on obtient exactement le même résultat  :pt1cable:  
[/edit]


Message édité par Trap D le 27-07-2006 à 14:28:23
Reply

Marsh Posté le 27-07-2006 à 14:35:38    

C'est pour un concours à l'IOCCC ? [:el g]

Reply

Marsh Posté le 27-07-2006 à 15:10:44    

Gattuso a écrit :

Code :
  1. void cc(int ****r, size_t n)



Sans déconner, c'est autorisé d'écrire des trucs aussi ignobles ? :D
 

Gattuso a écrit :

je suis en train d'essayer de comprendre ce que fait ce code que j'ai trouvé sur un livre de C :


 
Personnellement je pense qu'il y a trop de commentaires et que cela nuit à la clarté du code. Donne-nous le titre du bouquin et son éditeur que je n'aille pas l'acheter par hasard... [:ddr555]


Message édité par Sve@r le 27-07-2006 à 15:15:36

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

Marsh Posté le 27-07-2006 à 15:10:44   

Reply

Marsh Posté le 27-07-2006 à 17:53:10    

Est-ce que quelqu'un sait ce que fait finalement ce code ?


Message édité par Gattuso le 27-07-2006 à 17:53:32
Reply

Marsh Posté le 27-07-2006 à 18:00:44    

Bah le plus utile, ce serait de savoir d'ou il vient je pense.

Reply

Marsh Posté le 27-07-2006 à 18:05:08    

Ca affiche 3 matrices carrées de 3 sur 3 de 0 à 3^3-1

Reply

Marsh Posté le 27-07-2006 à 18:14:40    

Trap D a écrit :

Ca affiche 3 matrices carrées de 3 sur 3 de 0 à 3^3-1


 
Si c'est vraiment ce que ça fait, alors je te tire mon chapeau.
Moi j'ai renoncé à lire une telle ignominie, et j'suis à deux doigts d'aller sur le site de l'IOCCC pour voir si c'est pas tiré de là. :o

Reply

Marsh Posté le 27-07-2006 à 19:08:28    

Elmoricq a écrit :

Moi j'ai renoncé à lire une telle ignominie, et j'suis à deux doigts d'aller sur le site de l'IOCCC pour voir si c'est pas tiré de là. :o


Moi j'ai essayé de le lire mais j'ai arrêté quand j'ai vu des variables nommées "l" (la lettre) utilisées avec "1" (le chiffre)...

Citation :

Code :
  1. p( (*(tf[l-1U]))(c), s, l-1U);




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

Marsh Posté le 27-07-2006 à 20:26:16    

Bon, en fait j'ai très largement sous-estimé l'IOCCC. [:klem3i1]

Reply

Marsh Posté le 27-07-2006 à 23:09:31    

Elmoricq a écrit :

C'est pour un concours à l'IOCCC ? [:el g]


Bizarre, je me suis dit la même chose. :D
Enfin il suffit de l'exécuter pour voir ce que ça fait.
En tout cas vu le "style" ou plutôt son absence, je subodore un scientifique qui a transposé directement un programme fortran en C. L'absence totale d'utilisation de structures autre que des tableaux, et les *** ça pue l'algo fortran à plein nez.[:marc]


Message édité par el muchacho le 27-07-2006 à 23:16:01

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 27-07-2006 à 23:14:15    

Ben j'suis allé voir sur leur site, et j'crois pas que ça vienne de là. Le niveau est autrement plus élevé chez eux.
 
Exemple d'une sélection de 1986 :

#include "stdio.h"
#define xyxx char
#define xyyxx putchar
#define xyyyxx while
#define xxyyyx int
#define xxxyyx main
#define xyxyxy if
#define xyyxyy '\n'
xyxx *xyx [] = {
"]I^x[I]k\\I^o[IZ~\\IZ~[I^|[I^l[I^j[I^}[I^n[I]m\\I]h",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~[IZ|_IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm_IZh",
"]IZx\\IZx[I^k[I\\o]IZ~\\IZ~\\I]|[IZl_I^j]IZ}]I^n[IZm\\IZm_IZh",
"]IZx\\IZx[IZk\\IZk[IZo_IZ~\\IZ~_IZ|[IZl_IZj\\IZj]IZ}]IZn_IZm\\IZm]IZh",
"]I^x[I]k\\IZo_I^~[I^|[I^l[IZj\\IZj]IZ}]I^n[I]m^IZh",'\0'};/*xyyxyxyxxxyxxxyy*/
xyxx *xyyx; xxyyyx xyyyx,xyyyyx,xyyyyyx=0x59,xyyyyyyx=0x29,/*yxxyxyyyxxyyyxyy*/
xxyx=0x68;xxxyyx(){xyyyyx=0;xyyyxx(xyx[xyyyyx]){xyyx=xyx[xyyyyx++];/*xyyyxxyx*/
xyyyxx(*xyyx){xyyyx= *xyyx++-xyyyyyx;xyyyxx(xyyyx--)xyyxx(*xyyx-xyyyyyyx);/*x*/
xyxyxy(*xyyx==xxyx)xyyxx(xyyxyy);*xyyx++;}}}/*xyxyxyyyyxxyxxxyyyxyyyxyxxyyy*/


 
[:lugubre desespoir]

Reply

Marsh Posté le 27-07-2006 à 23:16:48    

L'IOCCC, c'est chefs-d'oeuvres de hacking chevelu, hein. Je me souviens de progs où 95% du code est dans le commentaire, ou bien où on imaginerait pas que ça puisse compiler un jour.[:marc]


Message édité par el muchacho le 27-07-2006 à 23:19:30

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 28-07-2006 à 00:09:17    

En fait c'est la fonction a(m,nb); qui affiche les trois matrices,  
 
0 1 2
3 4 5
6 7 8
 
 9 10 11
12 13 14
15 16 17
 
18 19 20
21 22 23
24 25 26
 
après l 'appel pA(m,nb);  on obtient  
 
26 25 24  
23 22 21
20 19 18
 
17 16 15
14 13 12
11 10  9
 
8 7 6
5 4 3
2 1 0
 
La double boucle inverse d'abord les trois matrices puis l'appel récusif inverse les éléments des matrices

Message cité 1 fois
Message édité par Trap D le 28-07-2006 à 00:14:53
Reply

Marsh Posté le 28-07-2006 à 08:04:06    

Trap D a écrit :

En fait c'est la fonction a(m,nb); qui affiche les trois matrices,  
 
0 1 2
3 4 5
6 7 8
 
 9 10 11
12 13 14
15 16 17
 
18 19 20
21 22 23
24 25 26
 
après l 'appel pA(m,nb);  on obtient  
 
26 25 24  
23 22 21
20 19 18
 
17 16 15
14 13 12
11 10  9
 
8 7 6
5 4 3
2 1 0
 
La double boucle inverse d'abord les trois matrices puis l'appel récusif inverse les éléments des matrices


Merci pour les réponses.
Pour ce qui est de l'inversion de la matrice, c'est vrai qu'on aurait pu deviner sans avoir à compiler le code car on ne parcourt que la moitié de la matrice et ont fait des échanges :

Code :
  1. for(i=0U; i<s/2U; ++i){
  2.    for(j=0U; j<ts[l]; ++j){
  3.      char tmp;
  4.      tmp = *((char *)c+i*ts[l]+j);
  5.      *((char *)c+i*ts[l]+j) = *((char *)c+(s-1-i)*ts[l]+j);
  6.      *((char *)c+(s-1-i)*ts[l]+j) = tmp;


 
Est-ce que quelqu'un peut m'expliquer ce bout de code ?

Code :
  1. if(l!=0U)
  2.    for(i=0U; i<s; ++i, c=(void *)(((char *)c)+ts[l]))
  3.      p( (*(tf[l-1U]))(c), s, l-1U);


Message édité par Gattuso le 28-07-2006 à 08:06:04
Reply

Marsh Posté le 28-07-2006 à 14:21:18    

Vous etes vraiment nuls, parce que ça fait pas une inversion mais une transposée [:rhetorie du chaos]


Message édité par farib le 28-07-2006 à 15:25:15

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 28-07-2006 à 14:39:31    

Oui dans le vocabulaire des matrices tu as raison, nous aurions dû éventuellement dire intervertion des nombres.
 
[EDIT]
A la réflexion NON, la transposée de  
0 1 2
3 4 5
6 7 8
 
ce n' est pas
 
8 7 6
5 4 3
2 1 0
 
mais
 
0 3 6
1 4 7
2 5 8
 
Ce n'est ni l'inverse ne la transposée !


Message édité par Trap D le 28-07-2006 à 15:46:34
Reply

Marsh Posté le 28-07-2006 à 20:58:34    

Sve@r a écrit :

Un grand merci à toi pour nous rappeler si gentiment notre niveau face à ton incommensurable intelligence
 
 
 
Bon ben finallement t'es aussi nul que nous... :sarcastic:


J'voulais faire du 2nd degre mais je me suis chie dessus. Sorry.  [:tapaiv]

Message cité 1 fois
Message édité par farib le 28-07-2006 à 20:58:49

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 29-07-2006 à 08:33:16    

farib a écrit :

J'voulais faire du 2nd degre mais je me suis chie dessus. Sorry.  [:tapaiv]


Un 2° degré sur un forum ça passe très mal  :lol:  
Bon ben ya pas de pb. Je supprime mon post précédent...

Reply

Marsh Posté le 29-07-2006 à 23:03:58    

Bonjour, j'ai un problème avec mon code ! J'ai un BSOD sur une écriture en mémoire, pourtant j'alloue mon tableau localement, je comprends pas
 

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. );;}


 
merci de votre aide


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-07-2006 à 02:58:32    

Harkonnen a écrit :

Bonjour, j'ai un problème avec mon code ! J'ai un BSOD sur une écriture en mémoire, pourtant j'alloue mon tableau localement, je comprends pas
 
 
 
merci de votre aide


 
 
 
hum.... [:theepsilon]


Message édité par gocho le 30-07-2006 à 02:58:51

---------------
Mon feedback
Reply

Marsh Posté le 30-07-2006 à 13:33:29    

Citation :

Bonjour, j'ai un problème avec mon code ! J'ai un BSOD sur une écriture en mémoire, pourtant j'alloue mon tableau localement, je comprends pas

Normal, tu utilises gets à la ligne 28  :D

Reply

Marsh Posté le 30-07-2006 à 15:36:43    

Harkonnen a écrit :

Bonjour, j'ai un problème avec mon code ! J'ai un BSOD sur une écriture en mémoire, pourtant j'alloue mon tableau localement, je comprends pas

Citation :

Normal, tu utilises gets à la ligne 28  :D



Et t'as oublié de déclarer ton "main" comme "int" et t'as pas mis de return. Trop normal que ça plante...


Message édité par Sve@r le 30-07-2006 à 15:38:11
Reply

Marsh Posté le 30-07-2006 à 16:13:05    


                             []       <>              
  _()      _()_      ()      |()      _\)       ()    
[] ^^|   [] ^^ []   /^^|      ^^\   [] ^^      |^^|    
   ][]      ][     <>][]      ][<>     ][      [][]    
 
                               []     <>                            <>  
  _()       ()      _()_      ()|     _\)       ()       ()       ()/    
[] /^      /^^|   [] ^^ []   /^^    [] ^^      /^^\     /^^\     |^^    
  <>[     <>][]      ][     <>][       ][     <>][<>   <>][<>    [][    


 
Ça ne rend pas très bien, mais l'idée y est.


Message édité par Trap D le 30-07-2006 à 16:30:13
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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