передача двойного массива по типу void для GSL в C - PullRequest
2 голосов
/ 12 мая 2011

Я пытаюсь использовать библиотеку GSL для решения ODE, и у меня возникают трудности с использованием указателя void

Мне нужно отправить параметр, который должен содержать массив массива:

double k1[2][4];

, который отправляется на

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

, который передается на func и jac как *params

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

в func, я пытаюсь извлечь k1 с помощью:

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

или

k1 = (double[][])params;

или ...

k1 = *(double *)params;

и т. Д.

Наверное, вопрос в том, есть ли однострочное решение?

1 Ответ

5 голосов
/ 12 мая 2011

Я не думаю, что вы можете привести к типу массива (многомерный массив), как это. Вам может потребоваться объявить временную переменную для хранения указателя на первый элемент массива.

Конечно, вам нужно указать количество элементов в строке, чтобы это работало. В противном случае компилятор не знает, как получить доступ к элементам в результирующем массиве (помните, что x[i][j] внутренне преобразуется в *(x + i*n + j), где n - количество элементов в каждой строке).

1008 * Т.е. *

 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 при передаче массива в функцию. В качестве адреса можно использовать имя массива (указатель на первый элемент).

...