Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Имплементировать код пользователя в программе

3213 4325423 Ученик (79), на голосовании 5 месяцев назад
Есть условный калькулятор, в котором у пользователя есть возможность задать свою функцию, например:
float sin(float x);
Через какой-нибудь textbox. Как можно потом имплементировать этот код пользователя в программе?

В какую сторону копать, как эта тема называется?
Голосование за лучший ответ
Татьяна Просветленный (36384) 6 месяцев назад
 #include  
#include
#include
#include

std::string generateCode(const std::string& functionCode) {
return R"(
#include

extern "C" float userFunction(float x) {
)" + functionCode + R"(
}
)";
}

bool compileCode(const std::string& code, const std::string& filename) {
std::ofstream file(filename + ".cpp");
if (!file.is_open()) {
std::cerr << "Unable to open file for writing" << std::endl;
return false;
}
file << code;
file.close();

std::string command = "g++ -fPIC -shared -o " + filename + ".so " + filename + ".cpp";
return std::system(command.c_str()) == 0;
}

typedef float (*UserFunction)(float);

int main() {
std::string userFunctionCode = R"(
return std::sin(x);
)";

std::string code = generateCode(userFunctionCode);
std::string filename = "user_function";

if (!compileCode(code, filename)) {
std::cerr << "Compilation failed" << std::endl;
return 1;
}

void* handle = dlopen(("./" + filename + ".so").c_str(), RTLD_LAZY);
if (!handle) {
std::cerr << "Cannot open library: " << dlerror() << std::endl;
return 1;
}

UserFunction userFunction = (UserFunction)dlsym(handle, "userFunction");
const char* dlsym_error = dlerror();
if (dlsym_error) {
std::cerr << "Cannot load symbol 'userFunction': " << dlsym_error << std::endl;
dlclose(handle);
return 1;
}

float result = userFunction(0.5);
std::cout << "Result: " << result << std::endl;

dlclose(handle);
return 0;
}
В C++ возможность динамической компиляции и выполнения кода пользователя не столь тривиальна, как в некоторых других языках, например, в C# с использованием Roslyn. Однако, существуют подходы и библиотеки, которые позволяют компилировать и выполнять пользовательский код в C++.
3213 4325423Ученик (79) 6 месяцев назад
Вопрос задан в разделе C/C++, а не C#
ТатьянаПросветленный (36384) 6 месяцев назад
посмотри внимательнее код и какой там
Татьяна Просветленный (36384) Татьяна, С# нету не какого там
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (264340) 6 месяцев назад
встроить скриптовый движок: Lua, Python, V8

не проверял:

 #include  
#include

int main() {
lua_State* L = luaL_newstate();
luaL_openlibs(L);

std::string user_code = "function sin(x) return math.sin(x) end";
if (luaL_dostring(L, user_code.c_str()) != LUA_OK) {
std::cerr << lua_tostring(L, -1) << std::endl;
lua_close(L);
return -1;
}

lua_getglobal(L, "sin");
lua_pushnumber(L, 3.14159 / 2); // Example input

if (lua_pcall(L, 1, 1, 0) != LUA_OK) {
std::cerr << lua_tostring(L, -1) << std::endl;
lua_close(L);
return -1;
}

double result = lua_tonumber(L, -1);
std::cout << "Result: " << result << std::endl;

lua_close(L);
return 0;
}
Похожие вопросы