将函数传递给动态 link 库

Pass function to dynamic link library

我需要在动态 link 库项目中传递函数。在这个项目中我有两个功能:

HRESULT solve_serial(solver::TSolver_Setup &setup, solver::TSolver_Progress &progress) {
  start(setup.max_generations, setup.population_size, setup.problem_size, setup.lower_bound, setup.upper_bound);
}

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++)
        {
            // ---------- HERE I NEED TO USE PASSED FUNCTION -------------
            f[i] = function(ffa[i]);  // obtain fitness of solution
            I[i] = f[i];                        // initialize attractiveness
        }
    }
}

solve-serial 是从外部程序调用的,它将获得 &setup 和我需要传递给内部函数 start 的函数,我将在其中使用它。

这是 solver::TSolver_Setup 的样子:

using TObjective_Function = double(IfaceCalling*)(const void *data, const double *solution);

struct TSolver_Setup {
    const TObjective_Function objective;
};

如何传递函数?我无法更改 solver::TSolver_Setup 但我可以更改 start (或同一文件中的变量)。

修改启动函数以包含设置参考

void start(olver::TSolver_Setup &setup,.....)

通话开始:

start(setup,....

调用函数:

setup.objective(data,solution)

如果我理解得很好,你遇到的问题只是关于如何将函数(或更准确地说是函数指针)作为参数传递以及如何使用它们。

我知道 setup 包含一个指向名为 objective 的函数的指针:

struct TSolver_Setup {
    const TObjective_Function objective;
    //....  (apparently a lot of other stuff you didn't talk about)
};

我还了解到您需要在 start() 中调用此函数,在您放置占位符注释的行中。然而,不清楚值应该存储在哪里,而不是应该使用哪些参数,所以我将使用一些假设和占位符。您可以访问 setup,您可以这样做:

ffa[i] = setup.objective (&whatdata, &what solution); 

但由于您没有将 setup 传递给 start(),您至少必须通过使用附加参数 f 来传递函数以启动:

void start(size_t problem_size, size_t max_generation, size_t population_size, const double* lower_bound, const double* upper_bound, TObjective_Function f)
{
    ...
            ffa[i] = f (&whatdata, &what solution);// <---------- HERE IT IS ----------
    ...
}

和传递参数,你只需要传递objective

HRESULT solve_serial(solver::TSolver_Setup &setup, solver::TSolver_Progress &progress) {
  start(setup.max_generations, setup.population_size, setup.problem_size, setup.lower_bound, setup.upper_bound, setup.objective);
  return 0;  // you must return something !
}

如果这不能回答您的问题,请告诉我,以便我调整我的答案。但在这种情况下,您首先需要弄清楚您的问题到底是什么,您尝试过什么,并提供可以让我们重复该问题的缺失元素。