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++

  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.

  10. #10
    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
    sauf que :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    template<class T> void traitex(T& x){
       truc;
       machin;
    }
    et :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    switch(type){
       case INTEGER:
          traitex<int>(x);
          break;
        case BLOP:
           traitex<blop>(x);
          ...
    }
    C++ est un langage typ�, tu y �chaperas pas.

  11. #11
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Avant de chercher comment le faire, il faudrait peut-�tre que tu d�finisses exactement ce que tu veux. Avec ce que tu as dis, tu peux aussi bien vouloir un interpr�teur C++ d�tectant toutes les comportements ind�finis que quelque chose de beaucoup plus simple. Suivant l'ampleur de ce que tu veux exactement, ce n'est pas les m�mes techniques � mettre en oeuvre.

    En passant, un overflow ce n'est pas un buffer overrun...

  12. #12
    Invit�
    Invit�(e)
    Par d�faut
    En passant, un overflow ce n'est pas un buffer overrun...
    Eh... il me semble que c'�tait synonyme au moins :

    In computer security and programming, a buffer overflow, or buffer overrun, is an anomalous condition where a process attempts to store data beyond the boundaries of a fixed-length buffer.
    cf http://en.wikipedia.org/wiki/Buffer_overflow

    (c'est m�me mieux que �a : la page pour Buffer_overrun redirige vers celle de Buffer_overflow)



    C++ est un langage typ�, tu y �chapperas pas.
    Ouai c'est vrai. Je me plie :-) Au moins j'ai appris �a "the hard way" et je ne l'oublierai pas !


    En tout cas j'ai pas mal appris gr�ce � vous tous, merci encore. Je pense qu'on peut en gros clore le topic...
    Bonne continuation.
    Mark.

  13. #13
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Tu n'as pas de buffer overflow ou overrun, tu as un overflow dans un calcul en entier.

  14. #14
    Invit�
    Invit�(e)
    Par d�faut
    Tu n'as pas de buffer overflow ou overrun, tu as un overflow dans un calcul en entier.
    Je ne vois pas o� est le calcul l� dedans (stocker donn�es dans un buffer, i.e variable, allou�e pr�c�demment puis recracher valeur...) et �a semble convenir parfaitement � la d�finition du buffer overrun mais si tu y tiens... on va appeler �a un overflow (litt�ralement c'est vrai que �a "d�borde" ang : overflow, je ne nie pas... donc pourquoi pas !)

    En g�n�ral je ne pinaille pas trop sur le vocabulaire ...

  15. #15
    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
    Citation Envoy� par Marcool Voir le message
    Je ne vois pas o� est le calcul l� dedans (stocker donn�es dans un buffer, i.e variable, allou�e pr�c�demment puis recracher valeur...) et �a semble convenir parfaitement � la d�finition du buffer overrun mais si tu y tiens... on va appeler �a un overflow (litt�ralement c'est vrai que �a "d�borde" ang : overflow, je ne nie pas... donc pourquoi pas !)

    En g�n�ral je ne pinaille pas trop sur le vocabulaire ...
    Tu ne pourras jamais savoir que tu as d�pass� la capacit� de ton entier, il faut agir au niveau du parseur, c'est ce que tu ne comprends pas.

    Le parseur il doit surement faire des calculs tout b�tes, sans tenir compte de la capacit� de repr�sentation.

  16. #16
    Invit�
    Invit�(e)
    Par d�faut
    Bon fondamentalement l� on est un peu hors sujet et c'est pas trop ce qui m'int�resse, mais pour ne pas laisser le d�bat ouvert :
    Dans mon id�e, quand on d�clare une variable, on lui donne un type ; au moment de l'ex�cution la machine r�servera donc une portion de m�moire de la taille d�termin�e par le type choisi, pour cette variable.
    Apr�s ce qu'on y met ou pas n'est pas tellement la question ici, mais l'overflow apparait lorsqu'on essai de mettre quelque chose de trop "gros" dans la variable, par rapport au type qu'on avait d�termin� pr�c�demment, par exemple, 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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    int x;
     
     
    cout << "Choisissez une valeur a stocker dans la variable svp" << endl;
    cin >> x;
    cout << "La variable contient : " << x << endl;
     
    return 0;
    }
    Donne ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ g++ -o exec ./temp.cpp 
     
    $ ./exec 
    Choisissez une valeur a stocker dans la variable svp
    7876
    La variable contient : 7876
     
    $ ./exec 
    Choisissez une valeur a stocker dans la variable svp
    45432222346
    La variable contient : -1073742504
    Que ce soit le parseur ou autre chose qui d�termine comment c'est fait ne m'importe pas vraiment. La raison pour laquelle j'ai ouvert ce topic c'est pour savoir si au moment de l'ex�cution du programme on pouvait choisir le type d'une variable.
    On m'a r�pondu : non, la variable est typ�e par le compilateur. Fin du d�bat. Merci quand m�me de ton apport HanLee.
    Derni�re modification par Invit� ; 27/08/2008 � 21h52.

  17. #17
    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
    Citation Envoy� par Marcool Voir le message
    Bon fondamentalement l� on est un peu hors sujet et c'est pas trop ce qui m'int�resse, mais pour ne pas laisser le d�bat ouvert :
    Dans mon id�e, quand on d�clare une variable, on lui donne un type ; au moment de l'ex�cution la machine r�servera donc une portion de m�moire de la taille d�termin�e par le type choisi, pour cette variable.
    Apr�s ce qu'on y met ou pas n'est pas tellement la question ici, mais l'overflow apparait lorsqu'on essai de mettre quelque chose de trop "gros" dans la variable, par rapport au type qu'on avait d�termin� pr�c�demment, par exemple, 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
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    int x;
     
     
    cout << "Choisissez une valeur a stocker dans la variable svp" << endl;
    cin >> x;
    cout << "La variable contient : " << x << endl;
     
    return 0;
    }
    Donne ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ g++ -o exec ./temp.cpp 
     
    $ ./exec 
    Choisissez une valeur a stocker dans la variable svp
    7876
    La variable contient : 7876
     
    $ ./exec 
    Choisissez une valeur a stocker dans la variable svp
    45432222346
    La variable contient : -1073742504
    Que ce soit le parseur ou autre chose qui d�termine comment c'est fait ne m'importe pas vraiment. La raison pour laquelle j'ai ouvert ce topic c'est pour savoir si au moment de l'ex�cution du programme on pouvait choisir le type d'une variable.
    On m'a r�pondu : non, la variable est typ�e par le compilateur. Fin du d�bat. Merci quand m�me de ton apport HanLee.
    Oui mais on t'as dit qu'il y avait une certaine flexibilit�e apport�e avec les unions, ou les variants, qui te permettent de typer dynamiquement ta variable dans un ensemble fini.
    Comme du polymorphisme.

    Si tu agis au niveau du parseur, tu peux d�tecter l'overflow, en comptant le nombre de caract�res, puis en analysant plus finement.

  18. #18
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Ce que tu veux, en fait, c'est un type entier avec une taille dynamique.
    C'est vraiment un cas particulier... Y'a plein de biblioth�ques qui font �a.

+ 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