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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Question sur les structures

n°1570091
Sve@r
Posté le 05-06-2007 à 07:49:31  profilanswer
 

Reprise du message précédent :

in_your_phion a écrit :

ok, je crois que je vois. J'avais fait un exemple "un peu bato" pour me permettre de comprendre. Pour les trois cas que tu cites :
 
 
 
je crois que je comprend avec les pointeurs sur une zone allouée :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void affiche_division (void * a, void * b, void * (*f) (const void *, const void *)   ) ;
  5. void * division_int (const void *a, const void * b) ;
  6. void * division_double (const void *a, const void * b) ;
  7. int main () {
  8.   double d_un = 3.;
  9.   double d_deux = 2.;
  10.   void * (*f) (const void *, const void *) =  &division_double;
  11.   affiche_division( &d_un, &d_deux, f );
  12.   //system("pause" );
  13. return 0;
  14. }
  15. void affiche_division (void * a, void * b, void * (*f) (const void *, const void *)   )  {
  16.   double * RES = f(a,b);
  17.   printf("Le résultat est = %f\n",*RES);
  18. }
  19. void * division_int (const void *a, const void * b) {
  20.   const int * A = (int*)a;
  21.   const int * B = (int*)b;
  22.   int * resultat = malloc( sizeof( int ) );
  23.   *resultat =  *A/ *B;
  24.   return resultat;
  25. }
  26. void * division_double (const void *a, const void * b)  {
  27.   const double * A = (const double *)a;
  28.   const double * B = (const double *)b;
  29.   double * resultat = malloc( sizeof( double) );
  30.   *resultat =  *A / *B;
  31.   return resultat;
  32. }


 
Mais comment faire avec une zone static (cas numéro un) ? Y'a til une de ces solutions qui est mieux d'un point de vue théorique ou pratique ??
 
merci beaucoup encore  :jap:  :jap:


 
Ok pour tes malloc. Mais faut aussi les libérer ensuite dans "affiche_division" => free(RES)    (évite les noms en majuscules, on pourrait les confondre avec des macros)
 
Avec une zone static c'est comme ça

Code :
  1. void * division_double (const void *a, const void * b)  {
  2.   static double resultat;
  3.   const double * A = (const double *)a;
  4.   const double * B = (const double *)b;
  5.   resultat =  *A / *B;
  6.   return &resultat;
  7. }


Idem pour "division_int" sinon le reste ne change pas sauf que t'as absolument pas besoin de cette variable "f" dans ton main => affiche_division( &d_un, &d_deux, division_double );
 
Maintenant, d'un point de vue pratique, avoir une zone statique c'est très dangereux. J'ai voulu une fois découper une ligne construite ainsi
info1 info2 x:y:z info3
J'ai donc initialisé une boucle à coup de strtok pour découper chaque info sur la tabulation. Puis j'ai initialisé une seconde boucle à coup de strtok pour découper le x:y:z sur le ":" et c'est complètement parti en torche. A la sortie de la 2° boucle, le pointeur interne de strtok (il n'y en a qu'un seul) était totalement à l'ouest et ne m'a jamais trouvé "info3".
 
D'ailleurs, si tu veux avoir un exemple concret du problème du static, utilise ma fonction donnée en exemple et essaye ceci :

Code :
  1. double val1=7.0;
  2. double val2=3.0;
  3. double val3=10.0;
  4. double val4=4.0;
  5. double *res1=(double*)division_double(&val1, &val2);
  6. double *res2=(double*)division_double(&val3, &val4);
  7. printf("res1=%f, res2=%f\n", *res1, *res2);      // Merci à Matafan pour avoir vu cette erreur


Mais d'abord, essaye d'imaginer quel sera ton résultat avant de tester et de regarder la réalité...

Message cité 1 fois
Message édité par Sve@r le 05-06-2007 à 17:43:17

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le 05-06-2007 à 07:49:31  profilanswer
 

n°1570317
in_your_ph​ion
Posté le 05-06-2007 à 14:06:34  profilanswer
 

Sve@r a écrit :

Ok pour tes malloc. Mais faut aussi les libérer ensuite dans "affiche_division" => free(RES)    (évite les noms en majuscules, on pourrait les confondre avec des macros)

 

Avec une zone static c'est comme ça

