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