在C中为GSL传递void类型的double数组

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)

等等

我想问题是:有一个单行解决方案吗?

nim*_*odm 5

我不认为你可以像这样强制转换为数组类型(多维数组).您可能需要声明一个临时变量来保存指向数组第一个元素的指针.

当然,您需要指定每行的元素数量才能生效.否则,编译器不知道如何访问所得到的数组中的元素(记住,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在将数组传递给函数时不必使用.数组的名称可以用作其地址(指向第一个元素的指针).