You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将动态链接库中TSolver_Setup的目标函数传递至start函数?

How to Pass the Objective Function from TSolver_Setup to the start Function

没问题,我来帮你搞定这个函数传递的问题。根据你的需求,不能修改TSolver_Setup,但可以调整start函数或者同文件内的变量,这里有两种可行的方案——优先推荐参数传递(更符合软件工程规范),也给你补充全局变量的方式作为备选。

方案1:修改start函数参数,直接传递函数指针和所需数据

这是最清晰、无副作用的实现方式,步骤如下:

  1. 更新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]; // 初始化吸引力
        }
        // ... 保留原有逻辑
    }
}
  1. 在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使用:

  1. 在文件全局作用域声明变量:
#include "solver.h" // 引入TSolver_Setup的定义

// 全局变量,存储目标函数指针和对应data
static TObjective_Function g_objective_func = nullptr;
static const void* g_func_data = nullptr;
  1. 在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;
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:33