Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
924 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Y'aurait t'y moyen de déterminer le type d'une variable?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Y'aurait t'y moyen de déterminer le type d'une variable?

n°217235
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 19-09-2002 à 15:56:38  profilanswer
 

hein hein:D?

mood
Publicité
Posté le 19-09-2002 à 15:56:38  profilanswer
 

n°217241
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-09-2002 à 16:01:32  profilanswer
 

oui : si y a "int" devant sa déclaration c'est un entier, etc...


Message édité par antp le 19-09-2002 à 16:01:41

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°217242
Carbon_14
Posté le 19-09-2002 à 16:01:33  profilanswer
 

La question est bien : quand on voit une variable se promener dans la rue, comment reconnait-on son type ? C'est celui qui lui tient la main, non ? :lol:  
 
Up déguisé...

n°217304
darkoli
Le Petit Dinosaure Bleu
Posté le 19-09-2002 à 17:12:50  profilanswer
 

Ben si tu as

Code :
  1. int toto(void* baba)
  2. {
  3. [...]
  4. }


Ben dans la fonction il t'es impossible de connaître le type de baba, donc tu l'as dans le BABA :lol:


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°217315
cherchepa
Cherche pas...
Posté le 19-09-2002 à 17:26:55  profilanswer
 

ca pu....


---------------
bisous a machistador!!!
n°217316
LetoII
Le dormeur doit se réveiller
Posté le 19-09-2002 à 17:27:32  profilanswer
 

Y a aps une bibliothéque qui le fait?


---------------
Le Tyran
n°217317
kadreg
profil: Utilisateur
Posté le 19-09-2002 à 17:30:20  profilanswer
 

le RTTI est ton amis


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°217321
wpk
Posté le 19-09-2002 à 17:38:38  profilanswer
 

kadreg a écrit a écrit :

le RTTI est ton amis




 
ouais, mais :non: , c'est pas objet . Le type d'un objet ne devrait etre connu que par le compilo. Le code du type
if (typeid(maVariable).name() == "typeDeMaVariable" )
{
...
}
 
c'est sale et porc.

n°217326
youdontcar​e
Posté le 19-09-2002 à 17:43:56  profilanswer
 

wpk a écrit a écrit :

c'est sale et porc.


:heink: il y a théorie et pratique ... en particulier isKindOf() qui est souvent utile.

n°217331
kadreg
profil: Utilisateur
Posté le 19-09-2002 à 17:48:26  profilanswer
 

youdontcare a écrit a écrit :

:heink: il y a théorie et pratique ... en particulier isKindOf() qui est souvent utile.




 
Utile quand on a pas fait ses surcharges de méthodes correctement surtout.
 
C++, le langage qui permet de rattrapper ses conneries avec d'autres conneries


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
mood
Publicité
Posté le 19-09-2002 à 17:48:26  profilanswer
 

n°217332
youdontcar​e
Posté le 19-09-2002 à 17:50:45  profilanswer
 

kadreg a écrit a écrit :

Utile quand on a pas fait ses surcharges de méthodes correctement surtout.


hein ?

n°217335
wpk
Posté le 19-09-2002 à 17:54:16  profilanswer
 

kadreg a écrit a écrit :

 
 
Utile quand on a pas fait ses surcharges de méthodes correctement surtout.
 
C++, le langage qui permet de rattrapper ses conneries avec d'autres conneries




 :jap:

n°217408
gatorette
Posté le 19-09-2002 à 20:35:24  profilanswer
 

Une idée aussi pour récuperer le type d'un objet c'est d'utiliser les exceptions.
 
Exemple :

Code :
  1. try
  2. {
  3. throw( UnknownObject )
  4. }
  5. catch( int Integer )
  6. {
  7. DoSomethingWithTheInteger( Integer );
  8. }
  9. catch( AKnownObject Object )
  10. {
  11. Object.AtLastICanUseThisMethod();
  12. }


 
En fait, ça ressemble à un switch sur le type d'un objet.
 
Edit: Suppression d'une accolade en trop


Message édité par gatorette le 19-09-2002 à 20:35:51

---------------
each day I don't die is cheating
n°217463
Ace17
Posté le 19-09-2002 à 22:21:45  profilanswer
 

Mais pour quoi faire?

n°217470
ITM
Avatar peint à la main
Posté le 19-09-2002 à 22:28:14  profilanswer
 

Ace17 a écrit a écrit :

Mais pour quoi faire?




Oui, il faut vraiment programmer comme un porc pour avoir besoin de savoir de quel type est une variable qui se promène dans son programme...


---------------
iteme.free.fr | Mon feedback
n°217500
whygee
Posté le 19-09-2002 à 23:26:54  profilanswer
 

ITM a écrit a écrit :

 
Oui, il faut vraiment programmer comme un porc pour avoir besoin de savoir de quel type est une variable qui se promène dans son programme...
 




 
C'est dans ces moments là qu'on se rend compte que VHDL, une fois qu'on a compris un peu le labyrinthe des spécifications, ça permet de faire des programmes beaucoup plus solides, super propres, avec un choix de styles de programmation bluffant et qui offre les avantages des "objets" sans les inconvénients.
 
