指向多维数组错误的指针:表达式必须具有指向对象的类型

时间:2018-06-07 17:48:39

标签: c pointers multidimensional-array

以下代码返回错误:Expression必须具有指向对象的指针 类型。不知何故,问题在于我引用参数A,B和out的方式,每个参数指向2D数组。任何帮助将不胜感激。

目标是将两个数组相乘。

#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;
    }

2 个答案:

答案 0 :(得分:1)

由于A在函数中声明为const float *A,因此A[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);

答案 1 :(得分:0)

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

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;吗?