将指针数组传递给函数指针数组的 C++ 问题
Posted
技术标签:
【中文标题】将指针数组传递给函数指针数组的 C++ 问题【英文标题】:C++ trouble passing pointer array to functions pointer array 【发布时间】:2017-10-28 23:10:36 【问题描述】:以下 3 个函数可通过数组指针 ODE[3] 访问:
double voltage(double v)
return Iapp - (gL*(v - EL)) - (gNa * pow(m, 3) * h * (v - ENa)) - (gK * pow(n, 4) * (v - EK));
double hdot(double h)
ah = 0.07*exp(-(v + 58) / 20);
bh = 1 / (exp(-0.1*(v + 28)) + 1);
return (phi * (ah*(1 - h) - bh*h));
double ndot(double n)
an = -0.01*(v + 34) / (exp(-0.1*(v + 34)) - 1);
bn = 0.125 * exp(-(v + 44) / 80);
return (phi * (an*(1 - n) - bn*n));
typedef double(*eqpointer)(void);
eqpointer ODE[3];
这样
ODE[0] = voltage;
ODE[1] = hdot;
ODE[2] = ndot;
在另一个函数中,midvalues、oneloop和k1 是指向数组的指针。
for (int j 0 ; j <= eq_num; ++j) k1[j] = dt*(ODE[j]());
for (int j 0 ; j <= eq_num; j++) midvalues[j] = oneloop[j] + k1[j] / 2;
我要实现一个循环:
for (int j 0 ; j <= eq_num; j++) ODE[j](midvalues[j]);
这样每个函数 ODE[j] 都将对应的指针 midvalues[j] 作为参数。
我猜我需要两个函数指针,
一个不带参数并返回值的,即:ODE[j]()
另一个将指针位置作为参数并返回值。
我一直在努力寻找如何做到这一点,但没有运气,不胜感激。 在此先感谢:)
【问题讨论】:
我想你可能更喜欢一门课,并在课堂上制作这些电压、hdot 等“方法”。我认为....我无法理解您的问题 无论如何,你只能有一种类型的函数指针,它必须匹配签名。在您的情况下,它们都采用double
参数并返回double
,因此double (*)(double)
。
midvalue[j]
是一个数组指针。使用循环for (int j 0 ; j <= eq_num; j++) ODE[j](midvalues[j]);
我想为每个ODE[j]
提供相应的midvalues[j]
,同时还能够在不传递参数的情况下调用ODE[j],使用ODE[j]()
我认为使用指向值而不是值的指针的单个函数可能会有所帮助。该函数是否可以检查 nullptr 并取消引用以仅在它不是 nullptr 时使用该值?
由于midvalues(j)
间接依赖于ODE(j)
(通过k1(j)
),因此您有点要求以自身为参数调用ODE
。您不能直接在 C++ 中执行此操作。我认为要么你应该先做一些数学来转换方程,要么你应该实现一个收敛算法。
【参考方案1】:
C++ 的变体:
#include <iostream>
using namespace std;
double voltage(double v)
return v;
double hdot(double h)
return h * 2;
double ndot(double n)
return n * 3;
typedef double(*eqpointer)(double);
int main()
eqpointer ODE[] = voltage, hdot, ndot ;
int eq_num = sizeof(ODE) / sizeof(*ODE); // quantity elements in ODE[]
double *midvalues = new double[eq_num]; //change to variant (ty M_M)
for (int j = 0; j < eq_num; j++)
midvalues[j] = (*ODE[j])((j + 1) * 10) / 2; // Value For Example
printf("midvalues[%d]: %f\n", j, midvalues[j]);
return 0;
标准输出
*** midvalues[0]: 5.000000<br>
*** midvalues[1]: 20.000000<br>
*** midvalues[2]: 45.000000<br>
IDEONE
带有 std::vector 的变体(ty to @M.M)
#include <iostream>
#include <vector>
using namespace std;
double voltage(double v)
return v;
double hdot(double h)
return h * 2;
double ndot(double n)
return n * 3;
typedef double(*eqpointer)(double);
int main()
vector<eqpointer> ODE = voltage, hdot, ndot ;
int eq_num = ODE.size(); // quantity elements in ODE[]
vector<double> midvalues(eq_num);
for (int j = 0; j < eq_num; j++)
midvalues[j] = (*ODE[j])((j + 1) * 10) / 2; // Value For Example
printf("midvalues[%d]: %f\n", j, midvalues[j]);
return 0;
IDEONE
C 上的变体:
#include <stdio.h>
double voltage(double v)
return v;
double hdot(double h)
return h * 2;
double ndot(double n)
return n * 3;
typedef double(*eqpointer)(double);
int main()
eqpointer ODE[] = voltage, hdot, ndot ;
int eq_num = sizeof(ODE)/sizeof(*ODE);
// declared only for this examle
double result;
double k1 [eq_num], oneloop[eq_num], midvalues[eq_num];
// or best malloc(eq_num * sizeof(double)); from stdlib
for (int j = 0; j < eq_num; j++)
k1[j] = (*ODE[j])((j + 1) * 10); // random arguments ODE for example only
oneloop[j] =20 * (*ODE[j])(j + 1);
midvalues[j] = (k1[j] + oneloop[j]) / 2;
result = (*ODE[j])(midvalues[j]);
printf("*** %d) k1[]: %f, oneloop[]: %f, midvalues[]: %f result: %f\n",
j, k1[j], oneloop[j], midvalues[j], result);
return 0;
#stdout
*** 0) k1[]: 10.000000, oneloop[]: 20.000000, midvalues[]: 15.000000 result: 15.000000
*** 1) k1[]: 40.000000, oneloop[]: 80.000000, midvalues[]: 60.000000 result: 120.000000
*** 2) k1[]: 90.000000, oneloop[]: 180.000000, midvalues[]: 135.000000 result: 405.000000
IDEONE
【讨论】:
使用vector
而不是new double
谢谢!(但此变量声明仅适用于本示例)并向作者@Erez Sabran 提问:您的项目是C++ 还是C?两个标签都有问题
OP 使用的代码在 C 中无效,所以我认为它是 C++以上是关于将指针数组传递给函数指针数组的 C++ 问题的主要内容,如果未能解决你的问题,请参考以下文章
将指向 int 数组的指针传递给成员函数,错误:数组下标的无效类型“int [int]”