将函数传递给动态 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 !
}
如果这不能回答您的问题,请告诉我,以便我调整我的答案。但在这种情况下,您首先需要弄清楚您的问题到底是什么,您尝试过什么,并提供可以让我们重复该问题的缺失元素。
我需要在动态 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 !
}
如果这不能回答您的问题,请告诉我,以便我调整我的答案。但在这种情况下,您首先需要弄清楚您的问题到底是什么,您尝试过什么,并提供可以让我们重复该问题的缺失元素。