Code :
  1. void * division_double (const void *a, const void * b)  {
  2.   static double resultat;
  3.   const double * A = (const double *)a;
  4.   const double * B = (const double *)b;
  5.   resultat =  *A / *B;
  6.   return &resultat;
  7. }


Idem pour "division_int" sinon le reste ne change pas sauf que t'as absolument pas besoin de cette variable "f" dans ton main => affiche_division( &d_un, &d_deux, division_double );

 

Maintenant, d'un point de vue pratique, avoir une zone statique c'est très dangereux. J'ai voulu une fois découper une ligne construite ainsi
info1 info2 x:y:z info3
J'ai donc initialisé une boucle à coup de strtok pour découper chaque info sur la tabulation. Puis j'ai initialisé une seconde boucle à coup de strtok pour découper le x:y:z sur le ":" et c'est complètement parti en torche. A la sortie de la 2° boucle, le pointeur interne de strtok (il n'y en a qu'un seul) était totalement à l'ouest et ne m'a jamais trouvé "info3".

 

D'ailleurs, si tu veux avoir un exemple concret du problème du static, utilise ma fonction donnée en exemple et essaye ceci :

Code :
  1. double val1=7.0;
  2. double val2=3.0;
  3. double val3=10.0;
  4. double val4=4.0;
  5. double *res1=(double*)division_double(&val1, &val2);
  6. double *res2=(double*)division_double(&val3, &val4);
  7. printf("res1=%f, res2=%f\n", res1, res2);


Mais d'abord, essaye d'imaginer quel sera ton résultat avant de tester et de regarder la réalité...

 

salut,

 

merci pour les explications :) Pour clore le topic j'aurais encore deux petites questions  [:arg]

 

est ce que

Code :
  1. affiche_division( &d_un, &d_deux, division_double );
 

est pareil que

Code :
  1. affiche_division( &d_un, &d_deux, &division_double );


car je vois souvent les deux et je ne sais pas s'il y a grande différence. Je devine que oui mais j'ai testé sur des exemples et ça donne le même résultat...

 

Pour récapituler si je veux faire une fonctions générique il faudrait que j'ai un prototype du style :

Code :
  1. void * ma_fonction_generique (int i, void * (*f) (void * p1, ... ) );
 

avec le paramètre i qui permet de désigner les opérations en fonction de la fonction utilisée par exemple ? avec, dans le corp de la fonction, un genre de

Code :
  1. switch(i) {
  2.          case 1:
  3.              //on fait les traitements avec la fonction passée en argument
  4.              printf("%d", *p); //ou autre exemple on parcours sur un tableau d'entier, etc
  5.          break;
  6.         case 2:
  7.                //on fait les traitements avec la fonction passée en argument
  8.              printf("%f", *p); //ou autre exemple on parcours sur un tableau de floats, etc
  9.          break;
  10. //etc ...
  11. }
 

?

 

Sinon pour l'exemple avec le static, je dirais sans essayer que comme la variable resultat est déclarée static, elle est permanente et toutes les variables static déclarées "resultat" dans les fonctions ferons référence à la même variable, et donc à la même zone mémoire. Par conséquent, dans l'exemple :

Code :
  1. double val1=7.0;
  2.     double val2=3.0;
  3.     double val3=10.0;
  4.     double val4=4.0;
  5.     double *res1=(double*)division_double(&val1, &val2);
  6.     double *res2=(double*)division_double(&val3, &val4);
  7.     printf("res1=%f, res2=%f\n", res1, res2);
 

res1 et res2 ont tous les deux comme adresse &resultat. Leurs valeurs sont les mêmes et valent val3/val4, soit 10/4=5/2.

 

le printf affiche les adresses de res1 et res2, qui sont &resultat.

 

J'ai bon ??  [:tageueuil]

Message cité 1 fois
Message édité par in_your_phion le 05-06-2007 à 14:15:07
n°1570365
matafan
Posté le 05-06-2007 à 15:20:50  profilanswer
 

division_double et &division_double c'est effectivement strictement la même chose.
 
