将函数传递给动态链接库

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

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(或同一文件中的变量)。

lisports 回答:将函数传递给动态链接库

修改启动功能以包含设置参考

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 !
}

如果这不能回答您的问题,请告诉我,以便我调整答案。但是在这种情况下,您首先需要澄清问题的确切含义,尝试过的内容,并提供缺失的要素,以使我们能够重现问题。

本文链接:https://www.f2er.com/3132642.html

大家都在问