【问题标题】:Pass function to dynamic link library将函数传递给动态链接库
【发布时间】:2019-11-09 13:53:55
【问题描述】:

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

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 是从外部程序调用的,它将获得 &amp;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(或同一文件中的变量)。

【问题讨论】:

    标签: c++ visual-studio function dll function-pointers


    【解决方案1】:

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

    我了解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 !
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      通话开始:

      start(setup,....
      

      调用函数:

      setup.objective(data,solution)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        相关资源
        最近更新 更多