Ca passe nikel avec gcc , mais ca compile pas avec visual.... - Programmation
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 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à.
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
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.
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)
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]
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)
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
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 :
|
A+
LEGREG
Ps: c'est pas du C++ valide, c'est la description condensee des templates..
[edtdd]--Message édité par legreg--[/edtdd]
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
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;
}