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 :

Pointeur de pointeurs en c


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 139
    Points : 35
    Points
    35
    Par défaut Pointeur de pointeurs en c
    Bonjour ,

    J'ai une fonction qui me retourne l'adresse d'un tableau d'adresses .Ce tableau contient d'abord un pointeur vers du char , ensuite , un pointeur vers du unsigned short et puis un pointeur vers du double.Comment dois-je faire pour récupérer le char , le unsigned short et le double ainsi que pour avancer dans l'adresse de mon tableau ?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ce tableau contient d'abord un pointeur vers du char , ensuite , un pointeur vers du unsigned short et puis un pointeur vers du double.
    Donc, c'est un tableau de void *.
    Pour accéder aux objets pointés, il faut rétablir le type exact de chaque pointeur, sans se tromper (char*, unsigned short*,... ) avant de pouvoir utiliser ce pointeur
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 139
    Points : 35
    Points
    35
    Par défaut probleme pointeur de pointeurs
    Bonjour à tous ,

    en fait , j'ai une fonction void ** getAdresses(const char ** ptrStr) qui me retourne l'adresse d'un tableau d'adresses.
    Chaque adresse du tableau pointe vers une séquence d'octets en RAM qui contient 2 informations : une valeur suivi directement d'une position.
    La valeur est contenue soit dans un char , soit un unsigned short , soit un double.
    La position est toujours un char.

    J'ai commencé par faire :
    char ** liste;
    void ** tab=getAdresses(&liste);

    Mais mon problème est que je ne sais pas comment faire pour récupérer le char , le double ou encore le unsigned short dans le tableau.


  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    La valeur est contenue soit dans un char , soit un unsigned short , soit un double.
    Comment sait-on s'il s'agit d'un char, d'un unsigned short ou d'un double ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 139
    Points : 35
    Points
    35
    Par défaut
    j'ai rajouté en piece jointe l'énoncé du problème
    Images attachées Images attachées

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par dark0502 Voir le message
    Mais mon problème est que je ne sais pas comment faire pour récupérer le char , le double ou encore le unsigned short dans le tableau.
    Il serait plus judicieux de gérer une sorte de "variant" comme le type win32.
    Un variant c'est une structure regroupant en elle-même une union de différents types...

    sinon concernant le sujet exposé, cela montre une faiblesse du C : on ne peut pas gérer des types génériques comme les templates du C++..
    Avec les Templates du C++ ce serait plus aisé.
    Citation Envoyé par diogene Voir le message
    Comment sait-on s'il s'agit d'un char, d'un unsigned short ou d'un double ?
    justement en gérant des "variants" on peut fixer ou lire le type en accédant à la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      struct VARIANT
                {
                VARTYPE vt;
                 union 
                    {
                    byte bVal;
                    short iVal;
                    float  fltVal;
                    double dblVal;
    //.....etc
            }  ;

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Il serait plus judicieux de gérer une sorte de "variant" comme le type win32.
    Un variant c'est une structure regroupant en elle-même une union de différents types...

    sinon concernant le sujet exposé, cela montre une faiblesse du C : on ne peut pas gérer des types génériques comme les templates du C++..
    Avec les Templates du C++ ce serait plus aisé.


    justement en gérant des "variants" on peut fixer ou lire le type en accédant à la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      struct VARIANT
                {
                VARTYPE vt;
                 union 
                    {
                    byte bVal;
                    short iVal;
                    float  fltVal;
                    double dblVal;
    //.....etc
            }  ;
    Et je ne vois pas en quoi c'est "une faiblesse du C : on ne peut pas gérer des types génériques comme les templates du C++.. Avec les Templates du C++ ce serait plus aisé.". C'est souple et facile a mettre en oeuvre...

    Si tu cherches la definiton des VARIANT tu verras probablement que c'est exactement ca..
    Et cette solution est adoptee dans pleins de logiciels C, donc je ne vois pas en quoi ce serait une "faiblesse"...

    Et ca c'est une solution;

    L'autre, que suggerait diogene, est simplement de savoir le type....

    (c'est le principe des fameux TAD)

    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
     
    typedef struct toto { 
        int x ;
        int y ;
    } toto ;
     
    fonction ( void *valeur, int TYPE )
    {
        double *d = (double *)valeur ;
        int      *i=(int *)valeur ;
        toto   *to=(toto *)valeur ;
     
        switch ( TYPE )
        {
           case DOUBLE :
               *d = 3.125 ;
                break ;
     
           case INTEGER :
               *i=123 ;
                break ;
     
          case MASTRUCT :
               to->x = 0 ;
               ti->y = 1 ;
               break ;
       ....
         }
     
    .....
    }
     
    {
    ....
    double d ;
    int      i ;
    toto    to ;
     
    switch ( TYPE )
    {
       case DOUBLE :
         fonction ( (void *)&d, DOUBLE);
         fprintf ( stdout, "\nLe resultat pour double est : %g\n",d);
         break ;
     
       case INTEGER :
        fonction ( (void *)&i, INTEGER);
         fprintf ( stdout, "\nLe resultat pour entier est : %d\n",i);
        break ;
     
       case MASTRUCT :
        fonction ( (void *)&to, MASTRUCT);
        fprintf ( stdout, "\nLe resultat pour structure est : x=%d y=%d\n",to.x,to.y);
        break ;
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. pointeur de pointeur
    Par petdelascar dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 10h26
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

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