CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Probleme avec les structures

MathieuN7
MathieuN7
Niveau 10
11 janvier 2005 à 19:08:43

qsort(tab,50,sizeof(struct individu),compare);

Et elle ne prend pas d´argument cette fonction?

dnob700
dnob700
Niveau 10
11 janvier 2005 à 19:20:34

il faut mettre & ( pas besoin de mettre les arguments, c´est pas le problème ( enfin, je crios pas)).

omegasf3
omegasf3
Niveau 8
11 janvier 2005 à 19:36:33

en effet y pas besoin de mettre d´argument a compare

Altonfrere
Altonfrere
Niveau 10
11 janvier 2005 à 20:51:26

le proto exact c´est :

int _cdecl compare(const void *ii, const void *_jj);

normalement avec ca le warning s´en ira :)

par contre un petit conseil pour l´avenir, codez votre propre qsort parceque c´est loin d´être rapide comme méthode ( malgré son nom) :) c´est pratique mais pas super optimisé

omegasf3
omegasf3
Niveau 8
11 janvier 2005 à 21:03:34

Mais c´est quoi int _cdecl ? :question:
c´est un type ?
ça sert a quoi?

Altonfrere
Altonfrere
Niveau 10
11 janvier 2005 à 21:11:23

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core___cdecl.asp

omegasf3
omegasf3
Niveau 8
11 janvier 2005 à 21:27:27

je l´ai taper comme ça et ça:
int __cdecl compare(void *ii,void *jj){
struct individu *i=(struct individu*)ii;
struct individu *j=(struct individu*)jj;
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
et ça me met ces erreur:
exo1.c:41: error: parse error before " compare"
exo1.c: In function `main´:
exo1.c:65: warning: passing arg 4 of `qsort´ from incompatible pointer type

Altonfrere
Altonfrere
Niveau 10
11 janvier 2005 à 22:15:45

tu utilises quoi, DevCpp ou VisualC++ ?

omegasf3
omegasf3
Niveau 8
11 janvier 2005 à 22:23:45

j´utilise linux et le comilateur gcc

Altonfrere
Altonfrere
Niveau 10
11 janvier 2005 à 22:29:40

humm ah bin vi alors ca va peut être pas marcher . .. d´après le msdn _cdecl c´est un truc spécifique microsoft je sais pas quel est l´équivalent pour gcc

ya pas une doc sur qsort ? doit y avoir le prototype correspondant

omegasf3
omegasf3
Niveau 8
11 janvier 2005 à 22:40:01

ben la doc officielle dit:
QSORT(3) Manuel du programmeur Linux QSORT(3)

NOM
qsort - Trier une table.

SYNOPSIS
#include < stdlib.h>

void qsort ( void *base, size_t nmemb, size_t size,
int ( *compar)(const void *, const void *));

DESCRIPTION
La fonction qsort() trie une table contenant nmemb éléments de taille
size. L´argument base pointe sur le début de la table.

Le contenu de la table est trié en ordre croissant, en utilisant la
fonction de comparaison pointée par compar, laquelle est appelée avec
deux arguments pointant sur les objets à comparer.

La fonction de comparaison doit renvoyer un entier inférieur, égal, ou
supérieur à zéro si le premier argument est respectivement considére
comme inférieur, égal ou supérieur au second. Si la comparaison des
deux arguments renvoie une égalite ( valeur de retour nulle), l´ordre
lines 1-25

dnob700
dnob700
Niveau 10
11 janvier 2005 à 23:26:20

je te l´ai dit plus haut, quand tu passe à qsort l´adresse dela fonction, il ne faut pas faire :

qsort(...,compare);
mais :
qsort(...,&);

comme pour n´importe quel variable quand tu passe un pointeur.

omegasf3
omegasf3
Niveau 8
12 janvier 2005 à 00:09:02

ça marche pas qant je compile avec :

  1. include < stdlib.h>
  2. include < stdio.h>
  3. include < string.h>

struct individu{
char nom[20];
char ville[10];
char prenom[10];
int age;
};

struct individu tab[50];

void init(){
strcpy(tab[0].nom,"henri");
strcpy(tab[0].ville,"paris");
strcpy(tab[0].prenom,"martin");
tab[0].age=40;

strcpy(tab[1].nom,"chevalier");
strcpy(tab[1].ville,"marseille");
strcpy(tab[1].prenom,"mark");
tab[1].age=33;

strcpy(tab[2].nom,"barock");
strcpy(tab[2].ville,"bordeau");
strcpy(tab[2].prenom,"marie");
tab[2].age=19;
}

int compare(struct individu * i,struct individu * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}

/ *int __cdecl compare(void *ii,void *jj){
struct individu *i=(struct individu*)ii;
struct individu *j=(struct individu*)jj;
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}*/

int compare2(struct individu * i,struct individu * j){
if(i->age!=j->age)
return i->age-j->age;
return strcmp(i->ville,j->ville);
}

int main(){
int i;
init();
printf("Voici votre agenda au debut:\n");
for(i=0;i<3;i++)

printf("%s\n%s\n%s\n%d\n",tab[i].nom,tab[i].ville,
tab[i].prenom,tab[i].age);printf("Voici votre agenda trié:\n");
qsort(tab,50,sizeof(struct individu),&);
for(i=0;i<3;i++)

printf("%s\n%s\n%s\n%d\n",tab[i].nom,tab[i].ville,
tab[i].prenom,tab[i].age);
return 0;
}

ça me remet les meme erreur

omegasf3
omegasf3
Niveau 8
12 janvier 2005 à 00:21:45

sinon je peux executer le programme malgrès le warning mais le tableau n´est pas trié j´obtient ceci:
Voici votre agenda au debut:
henri
paris
martin
40
chevalier
marseille
mark
33
barock
bordeau
marie
19
Voici votre agenda trié:

0

0

0

kufa
kufa
Niveau 9
12 janvier 2005 à 01:40:37

c´est quoi ton warning?
Heu un memset a 0 sur le tableau de depart serait le bienvenu je pense ; )

Altonfrere
Altonfrere
Niveau 10
12 janvier 2005 à 08:27:44

nan faut pas de & pour un pointeur de fonction ( le nom de la fonction est déjà un pointeur de fonction).

Mais la doc te dit bien ce qu´il faut pour la déclaration de compare :

int compare(const void *e1, const void *e2)
{
. ..
}

qsort(...,compare);

omegasf3
omegasf3
Niveau 8
12 janvier 2005 à 08:58:44

quant je met :
int compare(const struct individu * i,const struct individu * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
ca me met les meme erreur a savoir:
exo1.c: In function `main´:
exo1.c:74: warning: passing arg 4 of `qsort´ from incompatible pointer type

et quant je met :
int compare(const void * i,const void * j){
int k;
k= strcmp(i->nom,j->nom);
if(k!=0)
return k;
return strcmp(i->prenom,j->prenom);
}
ca me met:
exo1.c: In function `compare´:
exo1.c:34: warning: dereferencing `void *´ pointer
exo1.c:34: error: request for member `nom´ in something not a structure or union
exo1.c:34: warning: dereferencing `void *´ pointer
exo1.c:34: error: request for member `nom´ in something not a structure or union
exo1.c:37: warning: dereferencing `void *´ pointer
exo1.c:37: error: request for member `prenom´ in something not a structure or union
exo1.c:37: warning: dereferencing `void *´ pointer
exo1.c:37: error: request for member `prenom´ in something not a structure or union

Altonfrere
Altonfrere
Niveau 10
12 janvier 2005 à 09:02:10

oui mais faut caster tes pointeurs sinon il sait pas comment interpéter les const void * !

j´ai vu quelquepart plus la fonction avec les cast . ..

faut dans la fonction compare écrire qqchose comme :

struct individu *individu_i = ( struct individu *)i;
struct individu *individu_j = ( struct individu *)j;

et utiliser ces nouvelles variables dans le reste de la fonction

Altonfrere
Altonfrere
Niveau 10
12 janvier 2005 à 09:02:55

quelquepart plus haut*

omegasf3
omegasf3
Niveau 8
12 janvier 2005 à 14:29:22

c´est bon j´ai trouver le problem :)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment