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 :

Question sur les pointeurs génériques


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut Question sur les pointeurs génériques
    Bonsoir tout le monde ,

    J'ai juste une question sur les pointeurs génériques.
    En fait j'aimerais faire une fonction de tri générique par la méthode Tri à bulle . Donc je ne connais pas ce que je vais trier.

    J'ai vu dans la FAQ qu'il fallait passer en paramètre le type de variable à traiter donc dans mon cas il faut absolument que je passe le type d'objet à trier . Mais y'a t il un autre moyen de le faire , par exemple en passant la longueur de l'objet ?

    Merci pour vos réponses

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mikedavem
    J'ai juste une question sur les pointeurs génériques.
    En fait j'aimerais faire une fonction de tri générique par la méthode Tri à bulle . Donc je ne connais pas ce que je vais trier.

    J'ai vu dans la FAQ qu'il fallait passer en paramètre le type de variable à traiter donc dans mon cas il faut absolument que je passe le type d'objet à trier . Mais y'a t il un autre moyen de le faire , par exemple en passant la longueur de l'objet ?
    Pour faire des traitements de données génériques, il faut passer
    • L'adresse
    • La taille de l'élément
    • Le nombre d'éléments (si c'est un tableau)
    Regarde l'interface de la fonction standard qsort(), tu vas comprendre.

    C'est un sujet interessant. Poste ton code...

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Ok ,

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include <stdio.h>
    #include <stdlib.h>
     
       void** Tri_generique(void *tabTri, int nbobjet, int longobjet, int(*compare)(void *, void *)) {
     
       int i,j,permut=0;
       void** tabrang = malloc(nobjet*longobjet);
       void *temp;
     
       if (tabrang) {
          // Initialisation du tableau en insérant les pointeurs de tabTri
          for(i=0;i<nbobjet;i++) tabrang[i] = &(tabTri[i]);
     
          // Tri à bulle
          for(i=0;(i<nbobjet) && (permut == 0);i++) {
             permut = 1;
             for(j=1;j<(nbobjet-i);j++) {
                if(compare(tabrang[j],tabrang[j-1]) == -1) {
                   temp = tabrang[j-1];
                   tabrang[j-1] = tabrang[j];
                   tabrang[j] = temp;
                   permut = 0;
                             }
                       }
                 }
                 return (tabrang);
           }
           else return NULL;
    }
    Bon j'ai une erreur "deferencing 'void *' pointer sur tabrang[i] = &(tabTri[i]) , ce qui peut paraître normale car je ne renseigne aucun type de variable... On fait comment dans ce cas là ? car je ne suis censé ne pas le connaître .

    En attendant je vais regarder l'interface de qsort comme tu me l'as indiqué.

    Merci pour ta réponse

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mikedavem
    Bon j'ai une erreur "deferencing 'void *' pointer sur tabrang[i] = &(tabTri[i]) , ce qui peut paraître normale car je ne renseigne aucun type de variable... On fait comment dans ce cas là ? car je ne suis censé ne pas le connaître .
    Tu aurais dû faire un copié/collé, car il y a des erreurs de saisie...

    Le type void** ne fait pas du tout ce que tu crois, et n'est pas générique. Seul void* est générique. De toutes façon, ta stratégie n'est pas bonne. Une fonction de tri de fait pas la copie triée d'un tableau mais agit directement sur le tableau original (qui doit évidemment être modifiable).

    Pour ce qui est des calculs internes, il faut créer un ou des pointeurs char * internes et faire les calculs d'adresse à la main à l'aides des informations passée en paramètre (taille de l'élément, notamment). Quand aux copies (swap), elles se font à coup de memcpy(), l'élement temporaire étant évidemment alloué dynamiquement (1 seule fois, bien sûr). Il n'y a rien à retourner.

    Tu devrais donner un exemple complet, notamment de la fonction de comparaison, ou au moins expliquer sa valeur de retour...

    Tu aurais dû commencer par mettre au point l'algo de tri, car il est faux.

    Voici une version corrigée de l'algo...
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define DBG 0
     
    static intswap (int *a, int *b)
    {
       int t = *a;
       *a = *b;
       *b = t;
    }
     
    void Tri_int(int *tabTri, size_t nbobjet, int(*compare)(void const *, void const *))
    {
       // Tri à bulle
       size_t i;
       int *pa = tabTri;
       for (i = 0; i < nbobjet; i++)
       {
          size_t j;
          for (j = 1;j < nbobjet - i; j++)
          {
             if (compare(pa + (j - 0), pa + (j - 1)) < 0)
             {
                intswap(pa + (j - 0), pa + (j - 1));
             }
          }
       }
    }
     
    static int compare (void const *a, void const *b)
    {
       int const *pa = a;
       int const *pb = b;
    #if DBG   
       printf ("*pa=%3d *pb=%3d\n", *pa, *pb);
    #endif
       return *pa - *pb;
    }
     
    static display (int *a, size_t n)
    {
       size_t i;
     
       for (i = 0; i < n; i++)
       {
          printf ("%3d", a[i]);
       }
       printf ("\n");
    }
     
    int main (void)
    {
       int a[] =
          {
             4, 2, 6, -1, 5, 4, 6, 2, 5, 7, 3
          };
     
       Tri_int(a, sizeof a / sizeof * a, compare) ;
     
       display(a, sizeof a / sizeof * a);
       return 0;
     
    }
    La partie comparaison est générique. Je te laisse rendre la chose complètement générique (j'ai une solution qui fonctionne). L'algo a été prépéré pour la généricité. Il ne reste plus qu'à modifier le type de pa en char * et d'integrer la taille de l'objet dans les calculs d'adresse.

    Il y a une petite astuce pour optimiser le swap génerique... (mais j'en ai déjà parlé)

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Excuse pour les fautes , le copier coller ne marchait pas chez moi sous linux .. Je mettrais le code complet dès ce soir .

    En fait j'ai pris un bout de prog que j'ai fait cette année . Il fallait trier un tableau de structure de skieurs (champ nom , prenom , age , vitesse ..) . Le trier directement est trop long donc il fallait passer par un tableau intermédiaire d'indice. On pouvait passer par n'importe quelle méthode de tri (Bon là j'ai pris une méthode tri à bulle) .

    Bon je mettrais le code dès ce soir de toute façon.

    Merci encore pour ton aide

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par mikedavem
    En fait j'ai pris un bout de prog que j'ai fait cette année . Il fallait trier un tableau de structure de skieurs (champ nom , prenom , age , vitesse ..) . Le trier directement est trop long donc il fallait passer par un tableau intermédiaire d'indice. On pouvait passer par n'importe quelle méthode de tri (Bon là j'ai pris une méthode tri à bulle) .
    Avec qsort(), tu tries n'importe quoi..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simple question sur les pointeurs
    Par Clad3 dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2006, 01h05
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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