utils.c:38:16: error: invalid type argument of unary ‘*’ (have ‘double’)
utils.c:38:16: error: invalid type argument of unary ‘*’ (have ‘double’)
我正在尝试找出一种方法,以 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’)
星星怎么了?
在这种情况下,您实际上需要的参数不仅仅是所需的索引。通常,当您将 N-dimensional 矩阵存储为线性数组时,您需要矩阵的所有 2 到 N 维度(所有维度首先接受)的大小才能访问元素。
对于一维矩阵,N-1是0。所以你只需要索引。代码是:
void printEle(double *mat, int i) {
double val = *(mat + i);
printf("%lf\n", val);
}
对于二维矩阵,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引入VLAs后,即使编译时不知道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
的格式说明符是 %lf
而不是 %f
。
我正在尝试找出一种方法,以 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’)
星星怎么了?
在这种情况下,您实际上需要的参数不仅仅是所需的索引。通常,当您将 N-dimensional 矩阵存储为线性数组时,您需要矩阵的所有 2 到 N 维度(所有维度首先接受)的大小才能访问元素。
对于一维矩阵,N-1是0。所以你只需要索引。代码是:
void printEle(double *mat, int i) {
double val = *(mat + i);
printf("%lf\n", val);
}
对于二维矩阵,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引入VLAs后,即使编译时不知道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
的格式说明符是 %lf
而不是 %f
。