2011-06-21 76 views
2

我想用SuperLU進行矩陣反轉,但我無法訪問最終結果。它使用一些結構進行反演,我知道答案是在一個結構中,但我不能引用它。如何訪問另一個結構中的結構內的一個元素作爲指針?

B是定義爲具有格式的超矩陣:基於S類型的存儲器的變化的結構

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用於*商店的結構是:

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

和一些其他的東西像但不知道如何解決這個問題。

非常感謝!

回答

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

如果你想成爲簡潔,你可以把它放在一起:

int *r = (int *)((DNformat *)B.store)->nzval; 
4

這是因爲存儲是在結構的指針。而且DNFormat被聲明爲void *;這意味着Store是一個無效指針,不能在沒有演員的情況下解除引用;而且它也是一個指針,這意味着您必須使用解除引用運算符->

((DNFormat *)B.Store)->nzval 
+0

要回答您的其他問題;奧利擁有正確的信息。 – Suroot

相關問題