Ca ne marche pas comme ça. C++ est une langage typé statiquement, quoique tu fasses tous les types que tu utilises devront être connus à la compilation. Ce que tu veux faire ici c'est la caractéristique d'un langage interprété.
Version imprimable
Ca ne marche pas comme ça. C++ est une langage typé statiquement, quoique tu fasses tous les types que tu utilises devront être connus à la compilation. Ce que tu veux faire ici c'est la caractéristique d'un langage interprété.
Alors j'aurai bien aimé coder dans un langage interprété alors ! :lol:
Du coup il faut que je me demerde pour comprendre les conteneurs à plusieurs types, comme je disais au départ, de la grosse bidouille en quelques sortes ... 8O
tu peux utiliser boost::map je crois.
tu fais correspondre "int" à int, et ainsi de suite....
ouais mais map, c'est d'un type à un autre ..
par exemple :
std::map<std::string,int> m;
mais mon m ne sera jamais un type ... ca reste une simple variable (de type int ici)
boost::map ? Jamais entendu parler. Et quand à std::map, ça sert à associer des clés à des valeurs. Tu ne pourras jamais en C++ stocker un "type", à part en méta-programmation.
Quant à savoir s'il faut que tu changes de langage, ou que tu interface ton programme C++ avec un langage interprété, ça dépend du rôle du programme.
Ton maître de stage ne peut-il pas t'orienter clairement pour ce problème ?
Mon maître de stage est parti en vacances hier, il faut que je me débrouille tout seul maintenant quant aux décisions à prendre. (pendant 2 semaines)
Qu'est-ce que tu entends par interfacer mon programme ?
Reprenons le problème à la base :
Tu as un nombre fini de variables à retranscrire respectivement chacune de chaîne de caractère à leur type statique en C++.
Sachant de plus que le type est donné dans le message pour chaque variable.
Le but étant d'appeler une fonction en passant les variables dans leurs types respectifs.
Est-ce bien ça? Si c'est le cas, on peut peut-être entrevoir une solution.
Oui je pense que tu as bien compris, j'ai le nom de ma fonction, le type des parametres et les valeurs que doivent prendre les parametres dans des chaines string. J'ai un nombre limité de parametres(peut varier d'une fonction à l'autre mais si ca peut marcher pour un nombre fixe c'est deja pa mal, je teste avec 4 parametres en ce moment).
Tu penses avoir une solution ?
Alors tout d'abord, il faut trouver un moyen d'associer à des std::string n'importe quelle fonction de n'importe quel prototype ...
Ensuite, on pourrait en fait associer à cette std::string une structure décrivant en fait la fonction et permettant de la manipuler plus flexiblement, en ajoutant un niveau d'abstraction entre ta fonction et ta réception de messages.
Cela permettrait une manip simple.
Oui mais ta solution nécessite un listing de toutes les fonctions existantes, n'est-ce pas ? Enfin, une structure pour chaque fonction que je veux appeler?
Je ne connais pas à l'avance ces fonctions que je suis censé appeler, je ne connais pas leur nombre non plus. Elles ne sont pas encore écrites, un collègue va s'en occuper un jour ........
Je peux me tromper, mais à mon avis ce que tu cherches à faire est tout simplement impossible à réaliser en C++. Appeler une fonction dont on ne connait même pas le prototype, je ne vois pas comment ce serait possible.
Mais tu y as obligatoirement accès à ces fonctions non?
Donc on peut bien faire une map pour gérer tout ça non?
Le truc c'est qu'il faut disposer d'une map, et en plus faire quelque chose du genre :
#define REGISTER_FUNC(RTYPE, ARGLIST, NAME) \
// on insère la fonction dans la map et on écrit RTYPE NAME(ARGLIST)
Enfin je partirais sur quelque chose du genre... Une espèce de réflexion "semi-automatisée" des fonctions.
Par contre dans mon précédent message, je ne dis pas comment faire pour que la map stocke des fonctions dont le prototype est entièrement variable ... Et là est le problème... Boost.Any combiné à autre chose peut-être... Je ne sais pas vraiment.
(Laurent > il faudrait faire un sujet de FAQ traitant de ce problème, qui est souvent soulevé ici, et que chacun a rencontré je pense dans des projets)
Oui je pensais vraiment que ca serait plus simple ;)
Merci en tout cas de vous pencher sur le problème!
Laurent : mon programme ne connait pas le prototype à l'avance, en effet, mais le message recu est correctement formaté, donc on peut connaitre le prototype, soit en lisant le message, soit en allant chercher la fonction par son adresse.(par mon getProcAddress qui fonctionne bien qui me récupère l'adresse de la fonction à partir de son nom)
Ca ne suffit pas?
Alp : Je vais regarder ce que tu m'as conseillé, voir si une idée me vient ...
merci merci
Je parlais de connaître le prototype à la compilation. Car à un moment où un autre tu devras faire un appel de fonction, et sans le prototype de celle-ci... A part pousser les paramètres sur la pile directement en ASM, je vois pas trop comment on peut faire.Citation:
Laurent : mon programme ne connait pas le prototype à l'avance, en effet, mais le message recu est correctement formaté, donc on peut connaitre le prototype, soit en lisant le message, soit en allant chercher la fonction par son adresse.(par mon getProcAddress qui fonctionne bien qui me récupère l'adresse de la fonction à partir de son nom)
Ca ne suffit pas?
Une question de FAQ sur "comment définir un type à l'exécution" ? :aie:Citation:
(Laurent > il faudrait faire un sujet de FAQ traitant de ce problème, qui est souvent soulevé ici, et que chacun a rencontré je pense dans des projets)
Laurent veut dire qu'à un moment il va falloir écrire
ouCode:f(a,b,c,d);
Et le problème c'est justement écrire a,b,c,d, de savoir qu'il y a 4 arguments et de les passer à la fonction ...Code:ta_map["f"](a,b,c,d)
Donc ce qui a l'air faisable c'est de regrouper par prototypes tes fonctions... Peut-être.
Laurent > Non, mais plutôt genre "Pourquoi on ne peut pas?" et orienter sur des voies qui s'en rapprochent. Enfin c'était juste une idée :roll:
C'est une question qui revient assez souvent, donc effectivement un petit topo dans la FAQ ne ferait pas de mal ;)Citation:
Envoyé par Alp
Tu t'en occupes ? Je ne sais pas comment faire ni je pense avoir les droits.
C'est bon on s'en charge, je l'ai poussé dans notre liste des Q/R à rédiger.Citation:
Envoyé par Alp
Par contre lorsque tu veux proposer une contribution il n'y a pas de souci : on a maintenant un sous-forum Contribuez, dans lequel tu peux poster une Q/R pour la FAQ, un code source, un tutoriel, des corrections, etc.