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