2011-05-19 4 views
1

Je veux savoir s'il existe une fonction « évaluer » en C++ comme celui Matlab.« Évaluer la fonction » en C++

Dans la pratique, je besoin d'une fonction qui peut interpréter une chaîne comme une ligne de commande.

Merci pour les réponses.

+2

Salut, Cavs85! Bienvenue dans Stack Overflow. Il serait utile d'inclure un lien vers la documentation de la fonction 'evaluate' de Matlab. Comme je ne sais pas ce que ça fait, je ne peux pas vous dire quelle est la fonction C++. –

+0

[ 'eval (expression)'] (http://www.mathworks.com/help/techdoc/ref/eval.html) "exécute * expression *, une chaîne contenant toute expression MATLAB valide." Voulez-vous une fonction C++ qui peut exécuter une expression MATLAB arbitraire? Ou voulez-vous une fonction C++ capable d'exécuter une expression C++ arbitraire? Ou autre chose? –

+0

Cela ressemble à un "problème XY" http://mywiki.wooledge.org/XyProblem. @ Cavs85, s'il vous plaît décrire votre objectif final, et pas seulement ce que vous êtes coincé. –

Répondre

4

Vous pouvez utiliser system(): http://linux.die.net/man/3/system

+3

Cela vous permettra d'appeler un autre programme qui fournit une fonction de style 'eval', ne le confondons pas avec un évaluateur d'expression C++ standard. –

+0

Est-ce que 'system()' est également disponible sur Windows? Le Q mentionne «studio visuel». –

+0

@Ben, puisque l'OP a demandé "une fonction qui peut interpréter une chaîne comme une ligne de commande", j'ai utilisé 'system()'. Vous avez raison de dire que ce n'est pas équivalent à 'eval' de Matlab –

6

Si vous essayez réellement « évaluer » C++ code source dans une application C++ en cours d'exécution, puis pratiquement pas - ce n'est pas une caractéristique spécifiée par la langue.

Il existe interprètes pour les sous-ensembles de C++ (par exemple CInt, Ch et UnderC) - ils peuvent être en mesure d'exécuter votre programme C++ si c'est relativement simple. Alternativement, certains peuvent être intégrés dans un programme C++ compilé pour permettre une évaluation du code source au moment de l'exécution, mais avec un accès limité et une capacité à changer le code pré-compilé et ses variables.

Il est également possible pour un programme en cours à appeler le compilateur et charge dynamique/lien une bibliothèque résultante, mais cela est une pratique très inhabituelle et non sans performance, les questions de sécurité et d'interopérabilité:

  • création un nouveau processus pour le compilateur, la compilation et la liaison est une opération avide de ressources et relativement lent, mais une fois lié de la bibliothèque du nouveau code peut être exécuté à l'appel normal fonction hors-ligne des vitesses
  • les questions habituelles avec l'exécution d'une processus externe
    • assurant le nom de l'exécutable chemin et le compilateur ne peut pas être changé par des entrées malicieuses au programme
    • qu'aucun logiciel malveillant est remplacé par le compilateur ou d'infecter
    • sur la volée le code source ne contient pas des déclarations comme system() , exec(), unlink() appels, la connectivité réseau d'abus, mâchent CPU injustifiés/mémoire/descripteurs etc.
  • le programme pré-compilé en C++ ne peut pas être modifié ou facilement/profondément sondé par le nouveau code lié, de sorte que le principal les mécanismes pour un nouveau comportement doivent déjà avoir été intégrés dans l'application pré-compilée: ou des variables, fonctions et méthodes d'usine nouvellement accessibles/expédition virtuelle.

Si vous avez besoin en fait quelque chose de plus limité, comme la possibilité de évaluer des expressions mathématiques ou prédicats logiques, peut-être exprimées dans un C++ - style source, peut-être lire ou mettre certaines de vos valeurs, différentes plus limitées et bibliothèques spécialisées et interprétées embarquées sont disponibles. Il existe même des bibliothèques pour créer de tels analyseurs, tels que la bibliothèque d'esprit boost. Enfin, des interpréteurs pour d'autres langages - Lua, Ruby, Python, Perl, TCL, etc. - peuvent être intégrés dans l'application C++, proposant différentes approches d'interopérabilité et de sécurité.

+0

+1: bonne réponse. –

Questions connexes