Effectivement res1 et res2 contiendront la même valeur. Par contre il faut passer *res1 et *res2 en argument à ton printf, pas res1 et res2 qui sont des pointeurs (mais c'est juste une étourderie je pense).

n°1570526
Sve@r
Posté le 05-06-2007 à 18:21:20  profilanswer
 

matafan a écrit :

division_double et &division_double c'est effectivement strictement la même chose.


Je viens d'ailleurs de voir une erreur dans le code (ligne 33). "f" étant un pointeur de fonction, l'appel de la fonction pointée se fait par "(*f)(a, b)" et non "f(a, b)". Mais comme le mécanisme des pointeurs de fonction est un peu spécial, il se trouve que ça marche quand-même. Et ça marcherait même si on tapait "(********f)(a, b)". A croire que la première info qu'on trouve à l'adresse d'une fonction est sa propre adresse...
 

matafan a écrit :

Par contre il faut passer *res1 et *res2 en argument à ton printf, pas res1 et res2 qui sont des pointeurs (mais c'est juste une étourderie je pense).


Yes, j'ai rectifié  :jap:
 

in_your_phion a écrit :

Sinon pour l'exemple avec le static, je dirais sans essayer que comme la variable resultat est déclarée static, elle est permanente et toutes les variables static déclarées "resultat" dans les fonctions ferons référence à la même variable, et donc à la même zone mémoire. Par conséquent, dans l'exemple :

Code :
  1. double val1=7.0;
  2.     double val2=3.0;
  3.     double val3=10.0;
  4.     double val4=4.0;
  5.     double *res1=(double*)division_double(&val1, &val2);
  6.     double *res2=(double*)division_double(&val3, &val4);
  7.     printf("res1=%f, res2=%f\n", *res1, *res2);


 
res1 et res2 ont tous les deux comme adresse &resultat. Leurs valeurs sont les mêmes et valent val3/val4, soit 10/4=5/2.
 
le printf affiche les adresses de res1 et res2, qui sont &resultat.
 
J'ai bon ??  [:tageueuil]


Totalement exact. Tu auras le même problème avec le code suivant

Code :
  1. int main()
  2. {
  3.     char *path;
  4.     char *home;
  5.     path=getenv("PATH" );
  6.     home=getenv("HOME" );
  7.     printf("path=%s - home=%s\n", path, home);
  8. }


Les static c'est utile mais DANGEREUX !!!
 
Sinon ta fonction générique est parfaite. Si t'as envie de continuer les TP l'étape suivante consiste à écrire une fonction qui balaye et traite un tableau d'éléments que ta fonction ne connait pas à l'avance. Elle devra donc recevoir

  • un pointeur sur le tableau (évidemment)
  • le nombre d'éléments du tableau (idem)
  • la taille d'un élément (en effet, pour passer à l'élément suivant, il faut bien avancer de "n" octets mais si on ne connait pas "n"...)
  • un pointeur sur la fonction qui sera appelée pour chaque élément => ainsi, l'utilisateur de ton truc pourra soit faire afficher l'élément, soit le stocker dans un fichier, soit tout ce qu'il veut


Une fois ton TP écrit, tu pourras le tester sur un tableau d'int, de doubles, de strings, de structures, de ce que tu veux. Tu peux ainsi apprendre à dissocier le travail d'un créateur d'outils et le travail de celui qui va utiliser ton outil (les deux ne sont pas forcément les mêmes => la preuve, tu utilises "printf()" alors que cette fonction a été créé par un autre...)

Message cité 1 fois
Message édité par Sve@r le 05-06-2007 à 18:31:32

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1570777
in_your_ph​ion
Posté le 06-06-2007 à 11:11:54  profilanswer
 

salut,

 

cool, merci beaucoup pour les réponses!!  :hello:

 

j'ai essayé de faire une fonction qui parcours un tableau générique et qui affiche juste le résultat, mais ça ne marche pas avec les double .....  :cry: Je ne comprend pas pourquoi car ça devrais vu que c'est exactement pareil qu'avec les int. Ou alors peut etre que je n'ai pas tout saisi  :sweat:  :sweat:  ?

 

voici le code :

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) );
  4. void int_printf(void * a );
  5. void double_printf(void * a );
  6. int main () {
  7.   int t_int[] = {1,4,3,5,9,0,0,7,5};
  8.   int t_double[] = {1.2,4.5,83.5,45.,453.0,-4.5};
  9.   gentab_traverse(t_int, sizeof(int), (int)(sizeof(t_int)/sizeof(t_int+0)),  &int_printf);
  10.  
  11.   printf("\n" );
  12.   gentab_traverse(t_double, sizeof(double), (int)(sizeof(t_double)/sizeof(t_double+0)), &double_printf);
  13.   return 0;
  14. }
  15. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) ) {
  16.   int i;
  17.   for (i=0; i<elem_n;i++) {
  18.     void * add =  (char*)tab + i*sizeof(elem_bsize);
  19.     gentab_op(add);
  20.   }
  21. }
  22. void int_printf(void * a) {
  23.   int * b = (int*)a;
  24.   printf("%d\t@t[%p]\n",*b,b);
  25. }   
  26. void double_printf(void * a) {
  27.   double * b = (double*)a;
  28.   printf("%f\t@t[%p]\n",*b,b);
  29. }
 

