- 主题:碰到一个难题了字符串转表达式
把这个表达式写到一个.c文件中,fork新的进城编译执行它,取得结果。
以上是十数年前,本老某个学期面对的最后一道C大作业题受挫时,给自己预备的的最后一招
【 在 anything1999 的大作中提到: 】
:
: 程序里面有lambda表达式,这个表达式诸如y=3+x, 其中这个3+x部分想让用户输入,用户也可以输入3*x等,然后把用户输入的字符串转为表达式,以便后续计算,之前c#有第三方库,python之类的也有eval函数(这个可能还不太一样,我不需要立即求值),c++没有找到类似的功能或者库。
: 各位有什么思路
--
FROM 119.114.248.*
用户输入表达式,检查表达式合法性,若非法提示并要求重新输入或者直接退出;如果合法,则提示并等待用户输入变量值,用户输入后,检查值的合法性,当一切正常时,你有了一个没有未知数的表达式,你就fopen创建一个.c文件,内容为:
#include<xxx>
int main()
{
double x = 你的表达式;
printf("%f\n", x);
return 0;
}
调用fork,在子进程中execl("gcc", ......)编译刚刚的c文件,再execl(....)运行刚刚得到的可执行二进制文件;父进程简单地等待子进程的返回即可
不知道我说清楚了没有
【 在 anything1999 的大作中提到: 】
: 实际上不是求值的事情,而是把字符串变成表达式(lambda或者std::function),不是立即求值,而是运行时输入x进去再求表达式的值。比如3+x,运行时给出x=10,也可能给出100, 99都行。
: 不知道我讲明白没有。
--
FROM 119.114.248.*
效率是最不需要担心的了吧
这个方法只是个设想,我并没有用过,其中有个bug也是刚刚发现:子进程调用gcc编译后,如果成功,就不能再次调用execl执行。流程应该是当父进程发觉子进程返回成功后,调用execl执行
这是一个看似很黑客实际是一个投机取巧的方法,只有在黔驴技穷时才应该使用。你还是百度一下算法吧,一堆一堆的
【 在 anything1999 的大作中提到: 】
: 我也是这么想的,不知道这个fork编译执行的效率如何。
: 目前三种值得一试:
: 1. 内嵌python,后续需要频繁在c++和python之间传递参数,效率?
: ...................
--
FROM 119.114.248.*