在 C 中通过 void 类型为 GSL 传递双精度数组

发布于 2024-11-07 04:47:01 字数 628 浏览 1 评论 0原文

我正在尝试使用 GSL 库来解决 ODE,但使用 void 指针时遇到一些困难

我需要在应该包含数组的数组上发送一个参数:

double k1[2][4];

发送到此

gsl_odeiv_system sys = {func, jac, 2, &k1};

的参数会传递给两者funcjac 作为

int func (double t, const double y[], double f[], void *params)

func 中的 *params,我试图通过以下方式提取 k1:

double k1[2][4];
k1 = *(double[][])params;

k1 = (double[][])params;

或...

k1 = *(double *)params;

等等

我想问题是: 有没有单行解决方案?

I'm trying to use the GSL library to solve ODE and I'm having some difficulty using the void pointer

I need to send a parameter over that supposed to contain an array of an array:

double k1[2][4];

which gets sent to

gsl_odeiv_system sys = {func, jac, 2, &k1};

this gets passed on to both func and jac as *params

int func (double t, const double y[], double f[], void *params)

in func, I'm trying to extract k1 via:

double k1[2][4];
k1 = *(double[][])params;

or

k1 = (double[][])params;

or...

k1 = *(double *)params;

etc

I guess the question is: is there a one line solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七色彩虹 2024-11-14 04:47:01

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

当然,您需要指定每行的元素数量才能正常工作。否则,编译器不知道如何访问结果数组中的元素(请记住,x[i][j] 在内部转换为*(x + i*n + j) code> 其中 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;
 }

一句,将数组传递给函数时不必使用 &k1 。数组的名称可以用作其地址(指向第一个元素的指针)。

I don't think you can cast to an array type (a multidimensional array) like this. You may need to declare a temporary variable to hold the pointer to the first element of the array.

Of course, you need to specify the number of elements per row for this to work. Otherwise the compiler does not know how to access elements in the resulting array (remember that x[i][j] is converted internally to *(x + i*n + j) where n is the number of elements in each row).

I.e.

 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;
 }

By the way, you don't have to use &k1 when passing the array to the function. The name of the array may be used as its address (A pointer to the first element).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文