et j'obtiens les résultats suivant:

 

1       @t[0xbfffc700]
4       @t[0xbfffc704]
3       @t[0xbfffc708]
5       @t[0xbfffc70c]
9       @t[0xbfffc710]
0       @t[0xbfffc714]
0       @t[0xbfffc718]
7       @t[0xbfffc71c]
5       @t[0xbfffc720]

 

0.000000        @t[0xbfffc6e0]
0.000000        @t[0xbfffc6e4]
0.000000        @t[0xbfffc6e8]
0.000000        @t[0xbfffc6ec]
nan     @t[0xbfffc6f0]
0.000000        @t[0xbfffc6f4]

 


hum hum ....  :(

Message cité 1 fois
Message édité par in_your_phion le 06-06-2007 à 11:12:21
n°1571148
Sve@r
Posté le 06-06-2007 à 17:19:54  profilanswer
 

in_your_phion a écrit :

j'ai essayé de faire une fonction qui parcours un tableau générique et qui affiche juste le résultat, mais ça ne marche pas avec les double .....  :cry: Je ne comprend pas pourquoi car ça devrais vu que c'est exactement pareil qu'avec les int. Ou alors peut etre que je n'ai pas tout saisi  :sweat:  :sweat:  ?
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) );
  4. void int_printf(void * a );
  5. void double_printf(void * a );
  6. int main () {
  7.   int t_int[] = {1,4,3,5,9,0,0,7,5};
  8.   int t_double[] = {1.2,4.5,83.5,45.,453.0,-4.5};
  9.   gentab_traverse(t_int, sizeof(int), (int)(sizeof(t_int)/sizeof(t_int+0)),  &int_printf);
  10.  
  11.   printf("\n" );
  12.   gentab_traverse(t_double, sizeof(double), (int)(sizeof(t_double)/sizeof(t_double+0)), &double_printf);
  13.   return 0;
  14. }
  15. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) ) {
  16.   int i;
  17.   for (i=0; i<elem_n;i++) {
  18.     void * add =  (char*)tab + i*sizeof(elem_bsize);
  19.     gentab_op(add);
  20.   }
  21. }
  22. void int_printf(void * a) {
  23.   int * b = (int*)a;
  24.   printf("%d\t@t[%p]\n",*b,b);
  25. }   
  26. void double_printf(void * a) {
  27.   double * b = (double*)a;
  28.   printf("%f\t@t[%p]\n",*b,b);
  29. }


hum hum ....  :(


hum hum .... ai-je bien vu  int t_double[] = {1.2,4.5,83.5,45.,453.0,-4.5}; ?????
 

in_your_phion a écrit :

Code :
  1. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) ) {
  2.   int i;
  3.   for (i=0; i<elem_n;i++) {
  4.     void * add =  (char*)tab + i*sizeof(elem_bsize);
  5.     gentab_op(add);
  6.   }
  7. }



Evite de mettre la déclaration de ta variable dans la boucle => cela fatigue inutilement le processeur (définition/libération/définition/libération etc...)
De plus, si je lis bien le code, "elem_bsize" est la taille d'un élément donc il ne faut pas demander "sizeof(elem_bsize) mais juste "elem_bsize" !!!
 

Code :
  1. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) ) {
  2.   int i;
  3.   void *pt;
  4.   for (i=0, pt=tab; i<elem_n; i++, pt=(char*)pt + elem_bsize) {
  5.     gentab_op(pt);
  6.   }
  7. }


 
