IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Trier un tableau de pointeurs sur des éléments de type quelconque


Sujet :

C

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    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

  2. #22
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    ha oui en effet, je ne dois pas utiliser les bonnes options du compilateur lol.
    http://emmanuel-delahaye.developpez....tm#cfg_compilo
    Si je n'utilise pas qshort, c'est parce que c'est la question de mon exercice
    qsort() ...

    Du verbe to sort : trier ...

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    qsort() ...

    Du verbe to sort : trier ...
    et q comme quick non ? lol

    tri rapide, ça me dit quelque chose si je reviens un semestre en arriere...

  4. #24
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbsbou Voir le message
    mais strcmp veut des char


    Citation Envoyé par allezlolo Voir le message
    C'est bon ça marche

    Il me fallait en fait mettre

    if (cmp_element(tab[i],tab[j])==1)

    ça me parait un peu bizarre car je croyais que 1 était équivalent à true...

    Enfin bon ça marche c'est le principal
    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...

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    En fait, si je ne me trompe pas je crois que :
    si 0 -> False,
    sinon -> True.

    alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]))
    est equivalent a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]) != 0)
    et donc different de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]) == 1)
    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)
    (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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -W -Wall -Wextra -pedantic -ansi
    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...

  6. #26
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbsbou Voir le message
    En fait, si je ne me trompe pas je crois que :
    si 0 -> False,
    sinon -> True.

    alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]))
    est equivalent a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]) != 0)
    et donc different de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (cmp_element(tab[i],tab[j]) == 1)
    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)
    (J'ai pas l'impression d'avoir été tres clair...dsl lol)
    Ok. 1 est considéré comme vrai mais vrai n'est pas forcément égal à 1...


    Citation Envoyé par barbsbou Voir le message
    Sinon pour Sve@r, oui en effet j'ai dit une grosse trivialité :
    "mais strcmp veut des char"
    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...

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    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 */

  8. #28
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbsbou Voir le message
    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 *
    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...

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 67
    Points : 52
    Points
    52
    Par défaut
    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

  10. #30
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    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

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void const tab[] = { "d", "c", "b", "a" };
    Hélas j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: declaration of «tab" as array of voids
    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
    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");
    }
    Et j'ai maintenant les erreurs suivantes :

    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
    Voilà je vous remercie à l'avance si vous pouvez essayer de m'éclairer un peu.

  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void const tab[] = { "d", "c", "b", "a" };
    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" };

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    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 ??

  14. #34
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    Là il me faut un tableau d'éléments de type quelconques.
    "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...

  15. #35
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    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é :


    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.
    Donc voilà je n'arrive pas à saisir la diffrénce entre les deux questions (2 et 4).

    Merci

  16. #36
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par allezlolo Voir le message
    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é :


    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.
    Donc voilà je n'arrive pas à saisir la diffrénce entre les deux questions (2 et 4).

    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...

  17. #37
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En fait, faut que tu réécrives qsort(). A toi d'imaginer son mécanisme...
    ... et de bien étudier son interface ainsi que le rôle de chaque paramètre.

  18. #38
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 79
    Points : 42
    Points
    42
    Par défaut
    bon,

    ben c'est parti

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. xsd:all sur des éléments de type différents
    Par Steph0 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 12/08/2012, 18h04
  2. Réponses: 3
    Dernier message: 15/03/2007, 12h09
  3. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  4. Problème de *pointeur sur des char
    Par Spartan03 dans le forum C++
    Réponses: 2
    Dernier message: 18/09/2005, 14h20
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo