如何将动态链接库中TSolver_Setup的目标函数传递至start函数?
How to Pass the Objective Function from
TSolver_Setup to the start Function 没问题,我来帮你搞定这个函数传递的问题。根据你的需求,不能修改TSolver_Setup,但可以调整start函数或者同文件内的变量,这里有两种可行的方案——优先推荐参数传递(更符合软件工程规范),也给你补充全局变量的方式作为备选。
方案1:修改start函数参数,直接传递函数指针和所需数据
这是最清晰、无副作用的实现方式,步骤如下:
- 更新
start函数的参数列表,添加目标函数指针和对应的data参数(因为你的TObjective_Function定义要求接收const void *data作为第一个入参):
// 修改后的start函数 void start(size_t problem_size, size_t max_generation, size_t population_size, const double* lower_bound, const double* upper_bound, TObjective_Function objective_func, const void* func_data) { while (t <= MaxGeneration) { for (i = 0; i < n; i++) { // 调用传递进来的目标函数计算适应度 f[i] = objective_func(func_data, ffa[i]); I[i] = f[i]; // 初始化吸引力 } // ... 保留原有逻辑 } }
- 在
solve_serial中调用start时传入目标函数:
注意你的TSolver_Setup只提供了objective函数指针,如果目标函数需要的data是外部传入的(比如solve_serial的调用者提供),你需要确保solve_serial能获取到这个data(如果TSolver_Setup有隐藏的data成员就用那个,没有的话可以传nullptr,取决于目标函数是否允许)。示例代码如下:
HRESULT solve_serial(solver::TSolver_Setup &setup, solver::TSolver_Progress &progress) { // 替换为实际的data,若无需data则传nullptr const void* func_data = nullptr; start(setup.problem_size, setup.max_generations, setup.population_size, setup.lower_bound, setup.upper_bound, setup.objective, func_data); // ... 保留原有逻辑 return S_OK; }
方案2:使用同文件全局变量(不推荐,但符合修改权限)
如果因为某些原因不想修改start的参数列表,你可以在同文件中定义全局变量存储函数指针,在solve_serial中赋值后供start使用:
- 在文件全局作用域声明变量:
#include "solver.h" // 引入TSolver_Setup的定义 // 全局变量,存储目标函数指针和对应data static TObjective_Function g_objective_func = nullptr; static const void* g_func_data = nullptr;
- 在
solve_serial中给全局变量赋值:
HRESULT solve_serial(solver::TSolver_Setup &setup, solver::TSolver_Progress &progress) { g_objective_func = setup.objective; g_func_data = nullptr; // 替换为实际需要的data start(setup.max_generations, setup.population_size, setup.problem_size, setup.lower_bound, setup.upper_bound); // ... 保留原有逻辑 return S_OK; }
- 在
start中使用全局变量:
void start(size_t problem_size, size_t max_generation, size_t population_size, const double* lower_bound, const double* upper_bound) { while (t <= MaxGeneration) { for (i = 0; i < n; i++) { // 先检查函数指针不为空,避免空指针崩溃 if (g_objective_func != nullptr) { f[i] = g_objective_func(g_func_data, ffa[i]); I[i] = f[i]; } // ... 保留原有逻辑 } } }
注意:全局变量的方式虽然简单,但会带来线程安全问题(多线程调用
solve_serial时会冲突),也不利于代码的可维护性,所以优先选择方案1。
内容的提问来源于stack exchange,提问作者Sk1X1
相关产品推荐
相关产品推荐

