Ras*_*man 2 c arrays pointers gsl
我正在尝试使用GSL库来解决ODE,我在使用void指针时遇到了一些困难
我需要在一个应该包含一个数组数组的参数上发送一个参数:
double k1[2][4];
Run Code Online (Sandbox Code Playgroud)
哪个被发送到
gsl_odeiv_system sys = {func, jac, 2, &k1};
Run Code Online (Sandbox Code Playgroud)
这被传递到这两个FUNC和江淮为*params
int func (double t, const double y[], double f[], void *params)
Run Code Online (Sandbox Code Playgroud)
在func中,我试图通过以下方式提取k1:
double k1[2][4];
k1 = *(double[][])params;
Run Code Online (Sandbox Code Playgroud)
要么
k1 = (double[][])params;
Run Code Online (Sandbox Code Playgroud)
要么...
k1 = *(double *)params;
Run Code Online (Sandbox Code Playgroud)
等等
我想问题是:有一个单行解决方案吗?
我不认为你可以像这样强制转换为数组类型(多维数组).您可能需要声明一个临时变量来保存指向数组第一个元素的指针.
当然,您需要指定每行的元素数量才能生效.否则,编译器不知道如何访问所得到的数组中的元素(记住,x[i][j]在内部转换为*(x + i*n + j)其中n是在每行中的元素的数量).
即
double x[5][2];
int main()
{
double (*y)[5][2];
void *z = x;
y = z;
/* after you extract the pointer from 'z' you
can access the elements using (*y)[][] */
(*y)[1][1] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,&k1在将数组传递给函数时不必使用.数组的名称可以用作其地址(指向第一个元素的指针).