OK ça sert à faire du HW, mais ya bien des gens qui ont fait un serveur web avec ;-)

n°217513
gatorette
Posté le 19-09-2002 à 23:40:25  profilanswer
 

J'en ai eu besoin lors du développement d'un outil pour "parser" du XML.
 
En effet, l'utilisateur définit plusieurs classes simples contenant des variables membres correspondants à ce qu'il souhaite lire. Ces classes possèdent toutes une méthode qui est appelée par mon parser.
 
Exemple de classe implémentée par l'utilisateur :

Code :
  1. class XMLOther : public XMLObjetct
  2. {
  3. public:
  4. int m_Temp;
  5. String m_String2;
  6. virtual void Parse( const XMLNode node, const XMLDoc doc )
  7. {
  8. XMLMember<>( &m_Temp, TEXT("temp" ), node, doc );
  9. XMLMember<>( &m_String2, TEXT("string" ), node, doc );
  10. }
  11. };
  12. class XMLMain : public XMLObject
  13. {
  14. public:
  15. String m_String;
  16. XMLOther m_OtherXML;
  17. std::vector<int> m_vIntegers;
  18. virtual void Parse( const XMLNode node, const XMLDoc doc )
  19. {
  20. XMLMember<>( &m_String, TEXT("string" ), node, doc );
  21. XMLMember<>( &m_OtherXML, TEXT("other" ), node, doc );
  22. XMLMember<int>( &m_vIntegers, TEXT("integer" ), node, doc );
  23. }
  24. };


 
Cette structure correspond au code xml suivant:

<main>
  <string>hello</string>
  <other>
    <temp>12</temp>
    <string>othertest</string>
  </other>
  <integer>45</integer>
  <integer>56</integer>
  <integer>12</integer>
</main>


 
Dans le cas d'une lecture, le parser lit un noeud (le XMLNode de la méthode parse) et appelle successivement tous les constructeurs de XMLMember. Dès qu'il en trouve un dont le deuxième paramètre (la chaîne) correspond au nom du noeud, il 'throw' la variable membre. Par exemple si le noeud analysé a comme nom "name", l'object m_Name sera "throwé".
 
Mon programme se retrouve donc avec un objet dont il ne sait rien et auquel il faut attribuer la valeur du noeud. Comme tous ces objets n'ont pas forcemment de méthodes permettant de les envoyer vers des string (du style operator<< ou operator>>), la méthode que j'ai choisi est de faire un catch par type que j'ai choisi.
 
Ca donne :

Code :
  1. try
  2. {
  3. Object->Parse( pChild, NULL );
  4. }
  5. catch( XMLObject *ChildObject )
  6. {
  7. ParseNode( pChild, ChildObject );
  8. }
  9. catch( String *ChildObject )
  10. {
  11. ChildObject->assign( (LPCTSTR)GetNodeContent( pChild ) );
  12. }
  13. catch( int *ChildObject )
  14. {
  15. StringStream ss;
  16. ss << (LPCTSTR)GetNodeContent( pChild );
  17. ss >> (*ChildObject);
  18. }


 
Cette méthode n'est peut être pas optimale, mais c'est la seule que j'ai trouvé qui permet de conserver un code simple pour l'utilisateur (juste une fonction "simple" à ajouter à sa structure) et qui permet de gérer des vectors ou des maps.
 
Voila, juste un exemple pour expliquer en quoi ça peut parfois être utile.


---------------
each day I don't die is cheating
n°217523
faenir
Posté le 19-09-2002 à 23:46:58  profilanswer
 

