0

我有一个功能:

void ord_matrix_multiplication(Cache& cache, Block* block1[][], Block* block2[][], Block* block3[][], int A[][], int B[][], int C[][], int i, int j, int k, int n, int s)

我在调用函数中有以下代码:

int A[n][n];                                        
Block* blocks1[n][n];                               
int B[n][n];                                        
Block* blocks2[n][n];                               
int C[n][n];                                      
Block* blocks3[n][n]; 
...
//some code
...
ord_matrix_multiplication(cache, blocks1, blocks2, blocks3, A, B, C, i, j, k, n, s);

但我收到以下错误:

cacheaware.cpp:35: error: declaration of ‘block1’ as multidimensional array must have  bounds for all dimensions except the first
cacheaware.cpp:35: error: expected ‘)’ before ‘,’ token
cacheaware.cpp:35: error: expected initializer before ‘*’ token

然后我将函数声明更改为:

void ord_matrix_multiplication(Cache& cache, Block* block1[][100], Block* block2[][100], Block* block3[][100], int A[][100], int B[][100], int C[][100], int i, int j, int k, int n, int s)

这样做,我得到:

cannot convert ‘Block* (*)[(((unsigned int)(((int)n) + -0x00000000000000001)) + 1)]’ to ‘Block* (*)[100]’ for argument ‘2’ to ‘void ord_matrix_multiplication(Cache&, Block* (*)[100], Block* (*)[100], Block* (*)[100], int (*)[100], int (*)[100], int (*)[100], int, int, int, int, int)’

有人可以告诉我如何解决这个问题吗?

4

2 回答 2

1

多维数组不在 C++ 中管理,您必须将函数声明为:

void ord_matrix_multiplication(Cache& cache, Block* block1, Block* block2, Block* block3, int* A, int* B, int* C, int i, int j, int k, int n, int s)

此后,您可以以多维方式索引这些数组,尽管您负责数据完整性和边界检查。

此外,能够声明可变大小的数组并不是标准的 C++。数组的大小必须在声明时知道,或者在初始化函数中使用“new”关键字分配。

于 2013-07-02T07:56:45.270 回答
0

我以前也遇到过这样的问题。最简单的解决方案是使用指针

int* x; // x can be pointer to int or pointer to the first item in the array
int** y; // y can be a pointer to pointer of int or a pointer to array of int or 2 dimension array
int x*** z; // z can be used as three dimensional array

你也可以让你的函数指向任何类型 void* 并将其转换为你确定会传递它的类型

于 2013-07-02T08:03:27.190 回答