Передача указателя на двумерный массив в функцию
От: sndralex Израиль www.gdetotam.co.il
Дата: 08.12.02 09:51
Оценка:
Я просто торможу
никак не удается сабж.
У меня есть массив и функция в которой надо с ним работать:

int a[12][12];
.....
.....
void b(int **aa)


И что-то я потерялся с передачей массива в качестве параметра.
Помогите, люди добрые(только сильно не пинайте.)
Alexander N. Treyner
Re: Передача указателя на двумерный массив в функцию
От: Bell Россия  
Дата: 08.12.02 10:43
Оценка: 3 (1) -3
Здравствуйте, sndralex, Вы писали:

S>
S>int a[12][12];
S>.....
S>.....
S>void b(int **aa)
S>



b(reinterpret_cast<int**>(a));
Любите книгу — источник знаний (с) М.Горький
Re: Передача указателя на двумерный массив в функцию
От: Willi Интернет  
Дата: 08.12.02 10:47
Оценка:
Здравствуйте, sndralex, Вы писали:

S>Я просто торможу

S>никак не удается сабж.
S>У меня есть массив и функция в которой надо с ним работать:

S>
S>int a[12][12];
S>.....
S>.....
S>void b(int **aa)
S>


S>И что-то я потерялся с передачей массива в качестве параметра.

S>Помогите, люди добрые(только сильно не пинайте.)

ну например так
void b(int aa[12][12])

или так
void b(int *aa, int cx, int cy)
__________________________________
Василий Черневич (aka Willi)
Re[2]: Передача указателя на двумерный массив в функцию
От: sndralex Израиль www.gdetotam.co.il
Дата: 08.12.02 12:44
Оценка:
Здравствуйте, Bell, Вы писали:


B>

B>
B>b(reinterpret_cast<int**>(a));
B>

Большое спасибо.
Alexander N. Treyner
Re[2]: Передача указателя на двумерный массив в функцию
От: sndralex Израиль www.gdetotam.co.il
Дата: 08.12.02 12:44
Оценка:
Здравствуйте, Bell, Вы писали:


B>

B>
B>b(reinterpret_cast<int**>(a));
B>

Большое спасибо.
Alexander N. Treyner
Re[2]: Передача указателя на двумерный массив в функцию
От: sndralex Израиль www.gdetotam.co.il
Дата: 08.12.02 12:51
Оценка:
Здравствуйте, Willi, Вы писали:

W> ну например так

W>
W>void b(int aa[12][12])
W>


Не годиться — хочу размер передавать в виде параметра.

W>или так

W>
W>void b(int *aa, int cx, int cy)
W>


int *aa — а можно ли будет с этим работать как с двумерным массивом?
aa[1][1] ?
Alexander N. Treyner
Re[3]: Передача указателя на двумерный массив в функцию
От: Willi Интернет  
Дата: 08.12.02 13:04
Оценка:
Здравствуйте, sndralex, Вы писали:

S>Здравствуйте, Willi, Вы писали:


W>> ну например так

W>>
W>>void b(int aa[12][12])
W>>


S>Не годиться — хочу размер передавать в виде параметра.


W>>или так

W>>
W>>void b(int *aa, int cx, int cy)
W>>


S>int *aa — а можно ли будет с этим работать как с двумерным массивом?

S>aa[1][1] ?

Нет.
Я бы вообще отказался от использования двумерных массивов. С одномернымим проще работать, и не надо ломать голову на передачей параметров.

вместо
int a[12][12]

пишешь
int a[144]


а вместо
a[i][j]

пишешь
a[i * 12 + j]
__________________________________
Василий Черневич (aka Willi)
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 );
}


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

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

Делаю потенциальные фичи :))
Re[3]: Передача указателя на двумерный массив в функцию
От: sndralex Израиль www.gdetotam.co.il
Дата: 08.12.02 15:21
Оценка:
Здравствуйте, Багер, Вы писали:

Большое спасибо, за исчерпывающий ответ. Комментарии — излишни.
Только один вопрос — в приведенном вами коде

Б>Учитывая, что размерности известны, т.к. массив статический:

Б>
Б>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]: Передача указателя на двумерный массив в функцию
От: Багер  
Дата: 08.12.02 16:14
Оценка:
Здравствуйте, 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: Передача указателя на двумерный массив в функцию
От: cpp Россия http://www.elecard.com
Дата: 09.12.02 05:31
Оценка:
Здравствуйте, sndralex, Вы писали:

Избыточное цитирование удалено модератором. -- ПК

S>
S>int a[12][12];
S>.....
S>void b(int **aa)


S>что-то я потерялся с передачей массива в качестве параметра.


void b(int *a, int n, int m) ?
Сергей.
Re: Передача указателя на двумерный массив в функцию
От: Denwer Россия  
Дата: 09.12.02 06:43
Оценка: 12 (2)
Здравствуйте, sndralex, Вы писали:

S>Я просто торможу

S>никак не удается сабж.
S>У меня есть массив и функция в которой надо с ним работать:

S>
S>int a[12][12];
S>.....
S>.....
S>void b(int **aa)
S>


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]: Передача указателя на двумерный массив в функцию
От: totosha  
Дата: 09.12.02 14:01
Оценка:
Здравствуйте, Bell, Вы писали:

S>>int a[12][12];
S>>.....
S>>.....
S>>void b(int **aa)


B>b(reinterpret_cast<int**>(a));


Не, вот так точно делать не надо.

P.S. А лучше всего, конечно, передавать std::vector&.
Re[5]: Передача указателя на двумерный массив в функцию
От: Аноним  
Дата: 09.12.02 14:13
Оценка:
Какие могут быть проблемы с трехмерным массивом? Если ты знаешь как у двумерного, то это обобщается и на н-мерный.

Раскраска кода добавлена модератором. -- ПК

void fun(int * pArray){
   pArray[4*(6*7*8*9) + 3*(7*8*9) + 2*(8*9) + 1*9] = 666;
}

int main(){
   int a[5][6][7][8][9];//присвоим элементу a[4][3][2][1][0] значение 666
   fun(****a);
   std::cout<<a[4][3][2][1][0]<<std::endl;


   return 0;
}
Re[2]: Передача указателя на двумерный массив в функцию
От: Аноним  
Дата: 09.12.02 14:29
Оценка:
А ты сам такое скомпилить пробовал?
Re[3]: Передача указателя на двумерный массив в функцию
От: Аноним  
Дата: 09.12.02 14:41
Оценка:
Извините, не подумал что Array при выведении станет int (*pInt)[10]; погорячился, осознал.
Re[4]: Передача указателя на двумерный массив в функцию
От: Багер  
Дата: 09.12.02 15:45
Оценка:
Весело смотрится: диалог между никами "Аноним"
Ваша программа работает корректно? Один звонок и я всё исправлю!

Делаю потенциальные фичи :))
Re[5]: Передача указателя на двумерный массив в функцию
От: Аноним  
Дата: 10.12.02 07:51
Оценка:
Б>Весело смотрится: диалог между никами "Аноним"

Это монолог. Ты посмотрел, что я написал про многомерные массивы? А то говоришь, на экзамене не сообразил
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.