2011-05-12 2 views
2

Я пытаюсь использовать библиотеку GSL для решения ОДЫ и у меня возникают некоторые трудности, используя указатель недействительногопроходя двойной массив по ничтожному типу для GSL в C

Мне нужно послать параметр более, что предполагается содержит массив массива:

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; 

и т. д.

У меня вопрос: есть ли однолинейное решение?

ответ

5

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

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

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

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

+0

спасибо! Я знаю, что могу просто передать k1 ​​(и не & k1), но я стараюсь оставаться последовательным в коде. Не уверен, насколько это необходимо ... – Rasman

+1

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

Смежные вопросы