bah, et le dynamic_cast? (ou j'ai rien compris a la question)


---------------
Boulay officiel : asphro
n°217558
LeGreg
Posté le 20-09-2002 à 05:15:07  profilanswer
 

le rtti ce n'est pas toujours sale
en tout cas il y a des cas ou ca ne brise pas l'encapsulation
exemple: forme est une classe de base qui comprend les carres, les cercles et les rectangles, tu as une fonction s'applique a des formes et qui s'appelle 'drawOnlySquares', alors c'est pas con d'utiliser les RTTI pour faire ca.
 
evidemment c'est un peu avance et il y a surement d'autres moyens
moins propres de faire ca.
 
Pour info faenir, dynamic_cast et RTTI c'est la meme chose.
 
A+
LeGreg

n°217559
LeGreg
Posté le 20-09-2002 à 05:17:56  profilanswer
 

gatorette a écrit a écrit :

Une idée aussi pour récuperer le type d'un objet c'est d'utiliser les exceptions.
 
Exemple :

Code :
  1. try
  2. {
  3. throw( UnknownObject )
  4. }
  5. catch( int Integer )
  6. {
  7. DoSomethingWithTheInteger( Integer );
  8. }
  9. catch( AKnownObject Object )
  10. {
  11. Object.AtLastICanUseThisMethod();
  12. }


 
En fait, ça ressemble à un switch sur le type d'un objet.
 
Edit: Suppression d'une accolade en trop




 
les exceptions C++ utilisent une forme de RTTI deguisee, donc ce que tu fais c'est un peu lourd tout de meme.
 
LeGreg

n°217560
Musaran
Cerveaulté
Posté le 20-09-2002 à 06:09:00  profilanswer
 

Ceci n'existe pas:

Code :
  1. ??? a;
  2. typeof(a) b;

Et c'est bien dommage.
C'est fortement réclamé auprès du commité de standardisation, si j'ai bien compris.
 
Y'a aussi ça:

Code :
  1. if(dynamic_cast<int&>(a)==NULL) ...; //c'est pas un int-compatible

(mieux fait avec les exceptions comme montré)
 
Et puis ça:

Code :
  1. if(typeid(a)==typeid(int)) ...; //c'est un int


 
Voilà, c'est tout ce que j'en connaît.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°217583
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 20-09-2002 à 10:01:32  profilanswer
 

typeid c'est une fonction standard?

n°217584
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 20-09-2002 à 10:01:52  profilanswer
 

antp a écrit a écrit :

oui : si y a "int" devant sa déclaration c'est un entier, etc...




 
tu sors stp:sarcastic:.

n°217758
wpk
Posté le 20-09-2002 à 15:40:23  profilanswer
 

fodger a écrit a écrit :

typeid c'est une fonction standard?




 
c'est meme plus qu'une "fonction". C'est un operateur du langage qui te retourne une ref constante vers un objet de type type_info.

n°217759
kadreg
profil: Utilisateur
Posté le 20-09-2002 à 15:41:46  profilanswer
 

wpk a écrit a écrit :

 
C'est un operateur du langage  




 
On peut le surcharger ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°217919
fabsk
Posté le 20-09-2002 à 19:56:03  profilanswer
 

wpk a écrit a écrit :

 
 
ouais, mais :non: , c'est pas objet . Le type d'un objet ne devrait etre connu que par le compilo. Le code du type
if (typeid(maVariable).name() == "typeDeMaVariable" )
{
...
}
 
c'est sale et porc.




 
C'est surtout pas portable. Fait le avec un gcc pour voir.
 

Code :
  1. #include <iostream>
  2. class Toto{};
  3. int main()
  4. {
  5.   std::cout << typeid(Toto()).name() << std::endl;
  6.   return 0;
  7. }

 
 
Ce qui donne chez moi:
F4TotovE

n°217921
fabsk
Posté le 20-09-2002 à 19:58:25  profilanswer
 

whygee a écrit a écrit :

 
OK ça sert à faire du HW, mais ya bien des gens qui ont fait un serveur web avec ;-)




 
Bof, y a aussi un serveur web ecrit en postscript :-)
http://www.pugo.org:8080/

n°217923
fabsk
Posté le 20-09-2002 à 19:59:15  profilanswer
 

fodger a écrit a écrit :

typeid c'est une fonction standard?




 
Absolument. Et non on ne peut pas le surcharger.

n°217959
farib
Posté le 20-09-2002 à 22:08:36  profilanswer
 

fodger a écrit a écrit :

hein hein:D?




 
comment peut on avoir besoin de connaitre le type d'une variable ?

n°217972
bjone
Insert booze to continue
Posté le 20-09-2002 à 23:17:18  profilanswer
 

farib a écrit a écrit :

 
 
comment peut on avoir besoin de connaitre le type d'une variable ?




 
le seul cas ou je me sert de typeid, c'est dans une template de management de ressources, ou la template a....... plein d'utilisation, et dans les throw d'erreur de la template je mets le typeid.name() comme ça je sais dans quelle "instanciation" (ou c'est ça le bon terme ?) c'est parti en couille...

n°218028
Musaran
Cerveaulté
Posté le 21-09-2002 à 01:35:46  profilanswer
 

Citation :

On peut le surcharger ?

Bonjour les dégâts si c'était possible...
 

fabsk a écrit a écrit :

Ce qui donne chez moi:
F4TotovE


C'est le comportement que j'aurais attendu de 'raw_name()'
'name()' est censé donner qquechose de compréhensible pour les humains.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Y'aurait t'y moyen de déterminer le type d'une variable?

 

Sujets relatifs
[Tomcat] y'a moyen de sortir le traitement des jsp du bloc try catch ?[PHP + JS] Mettre une variable Javascript dans du code PHP...
[hs] qqun sait il comment rendre un type de fichier "caché"determiner les ligne visible ds un RichEdit
definir le type de fichier sous WindowsGLPong : un jeu multijoueur de type Pong... à tester !
[PHP] Un nom de variable variable ?Variable système et WSH...
[gethostname] determiner son IP[PostgreSQL] Nom de relation => type de relation
Plus de sujets relatifs à : Y'aurait t'y moyen de déterminer le type d'une variable?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR