Ca passe nikel avec gcc , mais ca compile pas avec visual....

Ca passe nikel avec gcc , mais ca compile pas avec visual.... - Programmation

Marsh Posté le 22-11-2001 à 17:05:50    

Salut,
J'ai fait une fonction de tri à bulle universelle. Je me suis inspiré des méthodes du bouquin O'reilly "Maîtrise des algorithmes en C).  
 
Impossible de compiler avec visual c++ : il a des pb avec les types void*
Par contre, gcc win32 (djgpp) le prend sans pb (les erreurs deviennent des warnings, et l'exécution se déroule sans soucis).
 
Quelqu'un peut-il m'expliquer ce paradoxe ? (autrement que par "Normal, M$ suxxxx" ;)
 
Marchi bien ^_^
Fazouye
 
 
allez plop, voici le code source :
 
#include <stdio.h>
#include <stdlib.h>
 
/* mes prototypes de fonctions */
 
void tri_bulle(void *,
  int,  
  int(*compare)(void *a, void *b),  
  void(*inverse)(void *a, void *b),
  int taille_elt);
 
int cmp_int(int *, int *);
 
int cmp_char(char *, char *);
 
void inv_int(int *, int *);
 
void inv_char(char *, char *);
 
 
/* le code en lui meme */
 
main()
{
 int tableau[10] = {10,9,8,7,6,5,4,3,2,1};
        int i;
 char *chaine = (char*) malloc(9);
 
 chaine = "hgfedcba";
 
 tri_bulle ((void *) tableau, 10, &cmp_int, &inv_int, sizeof(int));
 
        for (i=0 ; i<10 ; i++)
         printf("%d ", tableau[i]);
 
 tri_bulle ((void *) chaine, 8, &cmp_char, &inv_char, sizeof(char));
  printf("\n%s", chaine);
 
   getchar();
 
}
 
void tri_bulle(void *tab,
  int max,
  int(*compare)( void *a, void *b),
  void(*inverse)( void *a, void *b),
  int taille_elt
  )
{
 int i, j, max_j=max-1;
 
 for (i=0 ; i < max ; i++)
     {
  for (j=0 ; j <max_j ; j++)
   //avec visual, la compilation merde ici
   if (compare(&tab[(j+1)*taille_elt], &tab[j*taille_elt]) <0)
          //ici aussi  
    inverse(&tab[(j+1)*taille_elt], &tab[j*taille_elt]);
        max_j--;
      }
}
 
int cmp_int(int *un , int *deux)
{
 if (*un > *deux )
  return 1;
 else
  if (*un < *deux)
   return -1;
  else
   return 0;
}
 
int cmp_char(char *un , char *deux)
{
    if (*un > *deux)
       return 1;
    else
        if (*un < *deux)
           return -1;
        else
            return 0;
}
 
void inv_int(int *un, int *deux)
{
 
 int tempon;
  tempon = *un;
 *un = *deux;
 *deux = tempon;
}
 
void inv_char(char *un, char *deux)
{
 char tempon;
 tempon = *un;
  *un = *deux;
  *deux = tempon;
 
}

Reply

Marsh Posté le 22-11-2001 à 17:05:50   

Reply

Marsh Posté le 22-11-2001 à 17:19:46    

de manière générale, c'est toujours bon d'éliminer les warnings (tu peux te permettre d'en ignorer certains, comme la conversion float/double). ton problème est juste une tolérance différente entre les deux compilateurs.
 
solution : tu élimines tes warnings :D tu convertis tes fonctions cmp_int, cmp_char, etc ... en leur passant en paramètre des void*. et dans le corps des fonctions, tu déclares deux nouvelles variables  qui castent les paramètres vers les types que tu utilises.
 
par ex :  
 
int cmp_int(void* p1, void* p2)
{
   int* param1 = (int*)p1;
   int* param2 = (int*)p2;
   // et là tu bosses avec param1 et param2
}
 
voilà.

Reply

Marsh Posté le 22-11-2001 à 18:46:53    

moi, j'ai un pb avec ta ligne :
 
tri_bulle ((void *) tableau, 10, &cmp_int, &inv_int, sizeof(int));  
 
il me semble que pour passer le pointeur de la fonction f, on utilise "f" et non pas "&f"...
 
me gourre-je ?
 
Mogi

Reply

Marsh Posté le 22-11-2001 à 21:06:23    

mogi a écrit a écrit :

moi, j'ai un pb avec ta ligne :
 
tri_bulle ((void *) tableau, 10, &cmp_int, &inv_int, sizeof(int));  
 
il me semble que pour passer le pointeur de la fonction f, on utilise "f" et non pas "&f"...
 
me gourre-je ?
 
Mogi  




 
Les deux sont possibles.

Reply

Marsh Posté le 22-11-2001 à 21:09:15    

Puisque tu compile avec des compilateur C++ tu devrais t'orienter vers les template, à mon avis tu y gagnera en généralité et en clarté (d'un autre côté il me semble que le tri à bulle est déjà implémenter dans la STL mais c pas sur)

Reply

Marsh Posté le 22-11-2001 à 22:03:46    

b

Reply

Marsh Posté le 22-11-2001 à 22:03:46    

salut,
 
j'aime bien ton programme, belle petite prog comme j'aime. Par contre tu n'arriveras pas a trier les char avec accents sauf si tu forces ton compile a travailler en unsigned char (et encore ?), ou alors en faisant un casting (unsigned char) dans la fonc cmp_char.

 

[edtdd]--Message édité par barbarella--[/edtdd]

Reply

Marsh Posté le 23-11-2001 à 00:10:35    

C pas plus efficace Quicksort ??

Reply

Marsh Posté le 23-11-2001 à 00:21:26    

Je sais pas si ca vient de la mais comment il fait pour se debrouiller avec '&tab[(j+1)*taille_elt]' quand tab a pour type (void *). Il a besoin de connaitre la taille des elements du tableau.
Faut pas ecrire plutot (void *) ((long)tab + (j+1)*taille_elt)

Reply

Marsh Posté le 23-11-2001 à 17:05:46    

merci les gars pour vos conseils
 
en fait, oui , le tri bulle c'est de la merde , mais c'est ce qu'on me demande en TP alors je me plie aux ordres ;)
et puis le but de l'opération pour moi c'est d'arriver à faire des fonctions universelles et à travailler avec du void et des pointeurs sur fonctions
 
thx
a+
Father

Reply

Marsh Posté le 23-11-2001 à 17:05:46   

Reply

Marsh Posté le 23-11-2001 à 18:00:03    

[BOULET] si c'est du C++
et qu'on a droit aux templates alors je reponds:
 

Code :
  1. IntBubbleSort<N>:
  2. IntBubbleSortLoop<N-1,0>  IntBubbleSort<N-1>
  3. IntBubbleSort<1>:
  4. (nil)
  5. IntBubbleSortLoop<I,J>:
  6. IntSwap<J,J+1> IntBubbleSortLoop<(J+2<=I) ? I : 0, (J+2<=I) ? (J+1) : 0>
  7. IntBubbleSortLoop<0,0>:
  8. (nil)
  9. IntSwap<I,J>:
  10. if (data[I] > data[J]) swap(data[I],data[J]);


 
:D
A+
LEGREG
Ps: c'est pas du C++ valide, c'est la description condensee des templates..

 

[edtdd]--Message édité par legreg--[/edtdd]

Reply

Marsh Posté le 24-11-2001 à 00:55:22    

BjBebert , merci !
avec (void *) ((long)tab + (j+1)*taille_elt) j'ai plus d'error ni de warning!
Elégante manière de coder :)
thx
a+
Father

Reply

Sujets relatifs:

Leave a Replay

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