2013-07-02 4 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 

Затем я изменил функцию до:

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++, позволяющим объявлять массивы переменных размеров. Массив массива должен быть известен во время объявления или выделен в функции инициализации с использованием ключевого слова «новое».

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 

также вы можете сделать свою функцию взять указатель на любой тип пустот * и привести его к типу, который вы уверены, что вы не передадите его

+0

Хотя верно, что переменная, объявленная как 'int **', может * использоваться * как двухмерный массив, это * не * двумерный массив. Макет правильного двухмерного массива и массива указателей на указатели совершенно разные, а это значит, что вы не можете сделать это так. –

+0

@Joachim Pileborg: хорошо, как вы сказали, может использоваться как 2-мерный массив, ему нужны дополнительные меры предосторожности, чтобы освободить выделенную память, это ответственность разработчика, я пытаюсь дать решение – ahmedsafan86

Смежные вопросы