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

  FORUM HardWare.fr
  Programmation
  C

  Aide à la compréhension d'un exo

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Aide à la compréhension d'un exo

n°1414366
Gattuso
Posté le 27-07-2006 à 11:40:37  profilanswer
 

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

mood
Publicité
Posté le 27-07-2006 à 11:40:37  profilanswer
 

n°1414391
Elmoricq
Modérateur
Posté le 27-07-2006 à 11:56:33  profilanswer
 

[: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
n°1414410
Trap D
Posté le 27-07-2006 à 12:10:03  profilanswer
 

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
n°1414414
Elmoricq
Modérateur
Posté le 27-07-2006 à 12:15:31  profilanswer
 

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
n°1414415
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 27-07-2006 à 12:15:49  profilanswer
 

c'est un peu le fouilli quand meme ce code

n°1414515
Gattuso
Posté le 27-07-2006 à 14:06:46  profilanswer
 

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
n°1414519
Trap D
Posté le 27-07-2006 à 14:08:25  profilanswer
 

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

n°1414532
Trap D
Posté le 27-07-2006 à 14:21:40  profilanswer
 

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
n°1414553
Elmoricq
Modérateur
Posté le 27-07-2006 à 14:35:38  profilanswer
 

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

n°1414588
Sve@r
Posté le 27-07-2006 à 15:10:44  profilanswer
 

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.
mood
Publicité
Posté le 27-07-2006 à 15:10:44  profilanswer
 

n°1414840
Gattuso
Posté le 27-07-2006 à 17:53:10  profilanswer
 

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


Message édité par Gattuso le 27-07-2006 à 17:53:32
n°1414845
farib
Posté le 27-07-2006 à 18:00:44  profilanswer
 

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

n°1414849
Trap D
Posté le 27-07-2006 à 18:05:08  profilanswer
 

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

n°1414858
Elmoricq
Modérateur
Posté le 27-07-2006 à 18:14:40  profilanswer
 

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

n°1414878
Sve@r
Posté le 27-07-2006 à 19:08:28  profilanswer
 

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.
n°1414907
Elmoricq
Modérateur
Posté le 27-07-2006 à 20:26:16  profilanswer
 

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

n°1414954
el muchach​o
Comfortably Numb
Posté le 27-07-2006 à 23:09:31  profilanswer
 

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
n°1414957
Elmoricq
Modérateur
Posté le 27-07-2006 à 23:14:15  profilanswer
 

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]

n°1414959
el muchach​o
Comfortably Numb
Posté le 27-07-2006 à 23:16:48  profilanswer
 

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
n°1414990
Trap D
Posté le 28-07-2006 à 00:09:17  profilanswer
 

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
n°1415026
Gattuso
Posté le 28-07-2006 à 08:04:06  profilanswer
 

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
n°1415268
farib
Posté le 28-07-2006 à 14:21:18  profilanswer
 

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
n°1415284
Trap D
Posté le 28-07-2006 à 14:39:31  profilanswer
 

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
n°1415575
farib
Posté le 28-07-2006 à 20:58:34  profilanswer
 

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
n°1415674
Sve@r
Posté le 29-07-2006 à 08:33:16  profilanswer
 

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

n°1415861
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 29-07-2006 à 23:03:58  profilanswer
 

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)
n°1415901
gocho
Posté le 30-07-2006 à 02:58:32  profilanswer
 

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
n°1415947
Trap D
Posté le 30-07-2006 à 13:33:29  profilanswer
 

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

n°1416001
Sve@r
Posté le 30-07-2006 à 15:36:43  profilanswer
 

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
n°1416019
Trap D
Posté le 30-07-2006 à 16:13:05  profilanswer
 


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


 
Ç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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Aide à la compréhension d'un exo

 

Sujets relatifs
Besoin d'aide svpModélisation d'un problème à l'aide d'un programme informatique
Besoin urgent d'aideBesoin d'aide pour javacard
Petit projet...besoin d'aide :)Aide pour requetes SQL
cherche un site d'aide pour fichier .bat[MCL] Un peu d'aide pour ce langage propriétaire
Aide compréhension de sujet prog. Classe "contrôle"[PHP] Aide pour compréhension du code.... <<<EOF ??
Plus de sujets relatifs à : Aide à la compréhension d'un exo


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR