ha oui en effet, je ne dois pas utiliser les bonnes options du compilateur lol.
Si je n'utilise pas qshort, c'est parce que c'est la question de mon exercice
ha oui en effet, je ne dois pas utiliser les bonnes options du compilateur lol.
Si je n'utilise pas qshort, c'est parce que c'est la question de mon exercice
http://emmanuel-delahaye.developpez....tm#cfg_compilo
qsort() ...Si je n'utilise pas qshort, c'est parce que c'est la question de mon exercice
Du verbe to sort : trier ...
Hum...
Les fonctions de comparaison utilisées pour qsort ont pour règle de renvoyer 0 quand les éléments sont égaux, -1 ou 1 quand les éléments sont inégaux (le signe +- servant à montrer lequel est plus petit que lequel)
Si chez-toi ça marche avec une fonction qui renvoie 1 en cas d'égalité, alors
- soit ton algo n'est pas normalisé (j'ai pas tout regardé)
- soit ça ne marche que par hasard
Sinon, pour répondre à ton interrogation, 1 est effectivement équivalent à true...
En fait, si je ne me trompe pas je crois que :
si 0 -> False,
sinon -> True.
alors
est equivalent a
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (cmp_element(tab[i],tab[j]))
et donc different de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (cmp_element(tab[i],tab[j]) != 0)
Enfin tout ca pour dire que 1 n'est pas equivalent a True... (car (True => 1) est une assertion fausse mais (1 => True) est vrai donc (1 <=> True) est faux)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (cmp_element(tab[i],tab[j]) == 1)
(J'ai pas l'impression d'avoir été tres clair...dsl lol)
Sinon pour Sve@r, oui en effet j'ai dit une grosse trivialité :
"mais strcmp veut des char"
car je crois que c'était ca que notre ami allezlolo n'avais pas fais attention...
et qui lui causait quelques soucis!!
Sinon allezlolo si je peux te donner un conseil (qui vaut ce qui vaut) si tu developpe avec gcc, prends 5 min pour lire la doc et choisir les options que tu rajoutes a la compilation qui te permettra de sortir des warning sur des choses importantes. Ce qui pourra a l'avenir eviter des comportements byzar de tes executables...
A titre d'exemple je compile avec :
Et des que je créer une fonction je la passe a valgrind (profiler) pour regarder s'il n'y a pas de fuite memoire ou etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc -W -Wall -Wextra -pedantic -ansi
Ok. 1 est considéré comme vrai mais vrai n'est pas forcément égal à 1...
NON !!!
strcmp veut des char *
Un char c'est un simple nombre, un char étoile c'est une adresse. Même si en final on n'a que du bit, l'élément conceptualisé sous le vocable "char" n'est pas la même chose que l'élément conceptualisé sous le vocable "char étoile".
Et en allant plus loin, même si un "char étoile" et un "char étoile étoile" sont deux adresses, les deux éléments ne sont pas équivalents. Si tu pars en te disant que l'étoile est négligeable, tu n'iras pas loin...
oupssssss en effet c'était un abus de langage....qui m'a fait dire cet enormite!!
en remettant cette reflexion dans le contexte je voulais souligné simplement le fait que strcmp() ne pouvait pas correspondre au prototype de la fonction de comparaison generique : car elle necessite des void * et strcmp() des char *
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 situation_ou_je_m_exprime_mal++; if (encore_une_mauvaise_expression(barbsbou)) { cours_d_expression_bas_niveau(&barbsbou); }
/* Vous remarquerez que j'ai mis un '&' a barbsbou en esperant que cette fonction le modifie.... lol */
Alors il faut le dire explicitement. Déjà qu'on a du mal à comprendre les choses implicites dans le langage parlé, c'est encore pire par écrit. Et si un débutant lit ce topic et qu'il se met à utiliser strcmp avec des char ???
Par ailleurs, void * étant universel, strcmp sera tout à fait utilisable dans ce contexte...
En effet, le genre d'erreur que j'ai pu faire a diverse occasion dans cette discussion peut être dommageable pour les debutants qui lisent cette conversation (desole). Alors il est bien que des personnes comme toi rectifie le tir...c'est vrai je te l'accorde, neanmoins le type de reflexion subjectif
Deux jours plus tard, j'ai bien avancé grâce à vous dans mon tp,
j'attaque maintenant le même trie mais en prenant les valeurs d'un tableau d'élément, plutôt que les valeurs d'un tableau de pointeurs.
Je garde donc ce topic sous la main si j'ai besoin de vorte aide
Encore merci
Rebonsoir à tous,
Je bloque en fait déjà sur la déclaration et l'affichage du tableau.
Il me faut donc un tableau de valeurs (de type qcq mais toutes de même types).
J'ai donc pensé déclarer mon tableau comme ça :
Hélas j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void const tab[] = { "d", "c", "b", "a" };
Ensuite pour l'affichage, je suis un peu dans le flou aussi, j'ai testée (si mon tableau est un tableau de char*) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part erreur: declaration of «tab" as array of voids
Et j'ai maintenant les erreurs suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void aff2 (void const *tab, int n) { int i; for (i = 0; i < n; i++) { printf ("%s ", (char*) *tab[i]); } printf ("\n"); }
Voilà je vous remercie à l'avance si vous pouvez essayer de m'éclairer un peu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 attention : dereferencing «void *" pointer erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être
Non. On ne sait pas définir un objet de type 'void'. Ca n'a aucun sens. Ce que tu veux, c'est un tableau de pointeurs sur void :
Code : Sélectionner tout - Visualiser dans une fenêtre à part void const *tab[] = { "d", "c", "b", "a" };
Bonsoir,
du coup je ne vois pas la différence avec ma question précédente.
Dans ma question précédente, il me fallait effectivement un tableau de pointeursdes éléments.
Là il me faut un tableau d'éléments de type quelconques.
Je ne vois donc pas exactement la différence ??
"un tableau d'éléments de type quelconques", ça n'existe pas, comme je me tue à te l'expliquer.
Tout ce qu'on sait faire, c'est un tableau de pointeurs vers des éléments de type quelconque... C'est tout.
Tu remarqueras que c'est même précisé dans le titre de cette discussion...
Code : Sélectionner tout - Visualiser dans une fenêtre à part void *tab[10];
Bonsoir,
D'accord, donc si je comprends bien je dois m'en prendre à mon prof de c lol.
Pour info, voici le sujet de mon tp tel qu'il nous est donné :
Donc voilà je n'arrive pas à saisir la diffrénce entre les deux questions (2 et 4).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Question 1 : Ecrire une fonction qui trie les valeurs d'un tableau de double (dans l'ordre croissant) ==> fait sans pbs. Question 2 : Ecrire une fonction qui trie les valeurs d'un tableau de pointeurs sur des éléments de type quelconque. La fonction doit recevoir en paramètre un pointeur sur la fonction qui compare deux éléments e1 et e2 (passés par référence) et retourne -1,0 ou 1, selon que e1 est inférieur, égal ou supérieur à e2. ==> fait avec votre aide Question 3 : Tester encore la fonction précédente pour trier des chaines de caractères dans l'ordre lexicographique. ==> idem Question 4 : Ecrire une fonction qui trie les valeurs d'un tableau d'éléments de type quelconque. La fonction doit recevoir en paramètre un pointeur sur la fonction qui compare deux éléments e1 et e2 et retourne -1,0 ou 1, selon que e1 est inférieur, égal ou supérieur à e2. ==> Ma dernière question.
Merci
Pour le 4, ça veut dire que la fonction que tu vas écrire ne devra pas présumer du type des éléments qu'elle aura à trier. Tu dois l'écrire de façon tellement "bas niveau" qu'une fois écrite, elle pourra à loisir trier des char, des short, des double, des chaines, des structures, etc. Bien entendu, c'est l'utilisateur qui devra écrire la fonction de comparaison. En fait, faut que tu réécrives qsort(). A toi d'imaginer son mécanisme...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager