Как получить доступ к элементу внутри структуры, которая находится внутри другой структуры в качестве указателя? - PullRequest
2 голосов
/ 22 июня 2011

Я пытаюсь использовать SuperLU для инверсии матрицы, но не могу получить доступ к конечному результату.Он использует несколько структур для инверсии, и я знаю, что ответ находится внутри структуры, но я не могу ссылаться на нее.

B определяется как суперматрица, которая имеет формат:

typedef struct {
Stype_t Stype; /* Storage type: indicates the storage format of *Store. */
Dtype_t Dtype; /* Data type. */
Mtype_t Mtype; /* Mathematical type */
int nrow; /* number of rows */
int ncol; /* number of columns */
void *Store; /* pointer to the actual storage of the matrix */
} SuperMatrix;

В зависимости от стиля изменяется структура магазина.Для B структура, используемая для * Store:

typedef struct {
int lda; /* leading dimension */
void *nzval; /* array of size lda-by-ncol to represent
a dense matrix */
} DNformat;

В результате окончательная структура B должна быть:

B = { Stype = SLU_NC; Dtype = SLU_D; Mtype = SLU_GE; nrow = 5; ncol = 5;
*Store = { lda = 12;
     nzval = [ 19.00, 12.00, 12.00, 21.00, 12.00, 12.00, 21.00,
     16.00, 21.00, 5.00, 21.00, 18.00 ];
    }
}

Теперь я хочу скопировать значения из nzval, ноЯ не уверен, как.

Я пытался сделать B.Store.nzval, но ошибка «запрос на член` nzval 'в чем-то, что не является структурой или объединением "

Также

DNformat **g = B.Store;
int *r = *(g->nzval);

и еще несколько подобных вещей, но не уверен, как это сделать.

Большое спасибо!

Ответы [ 2 ]

5 голосов
/ 22 июня 2011
DNformat *g = (DNformat *)B.store;
int *r = (int *)g->nzval;

Если вы хотите быть кратким, вы можете сложить все вместе:

int *r = (int *)((DNformat *)B.store)->nzval;
4 голосов
/ 22 июня 2011

Это потому, что Store является указателем в структуре.А также DNFormat объявлен как void *;это означает, что Store является пустым указателем, который не может быть разыменован без приведения;а также тот факт, что это указатель, означает, что вы должны использовать оператор разыменования ->

((DNFormat *)B.Store)->nzval
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...