2014-01-07 3 views
0

Я не знаю размер массива при компиляции, поэтому я объявил счетчик переменных и создал массив arr [count] [count], я включу эту переменную count во время работы программы и я буду перераспределять его память, прежде чем делать это. Но я не мог создать функцию, которая принимает этот arr [count] [count]. Как я могу это сделать ? Когда я это сделал:Передача двумерного динамического массива функции

void add_friend(int friends[][*count], int p1, int p2) 
{ 

} 

компилятор дает сообщение об ошибке: count uneclared here.

+3

Общая картина проходит размеры в качестве параметров функции. – millimoose

+0

На самом деле вам нужно только количество столбцов (если вы не хотите выполнять проверку границ, в этом случае вам также нужны строки). –

+0

Возможно, вы захотите взглянуть на [это] (http://stackoverflow.com/questions/20899515/trouble-understanding-what-elements-are-passed-when-passing-multidimensional-arr/20918811#20918811). –

ответ

0

Вы не можете делать то, о чем вы спрашиваете, по крайней мере, не в C. Но, как предлагает @millimoose, если вы знаете размеры (которые могут быть переданы как int), вы можете сделать небольшую арифметику, чтобы выяснить, где друзья [p1] [p2] есть. Если в строке есть C-элементы, то вы знаете, что друзья [r] [0] - это C * r ints от начала друзей и могут рассматривать эту строку как простой массив int.

+0

Это можно сделать непосредственно в C, с массивами переменной длины. –

0

count должен быть доступен friends, для этого вы можете объявить его как глобальную переменную или как аргумент функции.

void add_friend(int count, int friends[][count], int p1, int p2) 
{ 
    // ... 
} 

int main(void) 
{ 
    int a[25][10]; 
    count = 10; 
    add_friend(10, a); 

    // ...   

    return 0; 
} 
+0

'count' не обязательно должен быть глобальным; он просто должен быть в области, когда он используется. До этого параметр достаточно объявить как параметр перед параметром массива, который его использует. –

+0

@EricPostpischil Я просто навязал почему он получает необъявленную переменную ошибку! – rullof

0

Ну, вот способ сделать то, что вы хотите с 1 одномерный массив в C/C++:

void ff(int *arr_2d, int s1, int s2) 
{ 
    for(int i=0;i<s1;i++) 
    { 
     for(int j=0;j<s2;j++) 
      printf("f[%d][%d] = %d\t",i,j, *(arr_2d+i*s2+j)); 

     printf("\n"); 
    } 
} 

И вы можете использовать эту функцию:

int *f = new int[100]; 
int s1,s2; 
s1 = s2 = 10; 
for(int i=0; i<s1; i++) 
    for(int j=0; j<s2; j++) 
     *(f+i*s2+j) = (i*s2+j); 

ff(f,10,10); 
0

В реализациях C 1999 и C 2011, которые поддерживают массивы переменной длины, вы можете объявить функцию таким образом:

void add_friend(int count, int friends[][count], int p1, int p2) … 
0

вы можете сделать это нравится:

1.void add_friend(int count, int friends[count][count], int p1, int p2) 
2.void add_friend(int count, int friends[][count], int p1, int p2) 
3.void add_friend(int count, int (*friends)[count], int p1, int p2) 
+0

спасибо за пункт, я исправлю это – Nibnat

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