utils.c:38:16:错误:一元"*"的类型参数无效(具有"double"



我正试图找到一种方法,以element[I][j][k]的方式从C中的指针3d数组中检索特定元素。

我目前的方法是这样的:

void printElement(double *inputMatrix, int i, int j, int k) {
double val = *(*( (inputMatrix + i) + j) + k);
printf("%fn", val);
}

然而,如果我调用printElement((,我会得到以下错误:

utils.c:38:16: error: invalid type argument of unary ‘*’ (have ‘double’)

星星怎么了?

在这种情况下,您实际上需要更多的参数,而不仅仅是所需的索引。通常,当您将N维矩阵存储为线性阵列时,您需要沿所有2到N维(所有维度都首先接受(的矩阵大小来访问元素。

对于1D矩阵,N-1为0。所以你只需要索引。代码是:

void printEle(double *mat, int i) {
double val = *(mat + i);
printf("%lfn", val);
}

对于2D矩阵,N-1是1。所以除了两个索引,你们还需要第二个维度的大小。代码是:

void printEle(double *mat, int N, int i, int j) {
double val = *(mat + N*i + j);
printf("%lfn", 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("%lfn", val);
}

然而,如果您在编译时知道M、N、O的值,您可以简化为:

void printEle(double mat[M][N][O], int i, int j, int k) {
double val = mat[i][j][k];
printf("%lfn", val);
}

如果你只知道N和O,那么它也可以写成:

void printEle(double mat[][N][O], int i, int j, int k) {
double val = mat[i][j][k];
printf("%lfn", 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("%lfn", val);
}

此外,附带说明的是,double的格式说明符是%lf,而不是%f

相关内容

最新更新