Учитывая, что размерности известны, т.к. массив статический:
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 );
}
И т.д. и т.п. и прочее.
Коментарии к коду нужны?
Вопросы?
Ваша программа работает корректно? Один звонок и я всё исправлю!
Делаю потенциальные фичи :))
Re[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 );
Б>}
Б>
Первая строка должна быть void aa( int _a[12][10] )? или оставить скобки пустыми как у Вас,
и второй вопрос при передаче массива таким образом происходит копирование или все таки — передача указателя?
Спасибо за ответ.
Alexander N. Treyner
Re[4]: Передача указателя на двумерный массив в функцию
Здравствуйте, sndralex, Вы писали:
S>Здравствуйте, Багер, Вы писали:
S>Первая строка должна быть void aa( int _a[12][10] )? или оставить скобки пустыми как у Вас,
Не принципиально, т.к. компилятору нужно знать только через сколько данных пойдёт следующая размерность.
Как справедливо заметили выше, запись int a[144] в памяти выглядит точно так же, как и int a[12][12]. Вот с трёхмерными массивами, у меня на экзамене были проблемы. Он, по словам препода, не эквивалентен записи int a[1728], как-то по-другому. Сейчас с ходу тоже не скажу. S>и второй вопрос при передаче массива таким образом происходит копирование или все таки — передача указателя?
Проведя несложные добавления к коду:
void aa( int _a[][10] )
{
_a[2][9]= 292;
ShowMessage( _a[2][9] );
}
void __fastcall TForm2::Button2Click(TObject *Sender)
{
int a[12][10];
a[2][9]= 29;
aa( a );
ShowMessage( a[2][9] );
}
Мы убеждаемся, что указатель передаётся только указателем, а не целый массив тащит за собой. Собственно, на то он и указатель ))
Ваша программа работает корректно? Один звонок и я всё исправлю!
Делаю потенциальные фичи :))
Re: Передача указателя на двумерный массив в функцию
S>И что-то я потерялся с передачей массива в качестве параметра. S>Помогите, люди добрые(только сильно не пинайте.)
А если так:
template<class Array>
void F(Array array, int i, int j)
{
array[1][1] = 20;
}
void main()
{
int a[10][10];
F(a, 10, 10);
cout << a[1][1];
}
Плюсы
Не нужно заранее указывать размер
Доступ идет чере два индекса, т.е. не нужен различный перевод
Re: Передача указателя на двумерный массив в функцию
От:
Аноним
Дата:
09.12.02 13:57
Оценка:
void fun(int (*pArra)[10]){
pArra[0][0] = 10;
}
Re[3]: Передача указателя на двумерный массив в функцию
От:
Аноним
Дата:
09.12.02 14:00
Оценка:
C ума сошел? Не вздумай так писать! Это глупейшая ошибка! int **p и int a[10][10] — совершенно разные вещи. Имя такого массива — это не указатель на целое, а указатель на массив (одномерный), можно либо
void fun(int (*pArray)[10]);
либо
void fun(int * pArray)//тут тебе придется работать уже как с одномерным
//а передавать в нее так fun(*a) или fun(&a[0][0]) или fun(a[0]).
Re[2]: Передача указателя на двумерный массив в функцию