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 :

recuperer le type du parametre (void*)


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut recuperer le type du parametre (void*)
    Salutous

    Voila j'ai une fonction qui recupere un pointeur void*.
    Et je voudrai connaitre le type du pointeur car j'ai deux fonctions qui font la meme chose avec une seule ligne qui change suivant le parametre.

    En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int calcul(long* nb);
    int calcul2(float* nb);
    // Et je voudrai
    int calcul_tout(void* nb)
    {
    /*code*/
    // quelque chose comme:
    if(type(nb) == long)
      //code
    else if(type(nb) == float)
      // code
    /*code*/
    }
    Je sais que c'est possible mais j'arrive pas a retrouver le nom de la fonction sur Internet.
    Si quelqu'un la connait

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Tu ne peux pas faire cela en C.
    En C++ avec la RTTI activée, peut-être, mais ça m'étonnerait.
    En C++, tu peux sans doute faire un truc pratiquement équivalent avec les templates.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Salut,
    Tu es sur??
    Enfin il me semble que c'est possible en C.
    Je suis en train de chercher sur le Net...

    Enfin serieux je crois l'avoir deja vu.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par kacedda
    Salut,
    Tu es sur??
    Enfin il me semble que c'est possible en C.
    Je suis en train de chercher sur le Net...

    Enfin serieux je crois l'avoir deja vu.
    Non, ce n'est pas possible en C. Une fois que tu as un pointeur void C, si tu ne sais pas ce que c'est, il est impossible de le découvrir.

    Ca pourrait être un pointeur vers un entier, un flottant, une structure, un bout de code windows super secret, la lettre d'amour que t'as écrit l'autre soir...

    Fais confiance, la seule solution est de faire une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int calcul_tout(void* nb, int type)
    Jc

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par kacedda
    Enfin il me semble que c'est possible en C.
    bien sur tout est possible !

    En pseudo code :
    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
    enum type
    {
      LONG,
      FLOAT
    }
     
    struct
    {
      enum type t;
      void *nb;
    } param;
     
    switch (param->t == LONG)
    {
      case LONG:
      break;
      case FLOAT:
      break;
    }

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Oui , j'avais pense a cette solution(enfin dans le meme genre)
    mais sinon je persiste je continue de chercher.

    Merci pour l'astuce gege2061.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Bon apparement j'ai halluciner . alala j'y croyai vraiment mais apparement rien de rien ca a jamais exister
    Tant pis je vais voir ce que je peut faire autrement.
    Ya des jours comme ca

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 101
    Points
    101
    Par défaut
    Tu as ça en C++ ou tu peux surcharger les fonctions...

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Peut-être pensais-tu aux VARIANT ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    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 Re: recuperer le type du parametre (void*)
    Citation Envoyé par kacedda
    Voila j'ai une fonction qui recupere un pointeur void*.
    Et je voudrai connaitre le type du pointeur
    Il n'y a pas de moyens automatiques. C'est une question de spécification.

    C'est toi qui dois savoir ce que tu as passé. Si il peut y avoir plusieurs types, il faut organiser les données en une structure contenant un 'selecteur' et une union sur les différents types supportés.
    car j'ai deux fonctions qui font la meme chose avec une seule ligne qui change suivant le parametre.

    En gros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int calcul(long* nb);
    int calcul2(float* nb);
    // Et je voudrai
    int calcul_tout(void* nb)
    {
    /*code*/
    // quelque chose comme:
    if(type(nb) == long)
      //code
    else if(type(nb) == float)
      // code
    /*code*/
    }
    Il n'y a pas de constante 'type' en C. mais tu peux en céer une et la passer en parametre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    enum TYP
    {
       TYP_INT,
       TYP_LONG,
       TYP_FLOAT,
       TYP_DOUBLE,
       TYP_nb
    };
    ensuite tu fais le switch qui va bien...

    Mais l'expérience montre qu'il vaut mieux n fonctions séparées (quitte à factoriser le code commun)...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Soir a tous,

    Bon ben merci pour les infos, je me suis obstiner pour rien apparement mais bon c'est pas grave je suis comme ca lol.

    Sinon ou j'en suis: j'ai essayer, le plus simple c'est que je mette le code:
    Pour le moment j'ai appliquer la methode des donnees separes car j'ai pas reussi avec le void*.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct {
    	int* *tab;
    	int nb_rows;
    	int nb_cols;
    }tableau_int;
     
    typedef struct {
    	float* *tab;
    	int nb_rows;
    	int nb_cols;
    }tableau_float;
    Donc ceci est le code "facile", une fonction pour chaque type de donnees.

    Ce que j'ai essayer(mais pas reussi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Structure
    #define TYPE_INT  1
    #define TYPE_FLOAT 2
     
    typedef struct {
    	void* *tab;
    	int nb_rows;
    	int nb_cols;
    	int type;
    }tableau;
    Fonction initialiser
    Les erreurs et warnings retourne a la compilation sont en commentaire dans le code
    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
     
    int init_test(tableau *tab, int type, int nb_rows, int nb_cols, char* val)
    {
    	int i,j;
    	char* end;
     
    	if(type == 1)
    	{
    		//(*tab).tab = (int**)malloc(sizeof(int*)*nb_rows); // Erreur :attention : affectation d'un type pointeur incompatible
    		(*tab).tab = (void**)malloc(sizeof(int*)*nb_rows); // Erreur : pas d'erreur ni de warning
    		for&#40;i=0;i<nb_rows;i++&#41; &#123;
    			&#40;*tab&#41;.tab&#91;i&#93; = &#40;int*&#41;malloc&#40;sizeof&#40;int&#41;*nb_cols&#41;; // Pas d'erreur ici le cast en int marche bizarre non? alors que le precedent marche pas
    			for&#40;j=0;j<nb_cols;j++&#41;
    				//&#40;*tab&#41;.tab&#91;i&#93;&#91;j&#93; = strtol&#40;val,&end,10&#41;;
    				// Erreur &#58; attention &#58; dereferencing `void *' pointer
    				// error&#58; invalid use of void expression
    				&#40;*tab&#41;.tab&#91;i&#93;&#91;j&#93; = &#40;int&#41;strtol&#40;val,&end,10&#41;;
    				// Meme erreur que precedent
    		&#125;
    	&#125;
    	else
    	&#123;
    		// Les erreurs sont identiques que pour le int
    		&#40;*tab&#41;.tab = &#40;int**&#41;malloc&#40;sizeof&#40;int*&#41;*nb_rows&#41;;
    		for&#40;i=0;i<nb_rows;i++&#41; &#123;
    			&#40;*tab&#41;.tab&#91;i&#93; = &#40;int*&#41;malloc&#40;sizeof&#40;int&#41;*nb_cols&#41;;
    			for&#40;j=0;j<nb_cols;j++&#41;
    				&#40;*tab&#41;.tab&#91;i&#93;&#91;j&#93; = &#40;float&#41;strtod&#40;val,&end&#41;;
    		&#125;
    	&#125;
     
    	return 1;
    &#125;
    Donc du coup j'ai arreter et la je code en doublant mes fonctions.

    Voila voila
    A demain!

    PS:fearyourself : je vien juste de voir ton message dsl

    [Edit: Reedite 31/06 18:30]

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Oups!
    Au fait TrapD:
    non non je ne pensai pas au VARIANT (je connai) ni au surcharge, je pensai vraiment que c'etait possible

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Generic Values - A polymorphic type that can hold values of any other type.

  14. #14
    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 gege2061
    Generic Values - A polymorphic type that can hold values of any other type.
    http://emmanuel-delahaye.developpez.com/clib.htm
    Module OBJ
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    typeid cela n'existe pas dans le standard C++ ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En C++ avec la RTTI d'activée, oui, mais je crois bien que ça ne marche que pour les objets : Je ne sais pas si ça marche pour les types simples...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2006, 18h17
  2. Recuperer le type et la taille d'un champ
    Par bassim dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/11/2005, 21h50
  3. tagVARIANT ou recuperer un type VT_ARRAY | VT_R8
    Par barthelv dans le forum MFC
    Réponses: 2
    Dernier message: 29/08/2005, 17h40
  4. Réponses: 9
    Dernier message: 22/07/2005, 17h10
  5. recuperer le type
    Par Fry dans le forum C++
    Réponses: 6
    Dernier message: 04/11/2004, 14h45

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