我試圖想辦法以 element[i][j][k] 的方式從 C 中的指標 3d 陣列中檢索特定元素。
我目前的方法如下所示:
void printElement(double *inputMatrix, int i, int j, int k) {
double val = *(*( (inputMatrix i) j) k);
printf("%f\n", val);
}
但是,如果我呼叫 printElement(),我會收到以下錯誤:
utils.c:38:16: error: invalid type argument of unary ‘*’ (have ‘double’)
明星有什么問題?
uj5u.com熱心網友回復:
在這種情況下,您實際上需要的引數不僅僅是所需的索引。通常,當您將 N 維矩陣存盤為線性陣列時,您需要沿所有 2 到 N 維(首先接受所有維度)的矩陣大小來訪問元素。
對于一維矩陣,N-1 為 0。所以你只需要索引。代碼是:
void printEle(double *mat, int i) {
double val = *(mat i);
printf("%lf\n", val);
}
對于 2D 矩陣,N-1 為 1。因此,除了兩個索引,您還需要第二維的大小。代碼是:
void printEle(double *mat, int N, int i, int j) {
double val = *(mat N*i j);
printf("%lf\n", val);
}
繼續,對于 3D 矩陣,N-1 是 2。所以在這種情況下正確的代碼是:
void printEle(double *mat, int N, int O, int i, int j, int k) {
double val = *(mat N*O*i O*j k);
printf("%lf\n", val);
}
但是,如果您在編譯時知道 M、N、O 的值,則可以簡化為:
void printEle(double mat[M][N][O], int i, int j, int k) {
double val = mat[i][j][k];
printf("%lf\n", val);
}
如果你只知道 N 和 O,那么它也可以寫成:
void printEle(double mat[][N][O], int i, int j, int k) {
double val = mat[i][j][k];
printf("%lf\n", val);
}
在C99引入 VLA 之后,即使在編譯時不知道 M、N、O,也可以簡單地寫成:
// dimensions must be passed before the array itself
void printEle(int M, int N, int O, double mat[M][N][O], int i, int j, int k) {
double val = mat[i][j][k];
printf("%lf\n", val);
}
double此外,在旁注中, is%lf和 not的格式說明符%f。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430729.html
