我有一个c程序,它计算某些x值(main.c)的f(x)。我需要从文件中获取一行c代码,该代码是我执行的函数(function.dot)。例如,function.dot将包含: POW((1-X),0.333); 我需要读取此文件,获取该函数并在我的代码(main.c)中执行。我怎么能这样做?
答案 0 :(得分:1)
基本步骤是:
如果文件中的单行代码可以是任何语言,那么使用像Lua这样可以链接到主可执行文件的东西要容易得多。
答案 1 :(得分:0)
您可以考虑以下几个选项: 1)切换到任何数量的解释语言(python,perl等),支持这个作为一种简单的机制。 (例如:在python中
data = open("function.dot").read()
x = 5
eval(data) #note that this is unsafe if you can't trust data, and you might also need to play with environment
)
2)你可以将代码包装在它自己的c文件中...类似的东西(但有更多的错误检查等......你可能不想这样做)
void generate_c_program(char *line)
{
FILE *fp = fopen("myfile.c","wt");
fprintf(fp,"#include <math.h>\nint main(char *argv, int argc) {\n double x = atof(argv[1]); printf(\"%f\",(%s));}\n");",line); //this is also unsafe if you can't trust data
fclose(fp);
//now execute gcc myfile.c
//now execute a.out
//optionally cleanup by deleting a.out and myfile.c
}
3)有效地编写自己的编译器/解析器(如果您之前已经完成此操作可能相当容易,并且您需要支持的功能/操作数量很少,或者可能是一个更大的交易而且不适合在这个答案中)......可扩展的方式是使用LEX / YACC或类似的方法)
答案 2 :(得分:0)
我会提供一些选择:
切换到另一种解释器语言,包括python,ruby,perl,... 如果您正在处理小项目,我推荐这个选项。
在C中实现自己的解释器。 解析您的输入,分析并执行它。 您可能会发现开源实现。 一种选择是俚语 http://www.jedsoft.org/slang/doc/html/slang.html
调用C编译器并动态链接它。 这取决于您的操作系统,但“system”或“exec”函数可帮助您调用编译器来处理输入文件。如果您使用的是Linux,'dlsym'可以打开从您的输入文件编译的共享对象。 您可能需要将输入文件转换为C程序。 编译速度很慢但运行速度最快。