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 :

pointeurs, toujours les pointeurs :/


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 23
    Points
    23
    Par défaut pointeurs, toujours les pointeurs :/
    Voila j'ai un petit problème de pointeurs, satanés pointeurs!

    Ma fonction est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int
    give_place (void **stock, const int struct_nbr, const int port)
    {
        int i;
     
        /* check all places */
        for (i=0; i < struct_nbr; i++)
            if ((*stock+i)->port == port)
                return (i);
     
        /* port not found */
        return (-1);
    }
    Cette fonction recherche dans un tableau (stock) de struct_nbr cases le port donné.

    Mon problème est le suivant:
    Le pointeur *stock peut etre de différents types, i_http, i_ftp...

    Ici a la compilation j'ai les 2 erreurs suivantes:
    retrosniffMemory.c:40: attention : dereferencing `void *' pointer
    retrosniffMemory.c:40: error: void value not ignored as it ought to be

    Un parametre que je pourrais passé en plus a la fonction pourrait me permettre de connaitre le type qu'il faut utiliser pour *stock mais je ne vois vraiment pas comment intégrer le changement dynamique du type du pointeur sans faire un switch et réécrire le coeur de la fonction pour chaque type

    Si qunlqun a une suggestion

    [Balises CODE ajoutées par Anomaly - Merci d'y penser vous-même à l'avenir ]

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    essaie de remplacer ton (*stock+i) par *stock[i]. Je suis pas sur de moi, mais ta facon d acceder a la i eme place me semble bizarre

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par darkalia
    essaie de remplacer ton (*stock+i) par *stock[i]. Je suis pas sur de moi, mais ta facon d acceder a la i eme place me semble bizarre
    Non le probleme est que tu ne peux pas te deplacer dans un pointeur de void, il faut imperativement connaitre le type pointe que ce soit pour faire *stock+i que stock[i].

    Je ne vois pas d'autre solution que de passer par des switch (ou moins pour convertir le pointeur, par forcement pour tout le traitement).

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    Oki ben si passer par les switch il faut par les switch je passerais

    Je créerais une sous fonction pour le code qui se répète ;p

    Merci pour les réponses )

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Le problème soulevé n'est pas remédiable comme le suggère GL car il faut connaître le type d'identifiant.
    C'est pour cette raison que les Templates ont été crées en C++...

    Sinon une solution serait de créer une sorte de structure générique comme une classe de "Variant"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct {
    int entier2;
    double reel4;
    char * charactere;
    // etc...
     
    } variant;

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    mat.M > oui mais to type variant est tout à la fois, ca va finir par etre enorme pour pas grand chose :

    je proposerais plutot

    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
     
    enum eTypeEffectif
    {
        entier,
        flottant,
        chaine
    };
     
    union uMultiType
    {
        int entier;
        double flottant;
         char* chaine;
    };
     
    struct sVariant
    {
       enum eTypeEffectif type;
       union uMultiType valeur;
    }
    qui donc s'utilise de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct sVariant titi;
    titi.type = entier;
    titi.valeur.eniter = 12;

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 42
    Points
    42
    Par défaut
    t'es quand même obligé de passer par un switch pour différencier les types

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    L'interet par rapport au variant de mat.M est double :

    *d'une part en terme d'occupation memoire, mon sVariant occupe 1 int + 1 double, ou plus exactement un enum + le plus gros des types de l'union, alors que la solution initiale occupe la somme de tous les types proposés...

    *d'autre part cette solution integre l'aiguilleur du switch.

    Cette solution n'est pas une chimere qui sort tout droit de mon esprit tortueux, mais c'est celle retenue par Motif pour les evenements ( a quelque chose près)...

    après, faut il un switch ?
    Mon esprit de contradiction dirait non... ....pas obligatoirement.

    Certes le switch n'est pas une mauvaise solution, mais on peut aussi faire des fonctions pour chaque cas, puis construire un tableau de fonctions (appelons le funcTab) de sorte que funcTab[i] pointe sur la fonction qui traite le cas où type vaut i et le switch devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (funcTab[titi.type])(titi);
    et on a reconstruit quelque chose qui ressemble ( de loin certes) au polymorphisme...

    C'est une solution, qui, si elle est elegante, ne manquera pas de destabiliser nombre de relcteur du code, donc si on la chosit il faudra documenter le code de facon a etre sur d'etre compris...

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mat.M
    Le problème soulevé n'est pas remédiable comme le suggère GL car il faut connaître le type d'identifiant.
    Si tu passe en plus un parametre qui defini d'une maniere ou d'une autre le type est que tu cast ton pointeur en fonction de ce parametre (dans un switch), ca marche bien (certes c'est galere). Je ne vois pas en quoi je propose une solution qui n'est pas applicable ?

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par mat.M
    Le problème soulevé n'est pas remédiable comme le suggère GL car il faut connaître le type d'identifiant.
    Si tu passe en plus un parametre qui defini d'une maniere ou d'une autre le type est que tu cast ton pointeur en fonction de ce parametre (dans un switch), ca marche bien (certes c'est galere). Je ne vois pas en quoi je propose une solution qui n'est pas applicable ?
    Oui tout à fait je me suis très mal exprimé je n'ai pas relu ce que j'ai écris , 1000 excuses.
    Je voulais dire "Car comme le suggère" , désolé

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Gandalf
    L'interet par rapport au variant de mat.M est double :

    *d'une part en terme d'occupation memoire, mon sVariant occupe 1 int + 1 double, ou plus exactement un enum + le plus gros des types de l'union, alors que la solution initiale occupe la somme de tous les types proposés...

    *d'autre part cette solution integre l'aiguilleur du switch.

    Cette solution n'est pas une chimere qui sort tout droit de mon esprit tortueux, mais c'est celle retenue par Motif pour les evenements ( a quelque chose près)...

    après, faut il un switch ?
    Mon esprit de contradiction dirait non... ....pas obligatoirement.

    Certes le switch n'est pas une mauvaise solution, mais on peut aussi faire des fonctions pour chaque cas, puis construire un tableau de fonctions (appelons le funcTab) de sorte que funcTab[i] pointe sur la fonction qui traite le cas où type vaut i et le switch devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (funcTab[titi.type])(titi);
    et on a reconstruit quelque chose qui ressemble ( de loin certes) au polymorphisme...

    C'est une solution, qui, si elle est elegante, ne manquera pas de destabiliser nombre de relcteur du code, donc si on la chosit il faudra documenter le code de facon a etre sur d'etre compris...
    c'est ce que j'ai spécifié (et codé) pour mon IHM embarquée
    mais utiliser un tableau de pointeurs de fonctions ou un switch c'est pareil, ce que je veux dire c'est que tu réécris le code pour chaque type
    (maintenant le tableau de pointeurs de fonctions est plus élégant, ça c'est sûr)
    et ce sera inévitable, à moins de truander en créant une interface, en dérivant des classes puis en bidouillant, ce qui sera pas terrible quand même

    au passage: le 'problème' du tableau de pointeurs de fonctions à pour inconvénient une liste d'arguments fixée (bon t'as toujours la solution qui est celle du 'main' : argv[] ...)

    (et ça ressemble même de près à du polymorphisme, c'est du polymorphisme à la 'C', sans compilo qui masque tout )

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Oui/Non

    Je suis un peu gene par cette notion de dupliquer le code...

    c'est clair tu ne peut pas faire de template comme en C++...
    mais tu peut faire des macros, qui ne sont pas typée, et donc en leur presentant les choses "comme il faut" ca marche ... ...sauf que c'est quasiement indebuggable, contrairement aux Template.

    ensuite on parle ici d'un cas abstrait, ou on ne sait rien des types effectivement traités...

    mais on peut imaginer que soit ces types sont siffisement differents pour que il n'y ait pas de duplication de code (donc plus de Problème)

    soit que ce code a dupliquer puisse se trouver dans des fonctions plus basses ou plus hautes que le switch (ou le tableau de pnoiteurs de fct)

    Plus basses pour des fonctions qui utiliseraient des convertion par exemple considerer les int comme des doubles...

    Plus hautes pour les fonctions n'etant pas marquées par le type effectif que l'on pourrait alors representer à nouveau comme du void *

    Pour la question de savoir si ca ressemble à du polymorphisme ou pas, je laisse cela à l'appreciation de chacun. Certes le mécanisme est similaire, mais le polymorphisme C++ est plus sur puisque justement c'est le compilo qui le gere...

  13. #13
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    Par défaut
    Tu peux me montrer Gandalfr comment tu declares ton tableau de fonctions ?

    Ca doit etre un truc dans le genre :

    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
     
    int func1(){
    ...
    }
    int func2(){
    ...
    }
    int func3(){
    ...
    }
     
    int main(){
    void tabFunc[] = {func1, func2, func3};
    ...
    }
    non ? Mais je ne suis pas sur de la syntaxe exactem et du void....
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    en fait tableau de fonction c'est un raccourci, c'est en fait un tableau de pointeurs de fonctions...

    le plus simple c'est de definir le pointeur de fonction, puis le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef short (*TreatementFunctionPtr)(struct sVariant*);
     
    TreatementFunctionPtr funcTab[] = {func1, func2, ... };

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Gandalf
    après, faut il un switch ?
    Mon esprit de contradiction dirait non... ....pas obligatoirement.

    Certes le switch n'est pas une mauvaise solution, mais on peut aussi faire des fonctions pour chaque cas, puis construire un tableau de fonctions (appelons le funcTab) de sorte que funcTab[i] pointe sur la fonction qui traite le cas où type vaut i et le switch devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (funcTab[titi.type])(titi);
    et on a reconstruit quelque chose qui ressemble ( de loin certes) au polymorphisme...

    C'est une solution, qui, si elle est elegante, ne manquera pas de destabiliser nombre de relcteur du code, donc si on la chosit il faudra documenter le code de facon a etre sur d'etre compris...
    Personelement je prefere le switch aux pointeurs de fonction car bien que j'admette volontiers que la solution par pointeur de fonction est plus elegante, la perte de lisibilite et les probleme de maintenance qu'elle engendre (ainsi que la plus grande complexite, tout au moins par un debutant peu familiarise avec les pointeurs de fonction) sont trop handicapants par rapport aux gains apportes.

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    gl > je comprend ton point de vue...

    Je suis tout a fait d'accord sur le coté deconcertant de la chose surtout pour un débutant, ce point est clair et ne peut etre contredit. J'avais d'ailleurs - dès la proposition de la solution - indiqué la necessité de documenter la chose.

    pour la maintenance et la lisibilité permet-moi de ne pas etre d'accord avec toi, je m'explique. Tant que le nombre de switch est faible (disons jusqu'a une dizaine environ) tu as absolument raison. Par contre quand le nombre de switch augmente, la solution du tableau de pointeur de fonction est - à mon avis - plus pertinante, plus efficace, tant en performance qu'en lisibilité et donc en maintenance.

    Lorsque la complexité du probleme augmente, utiliser des tableaux plutot que des switch imbriqués me semble également préférable.

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Gandalf
    Lorsque la complexité du probleme augmente, utiliser des tableaux plutot que des switch imbriqués me semble également préférable.
    Tout a fait d'accord avec toi. Je me placait dans le contexte du probleme initial ou a priori un seul switch (avec je pense guere plus de 4-5 case) suffit.

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

Discussions similaires

  1. question sur les pointeurs dans les structures!
    Par bilal_sayed1 dans le forum Débuter
    Réponses: 1
    Dernier message: 19/02/2010, 07h33
  2. les pointeurs et les structures
    Par gss3000 dans le forum C++
    Réponses: 6
    Dernier message: 08/02/2010, 12h52
  3. Problème avec les pointeurs et les structures
    Par Suefou dans le forum Débuter
    Réponses: 3
    Dernier message: 27/11/2009, 19h07
  4. Réponses: 4
    Dernier message: 23/12/2008, 10h32
  5. Les pointeurs et les complexes sous C++
    Par hicham.jakjoud dans le forum C++
    Réponses: 12
    Dernier message: 26/10/2006, 19h39

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