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 :

Cr�ation de variable avec un type variable !


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Invit�
    Invit�(e)
    Par d�faut Cr�ation de variable avec un type variable !
    Bonjour � tous,

    Je cherche � �crire une fonction qui prenne en argument le string 'type', qui doit �tre choisi dans la liste : char, short int, int, float etc... (vous m'avez compris), et qui d�clare une variable 'x' du type choisi.
    Simplissime !?
    Et pourtant je n'y arrives absolument pas !


    Enfin ce n'est pas exacte, un truc de ce style peut marcher :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ( "char".compare(type) == 0) 
    {
     char x; else if ( "short int".compare(type) ==0 )
                      { 
                      short int x; else if (blablabla...
                      }
    }
    Mais je n'insiste pas, vous avez compris : c'est lourd et en plus �a compile tr�s difficilement ( i.e : que si 'x' est d�clar� au pr�alable, quitte � la re-d�clar�e, parce que sinon la construction conditionnelle ne permet pas � 'x' d'�tre d�clar�e � coup sur... ou en tout cas c'est ce que pense le compilateur )


    J'ai cherch� partout de l'aide sur le sujet, genre comment d�clarer les variables, typer les variables etc etc, mais toutes les aides que je trouve se r�f�rent � des trucs bateaux du style "int myfirstvariable" ou autre...


    Si quelqu'un � une solution toute faite � me mettre sous le nez (m�me un bout de tuto ou un truc qui m'avance), ou alors une petite id�e je suis preneur.


    Merci beaucoup d'avance,
    Cordialement,
    Mark.


    PS : ci-dessous l'ersatz de code que j'ai d�j� �crit ; J'ai marqu� et mis en commentaire le morceau qui est �videmment faux, mais il montre bien ce que je cherches � faire au moins ... vous voyez non ?

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      string type;
      string names[] = {"char", "short int", "int", "float", "double"};
     
      printf("Chose type of stack among : char, short int, int, float, double\n");
      getline( cin, type);
     
      for (int i=0; i < 5; i++)
      {
        if ( names[i].compare( type ) == 0 )
    	{
    	  //names[i] s;                                   <-- Le problème est ici    
    	}
      }

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par d�faut
    Ce genre de chose peut �tre fait a l'aide de l'a m�taprogramation. va faire un tour ici : http://loulou.developpez.com/tutoriels/cpp/metaprog/ .

    Cela dit, je ne suis pas convaincu que tu attaques ton probl�me de mani�re pertinente.

  3. #3
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    template tout court ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre �m�rite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par d�faut
    Si tu n'as que des types aussi simples que �a, tu peux utiliser une union.

    Sinon, si t'as besoin de types non POD (genre std::string), tu peux regarder Boost.Variant : http://www.boost.org/doc/libs/1_36_0...l/variant.html

  5. #5
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par d�faut
    Citation Envoy� par Marcool Voir le message
    Je cherche � �crire une fonction qui prenne en argument le string 'type',
    Comme dit plus haut, c'est le principe du template, mais ...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
      printf("Chose type of stack among : char, short int, int, float, double\n");
      getline( cin, type);
    C'est ce que je craignais.

    Tu veux faire cela au runtime. Or, ce que tu cherches � faire est une fonction du compilateur ! Tu ne peux donc pas faire appel � ses services apr�s la compilation, une fois le programme lanc�, ce qui est normal.

    De l�, tu as trois solutions :

    • Tu utilises un langage interpr�t�. Ils proposent pratiquement tous une fonction eval bien pratique (Perl, Shell, et m�me le BASIC M$ de 1986 :-).
    • Tu �cris une seule fois un template pour ta fonction, et ensuite, comme ta liste propose une nombre d'�l�ments fini, tu fais une seule fois un switch en �num�rant ces m�mes �l�ments
    • Tu regardes du c�t� du RTTI, mais �a ne r�soudra pas tous tes probl�mes.

  6. #6
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    La solution la plus "simple" pour le PO me semble boost::variant... Mais il faut r�cup�rer boost, ou du moins variant et ses d�pendances.

    Mais ce que tu veux faire est en g�n�ral tr�s mal vu ... Tu peux nous expliquer dans quel cadre tu as besoin d'une telle fonctionnalit� pour ton programme ?

  7. #7
    Invit�
    Invit�(e)
    Par d�faut
    Tout d'abord merci � tous pour vos r�ponses avis�es. Pour vous re r�pondre � pr�sent, dans un d�sordre total :

    Mais ce que tu veux faire est en g�n�ral tr�s mal vu ... Tu peux nous expliquer dans quel cadre tu as besoin d'une telle fonctionnalit� pour ton programme ?
    Pourquoi est-ce que ce serrait mal vu ?! J'ai du mal � voir ce qui peut te faire r�agir comme �a la dedans Alp ? Si vous voulez vraiment savoir, j'�tais parti pour faire un proof of concept du buffer overrun classique, genre :

    "Choisissez un type de variable ..."
    'char'
    "Entrez une valeur num�rique ..."
    '657352719373947'
    "Voici la variable stock�e dans la variable :
    '-543'
    "Buffer overrun d�tect� !"

    C'est vrai qu'on peut faire �a en d�clarant directement une variable et tout et tout, mais je suis un fana d'interactivit�, et j'avais envi que le truc soit portable... En fait je me suis surtout mont� � la t�te le fait de ne pas pouvoir choisir apr�s l'ex�cution le type de la variable !




    Tu utilises un langage interpr�t�. Ils proposent pratiquement tous une fonction eval bien pratique (Perl, Shell, et m�me le BASIC M$ de 1986 :-).
    J'�tais � peu pr�s persuad� que quelqu'un me trouverait une solution dans un autre langage, c'est vrai que je pourrais, mais je suis t�tu et j'ai voulu finir en C++ ce que j'avais commenc� en C++! Mais je vais regarder du coup (peut-�tre pas dans le BASIC quand m�me, bien que j'en suis persuad� �a doit avoir ses avantages, on se comprend$ :-), merci l� encore.



    Tu �cris une seule fois un template pour ta fonction, et ensuite, comme ta liste propose une nombre d'�l�ments fini, tu fais une seule fois un switch en �num�rant ces m�mes �l�ments
    Eh... �a peut vraiment marcher �a ? (oui oui je vais essayer je sais :-) Ah ouai en fait �a marche (je pensais que �a posait des probl�mes de substitution dans le template mais en fait non c'est logique et simple!) Je vois maintenant. �a revient quand m�me � utiliser la lourdingue construction conditionnelle d�crite dans mon premier post (ok le switch rend �a bien plus propre), mais c'est fonctionnel au moins ! Merci beaucoup Davidbrcz et Obsidian !




    Tu regardes du c�t� du RTTI, mais �a ne r�soudra pas tous tes probl�mes.
    D'apr�s ce que je lis l�, le C++ n'est pas sens� comporter de RTTI... ou en tout cas �a sera du bidouillage non?




    La solution la plus "simple" pour le PO me semble boost::variant...
    Eh ouai... j'avoue que je ne comprends pas trop ce que je suis sens� faire avec variant. Mais il se peut que je n'ai pas bien saisi quel est le r�le de cette fonction... Il me semble qu'elle sert � cr�er une union un peu sp�ciale, qui accepte de stocker des types non POD... Non? Si c'est le cas, puisque mes types sont tous POD de toute fa�on si �a marche avec union (pas encore test�...) alors j'ai pas besoin de variant, si?



    Si tu n'as que des types aussi simples que �a, tu peux utiliser une union.
    Ouai je n'ai que des types simples... et oui une union me semble �tre une bonne id�e. �a ne me permettra pas de me d�barrasser du switch apr�s mais au moins j'ai pas besoin de cr�er un template avant, une simple union suffit.
    Sauf que comme le but est de faire d�border la variable... et qu'une union se voit r�server l'espace du type le plus gros qu'on pourrait lui demander de contenir, je ne la ferai d�border que quand quelque chose de plus gros qu'un double sera saisi... ce qui n'est pas mon but.
    Dommage, l'id�e �tait de loin la plus propre !



    Cela dit, je ne suis pas convaincu que tu attaques ton probl�me de mani�re pertinente.
    Eh... la d�finition de pertinente est quelque chose de vraiment tr�s subjectif, et je t'en prie deadalnix si tu as plus "pertinent" � proposer comme approche je suis preneur.




    Mot de la fin : merci beaucoup � tous d'avoir pris le temps de me r�pondre. Je pense avoir trouv� comment je vais faire �a (template puis switch)... je posterai peut-�tre ce que je fais finalement plus tard dans la soir�e pour r�f�rence.

    Cordialement,
    Mark.

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par d�faut
    Citation Envoy� par Marcool Voir le message
    Eh... la d�finition de pertinente est quelque chose de vraiment tr�s subjectif, et je t'en prie deadalnix si tu as plus "pertinent" � proposer comme approche je suis preneur.
    La ligne au dessus.

  9. #9
    Invit�
    Invit�(e)
    Par d�faut
    Ok deadalnix...
    sauf que la page que toi m�me me dit d'aller voir contient la raison qui fait que cette approche n'est pas pour moi :

    Un autre inconv�nient est qu'ici tout ce que nous allons �crire devra �tre connu du compilateur : certaines donn�es que nous allons manipuler ne pourrons assur�ment pas �tre entr�es par l'utilisateur lors de l'execution.
    ...or je vise l'interactivit� justement.

    Si tout devait �tre su au moment de la compilation je ferais simplement :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <iostream>
    using namespace std
     
    char x
    int main()
    {
    cout << "Entrez une valeur numérique svp." << endl;
    cin >> x;
    cout << "La valeur enregistrée est : " << x << endl;
    return 0;
    }
    et si la valeur entr�e est sup�rieure � 255 (on suppose le char non sign�) alors on v�ra de suite le buffer overrun... mais ce n'est pas �a que je veux faire.

    Merci quand m�me ; je suis s�r que la m�taprogrammation pourra m'�tre utile � une autre occasion.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utilisation de Ctype avec un type variable
    Par Tommy57 dans le forum Windows Forms
    R�ponses: 5
    Dernier message: 09/07/2013, 09h41
  2. Acceder � une variable avec une autre variable
    Par kisscoool dans le forum ActionScript 3
    R�ponses: 4
    Dernier message: 21/05/2008, 12h52
  3. types variables avec typedef
    Par Haenou dans le forum C
    R�ponses: 4
    Dernier message: 16/04/2008, 09h07
  4. cast avec un type variable
    Par Axwell dans le forum C++
    R�ponses: 2
    Dernier message: 13/11/2007, 10h06
  5. variable avec un type non d�fini
    Par gign2585 dans le forum Windows Forms
    R�ponses: 4
    Dernier message: 24/05/2007, 18h10

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