2013-07-02 169 views
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 

我再變函數dclaration to:

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)’ 

可能有人請告訴我,我怎麼能解決這個問題?

+3

除非'N'是一個常數,你正在使用[變長數組](http://en.wikipedia.org/wiki/Variable-length_array),這在C++中不是標準的。爲什麼不使用'std :: vector'呢?你可以製作矢量矢量,並且更容易傳遞它。 –

+0

@JoachimPileborg:n作爲參數傳遞給調用函數。 – nish

+0

@JoachimPileborg:除了使用矢量以外,還有其他方法嗎? – nish

回答

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'關鍵字在初始化函數中分配。

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 *,並將其轉換爲,你就一定類型,你會通過它

+0

雖然聲明爲「int **」的變量可以作爲二維數組使用,但它不是*二維數組。一個合適的二維數組和一個指針指針數組的佈局是完全不同的,這意味着你不能這樣做。 –

+0

@Joachim Pileborg:好吧,你說的可以用作二維數組,它需要更多的預防措施來釋放分配的內存,這是開發人員的責任,我試圖給出一個解決方案 – ahmedsafan86