передача двойного массива по типу void для GSL на C

#c #arrays #pointers #gsl

#c #массивы #указатели #gsl

Вопрос:

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

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

 double k1[2][4];
  

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

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

это передается как в func, так и в jac как *params

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

в функции я пытаюсь извлечь k1 через:

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

или

 k1 = (double[][])params;
  

или…

 k1 = *(double *)params;
  

и т.д.

Я думаю, вопрос в том, существует ли однострочное решение?

Ответ №1:

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

Конечно, вам нужно указать количество элементов в строке, чтобы это сработало. В противном случае компилятор не знает, как получить доступ к элементам в результирующем массиве (помните, что он 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;
 }
  

Кстати, вам не обязательно использовать amp;k1 при передаче массива в функцию. Имя массива может использоваться в качестве его адреса (указателя на первый элемент).

Комментарии:

1. Спасибо! Я знаю, что могу просто передать k1 (а не amp;k1), но я пытаюсь оставаться последовательным в коде. Не уверен, насколько это необходимо на данный момент…

2. интересное замечание: в конце концов, мне не нужна фиктивная переменная … похоже, она работает с double (*k1)[2][4] = params;