Sinon c'est quoi ces "sizeof(t_int+0)" et "sizeof(t_double+0)" ??? En faisant "sizeof(t_int) / sizeof(int)" tu obtiens aussi le nombre d'éléments et c'est beaucoup plus lisible (enfin pour moi !!!)
 
Bon, sinon t'as bien pigé le truc. Mais comme Matafan et moi t'avons déjà dit, t'es pas obligé de mettre "&" devant un nom de fonction car un nom de fonction est déjà un pointeur.
 
Dernière étape => Un programme qui trie ton tableau => L'algo de tri peut-être le tri à bulle, on s'en fout. L'important c'est que ton truc puisse trier n'importe quoi.
Donc ton truc recevra évidemment

  • un pointeur sur le tableau (évidemment)
  • le nombre d'élements du tableau (idem)
  • la taille d'un élément => évidemment, s'il faut intervertir 2 éléments il vaut mieux connaître leur taille !!!
  • un pointeur sur la fonction qui servira à comparer 2 éléments (cette fonction étant évidemment à la charge de celui qui utilise ton outil). Le protocole de cette fonction (c'est à dire comment ton outil qui utilisera cette fonction saura que l'élément 1 est plus petit ou plus grand que l'élément 2) est à ta discrétion mais ensuite, tous ceux qui utiliseront ton outil et qui auront donc la charge de coder la fonction de comparaison devront évidemment connaître le protocole !!!

Message cité 1 fois
Message édité par Sve@r le 06-06-2007 à 17:38:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1571271
in_your_ph​ion
Posté le 06-06-2007 à 23:32:47  profilanswer
 

Sve@r a écrit :

hum hum .... ai-je bien vu  int t_double[] = {1.2,4.5,83.5,45.,453.0,-4.5}; ?????


 
[:androids974]
 
ah oui ...
 

Sve@r a écrit :


Evite de mettre la déclaration de ta variable dans la boucle => cela fatigue inutilement le processeur (définition/libération/définition/libération etc...)
De plus, si je lis bien le code, "elem_bsize" est la taille d'un élément donc il ne faut pas demander "sizeof(elem_bsize) mais juste "elem_bsize" !!!
 

Code :
  1. void gentab_traverse(void * tab,  size_t elem_bsize, int elem_n, void (*gentab_op) (void *) ) {
  2.   int i;
  3.   void *pt;
  4.   for (i=0, pt=tab; i<elem_n; i++, pt=(char*)pt + elem_bsize) {
  5.     gentab_op(pt);
  6.   }
  7. }


 
Sinon c'est quoi ces "sizeof(t_int+0)" et "sizeof(t_double+0)" ??? En faisant "sizeof(t_int) / sizeof(int)" tu obtiens aussi le nombre d'éléments et c'est beaucoup plus lisible (enfin pour moi !!!)
 
Bon, sinon t'as bien pigé le truc. Mais comme Matafan et moi t'avons déjà dit, t'es pas obligé de mettre "&" devant un nom de fonction car un nom de fonction est déjà un pointeur.
 
Dernière étape => Un programme qui trie ton tableau => L'algo de tri peut-être le tri à bulle, on s'en fout. L'important c'est que ton truc puisse trier n'importe quoi.
Donc ton truc recevra évidemment

  • un pointeur sur le tableau (évidemment)
  • le nombre d'élements du tableau (idem)
  • la taille d'un élément => évidemment, s'il faut intervertir 2 éléments il vaut mieux connaître leur taille !!!
  • un pointeur sur la fonction qui servira à comparer 2 éléments (cette fonction étant évidemment à la charge de celui qui utilise ton outil). Le protocole de cette fonction (c'est à dire comment ton outil qui utilisera cette fonction saura que l'élément 1 est plus petit ou plus grand que l'élément 2) est à ta discrétion mais ensuite, tous ceux qui utiliseront ton outil et qui auront donc la charge de coder la fonction de comparaison devront évidemment connaître le protocole !!!


ok, merci beaucoup pour toutes les remarques  :jap:  :jap:  
 
j'implémente ça de suite !! [:alucard]

n°1571516
in_your_ph​ion
Posté le 07-06-2007 à 13:30:49  profilanswer
 

salut  :hello:

 

Alors voila.....j'ai fait, voici ma solution : un programme qui trie un tableau générique passé en entrée, et affiche le résultat avant et après. Le choix de la fonction de tri (tri à bulle, tri par insertion, tri par tas, etc) est laissé à l'utilisateur, ainsi que le choix de la fonction de comparaison (tri descendant, ascendant, etc).  Dans mon exemple j'utilise la fonction de tri rapide déja implémentée dans la librairie standard, quicksort.

 

Qu'en penses-tu ?

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int compare_double_desc (const void * a, const void * b) ;
  5. void print_tab(int cases, void * tab, size_t elem_bsize, size_t elem_n) ;
  6. void tri_tablo_gen(
  7.     void * tab,
  8.     size_t elem_bsize,
  9.     size_t elem_num,
  10.     void (*sort_tab) (void * tab, size_t elem_bsize, size_t elem_num, int (*compare_numbers) (const void * , const void *) ),
  11.     int (*compare_numbers) (const void * , const void *) ) ;
  12. int main() {
  13.   double tab[] = {1,1.2,53.,4*atan(1),453.543,-782.};
  14.   printf("Le tableau de départ, de taille %d, est :\n", sizeof(tab)/sizeof(tab[0]));
  15.   print_tab(2 , tab, sizeof(double), sizeof(tab)/sizeof(tab[0]) )   ;
  16.     tri_tablo_gen(
  17.       tab,
  18.       sizeof(double),
  19.       sizeof(tab)/sizeof(tab[0]),
  20.       qsort,
  21.       compare_double_desc
  22.       );
  23.   //qsort(tab,sizeof(tab)/sizeof(tab[0]),sizeof(double), compare_double_desc  );
  24.   printf("Le tableau trié est :\n" );
  25.   print_tab(2 , tab, sizeof(double), sizeof(tab)/sizeof(tab[0]) )   ;
  26.   return 0;
  27. }
  28. void tri_tablo_gen(
  29.     void * tab,
  30.     size_t elem_bsize,
  31.     size_t elem_num,
  32.     void (*sort_tab) (void * tab, size_t elem_bsize, size_t elem_num, int (*compare_numbers) (const void * , const void *) ),
  33.     int (*compare_numbers) (const void * , const void *) ) {
  34.   sort_tab(tab,elem_num,elem_bsize, compare_numbers  );
  35. }
  36. void print_tab(int cases, void * tab, size_t elem_bsize, size_t elem_n) {
  37.   int i;
  38.   char * tabc = (char*)tab;
  39.   for (i=0;i<elem_n;i++) {
  40.     switch(cases) {
  41.       case 1: //pour les int
  42. printf("%d\n",*(int*)(tabc + i*elem_bsize));
  43. break;
  44.       case 2://pour les double
  45. printf("%.4f\n",*(double*)(tabc + i*elem_bsize));
  46. break;
  47. // etc
  48.     }
  49.   }
  50. }
  51. int compare_double_desc (const void * a, const void * b) {
  52.   const double * A = a;
  53.   const double * B = b;
  54.   return (*A < *B) - (*A > *B);
  55. }
 

le résultat :


Le tableau de départ, de taille 6, est :
1.0000
1.2000
53.0000
3.1416
453.5430
-782.0000
Le tableau trié est :
453.5430
53.0000
3.1416
1.2000
1.0000
-782.0000

 

est-ce ok ? ... y'aurait-il des choses pas classes ?

 

merci beaucoup par avance  :jap:  :jap:

 

ps : est ce que ca faitgue aussi le processeur de mettre une variable dans une boucle, comme

Code :
  1. for (;;) {
  2.   int a = 1;
  3. }
  4. //au lieu de :
  5. int a;
  6. for (;;) {
  7. a = 1;
  8. }


?


Message édité par in_your_phion le 07-06-2007 à 13:53:54
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
question sur les pointeurs de fonctionsquestion sur les pointeurs
Question PHP, PEAR SOAP, Dotnet et sérialisation[J2EE] Question générale
Question sur les listbox vba excelAffectation de structures
[C]Passer un tableau de structures en paramètresQuestion sur les schemas d'une base de données
Question bête sur notepad++Question sur les structures
Plus de sujets relatifs à : Question sur les structures


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