Re[2]: Передача указателя на двумерный массив в функцию
От: Багер  
Дата: 08.12.02 13:54
Оценка: 11 (3)
Здравствуйте

Можно так:

Учитывая, что размерности известны, т.к. массив статический:
void aa( int _a[][10] )
{
   ShowMessage( _a[2][9] );
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
   int a[12][10];
   a[2][9]= 29;
   aa( a );
}

Но Вам же нужно передавать размеры в виде параметров. Тогда встаёт
вопрос: Зачем, создавая статический массив int a[12][12], передавать
его размеры, как будто он динамический?
ИМХО: размеры массива, приведённые Вами, приведены лишь для примера,
тогда совет: В следующий раз обозначайте к примеру так: a[m][n].
Будет понятнее, что размеры не статические.

Будем считать, что именно так Вы и написали, тогда:

void aa( int **_a, int _m, int _n )
{

   ShowMessage( _a[2][9] );
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
   int **a;
   int m= 12;
   int n= 10;
   a= new int*[m];
   a[2]= new int[n];
   a[2][9]= 29;
   aa( a, m, n );
}

Если же всё-таки у Вас имеются всё-таки статические массивы, но
несколько и разных размерностей, к примеру: int a[12][10], b[10][12], то:

void aa( int *_a, int _m, int _n )
{
   int **a;
   a= new int*[_m];
   for( int f= 0; f< _m; f++ )
      a[f]= _a +f*_n;
   ShowMessage( a[_m -1][_n -1] );
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
   int a[12][10];
   int b[10][12];
   a[11][9]= 119;
   b[9][11]= 911;
   aa( a[0], 12, 10 );
   aa( b[0], 10, 12 );
}


И, наверное, крайний случай. Если же всё-таки у Вас имеются всё-таки статические
массивы и все одного размера, но разных типов, к примеру: int
a[12][10], double b[10][12], то:

template <class A> void aa( A _a[][10] )
{
   ShowMessage( _a[2][9] );
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
   int a[12][10];
   double b[12][10];
   a[2][9]= 29;
   b[2][9]= 29.29;
   aa( a );
   aa( b );
}


И т.д. и т.п. и прочее.

Коментарии к коду нужны?
Вопросы?
Ваша программа работает корректно? Один звонок и я всё исправлю!

Делаю потенциальные фичи :))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.