【问题标题】:Pointer to multidimensional array error: Expression must have pointer-to-object type指向多维数组错误的指针:表达式必须具有指向对象类型的指针
【发布时间】:2018-06-07 17:48:39
【问题描述】:

以下代码返回错误:Expression must have pointer-to-object 类型。不知何故,问题在于我引用参数 A、B 和 out 的方式,每个参数都指向一个二维数组。任何帮助将不胜感激。

目标是将两个数组相乘。

#include <stdio.h>

void matrixmul(const float *A, const float *B, int m, int n, int k, float *out)
{
    float value = 0.0;

    int x, y, z;

    for (x = 0; x < k; x++) {
        for (y = 0; y < m; y++) {
            for (z = 0; z < n; z++) {

                    float product = A[y][z] * B[z][y];
                    value = value + product;
                    printf("%lf", value);
                }
                out[y][x] = value;
                value = 0;
            }
        }
    }

    int main(void) {
        float a[2][3] = {
            { 1.0,2.0,1.0 },
            { 3.0,4.0,1.0 }
        };


        float b[3][1] = {1, 2, 3};

        float array[2][1]; 
        matrixmul((float *) a, (float *) b, 2, 3, 1, (float *) array);
        return 0;
    }

【问题讨论】:

  • 该函数不知道数组的维度,因此它不知道如何计算给定行和列的值的地址。有关如何使其工作的示例,请参阅此答案:stackoverflow.com/a/50726586/8513665
  • 如果你发现自己在投射以避免警告/错误(例如(float *) a)——你知道你做错了什么......a不是float *,它是@987654326 @。类型不兼容。

标签: c pointers multidimensional-array


【解决方案1】:

由于A在函数中被声明为const float *AA[y][z]是一个无效项。 A[y] 计算为类型 const float。您不能将数组运算符 [z] 与浮点数一起使用。

Bout 也会出现同样的问题。

你可以将函数定义为

void matrixmul(const float A[][3], const float B[][1], int m, int n, int k, float out[][1])
{
  ...
}

并简单地调用函数:

matrixmul(a, b, 2, 3, 1, array);

C99/C11 支持变长数组。假设您可以使用支持 C99/C11 的编译器,您可以将函数定义为

void matrixmul(int arows, int acols, int bcols,
               const float A[arows][acols],
               const float B[acols][bcols],
               float out[arows][bcols])
{
  ...
}

然后调用函数

matrixmul(2, 3, 1, a, b, array);

【讨论】:

  • 您好,感谢您的回复,如果我只想使用指针来引用数组怎么办(如果事先不知道数组的尺寸)?
  • 此答案假定列数始终相同。 OP 的代码将行数和列数作为参数传递,所以我认为可以公平地假设这个函数应该能够处理在编译时未知的维度矩阵。
  • @classic_man:假设您使用的是 C99 或支持可变长度数组的 C11 编译器,您可以执行 void foo( size_t arows, size_t acols, float a[arows][acols], size_t brows, size_t bcols, float b[brows][bcols], ...) 之类的操作,然后将维度作为函数调用的一部分传递。跨度>
【解决方案2】:

该函数不知道数组的维度,因此它不知道如何计算给定行和列的值的地址。但是,您可以使用函数的参数来定义矩阵的维度。您必须重新排列函数中的参数,以便指定维度的参数出现在数组之前。使用你的函数,它可能看起来像这样:

void matrixmul(int m, int n, int k, const float A[m][n], const float B[n][m], float out[m][k])

顺便说一句,我还没有真正阅读完整的功能,但是out[y][k] = value;应该是out[y][x] = value;吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2012-01-02
    • 2016-03-05
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多