![](/img/trans.png)
[英]I get the error: “invalid types 'long int[int] for array subscript”
[英]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
或一元&
(或用于初始化数组的字符串文字)的操作数,它将自动转换为指向其第一个元素的指针。
如果A
是Y
float
的X
数组的数组,则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 since
阿in
乘法is a
浮子*`)。
参数B
在尺寸计算上存在相同的问题。 在Multiply
, B
只是一个指向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)
一样将原始数组写为参数,其中X
, Y
和Z
是必需的维。
一种替代方法是将数组作为指针传递给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.