繁体   English   中英

尝试获取二维数组的列长时,数组下标的类型'float [int]'无效

[英]Invalid types 'float[int]' for array subscript while trying to get the column length of an 2d array

尝试将2个矩阵相乘时

void Multiply(float* A, float* B, float* C)
{
    int m = sizeof(A) / sizeof(A[0]);
    int p = sizeof(A[0]) / sizeof(A[0][0]);
    int n = sizeof(B) / sizeof(B[0]);

    int i, j, k;
    for (i = 0;i < m;i++)
        for (j = 0;j < n;j++)
        {
            C[n*i + j] = 0;
            for (k = 0;k < p;k++)
                C[n*i + j] = C[n*i + j] + A[p*i + k] * B[n*k + j];
        }
}

我在此行invalid types 'float[int]' for array subscript错误invalid types 'float[int]' for array subscript

int p = sizeof(A[0]) / sizeof(A[0][0]);

我究竟做错了什么?

在调用Multiply的例程中, A可以定义为float A[X][Y]; 但是, Multiply仅接收一个指针,而不接收数组。 另外, Multiply不会接收到有关原始数组大小的信息,因此无法在子例程中计算它们。 它们必须由呼叫者传递。

当在表达式中使用数组时,包括函数参数但不包括sizeof或一元& (或用于初始化数组的字符串文字)的操作数,它将自动转换为指向其第一个元素的指针。

如果AY floatX数组的数组,则A的第一个元素是Y float的数组。 因此, A用作函数参数时,它将自动转换为float (*)[Y] 这与参数声明( float * 指向float数组的指针与指向float的指针不兼容,并且编译器应对此进行警告。

如果仍然在编译程序时忽略了警告,或者使用了强制类型转换来覆盖类型,则Multiply对于A仅具有float * 它没有有关数组大小或数组事实的信息。 然后,在表达式sizeof(A) / sizeof(A[0]) (其中不需要括号)中, sizeof(A)是指向float的指针的大小,因为A是指向float的指针,而sizeof( A [0]) is the size of a浮动, because A [0] is a浮子(as it must be sincein乘法is a浮子*`)。

参数B在尺寸计算上存在相同的问题。 MultiplyB只是一个指向float的指针,大小sizeof(B) / sizeof(B[0])仅计算一个指针的大小除以float的大小。 它不提供原始数组的大小。

奇怪的是,您的代码同时使用A作为A[0][0]的二维数组和作为A[p*i + k]的一维数组。 您必须选择其中之一。

如果您的编译器支持可变长度数组,则可以Multiply声明为:

void Multiply(int m, int p, int n, float (*A)[p], float (*B)[n], float (*C)[n])

然后,您可以在例程中使用A[i][k]B[k][j]C[i][j] 在调用例程中,您将像Multiply(X, Y, Z, A, B, C)一样将原始数组写为参数,其中XYZ是必需的维。

一种替代方法是将数组作为指针传递给float而不是指向可变长度数组的指针:

void Multiply(int m, int p, int n, float *A, float *B, float *C)

然后,您将使用A[p*i + k] ,如您当前的代码所示。 在调用例程中,您将传递指向数组的[0][0]元素的指针: Multiply(X, Y, Z, &A[0][0], &B[0][0], &C[0][0])

令人费解的是,这可能会有混叠和指针运算问题,因为生成的代码使用标称数组外部的索引计算来访问float元素。 编译器通常支持它,但是您应该检查一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM