Илья Кригоузов Привет, меня зовут Илья Кригоузов и я занимаюсь информационными технологиями с 2005 года. Под такими технологиями я понимаю довольно широкий круг вещей: сайты любой сложности, базы данных и клиент-серверные приложения.
Закончил МИРЭА по специальности «инженер-математик», практику проходил на концерне радиостроения ОАО «Вега».Работаю в Информационных системах для бизнеса, так же сотрудничал с АйТи-агенством.
В свободное время увлекаюсь фотографией. Найти меня вы можете:

26 декабря 2007 г.

Передача двумерного массива функции

В c++ передавать параметр какой-либо функции вовсе необязательно, если этот параметр можно рассмотреть как глобальный. Но вот что касается каких либо локальных переменных, тут дело обстоит иначе: нужно передавать.
С одномерным массивом все просто. Рассмотрим случай передачи локального одномерного массива mass, который мы инициализируем в функции main() и передаем функции print(), которая нам выведет содержимое массива:

int print(int massive[]) {
for (int i=0; i<5; i++) printf(" %d", massive[i]);
return 0;
}

int main(){
int mass[5]={0, 5, 9, 12, 8};
print(mass);
return 0;
}
обратите внимание, что в функции print мы задаем имя формального параметра как massive, хотя никто не запрещает нам использовать и mass. Я обращаю внимание, что хоть и называем параметр по другому, но если бы наша функция и меняла что-то в массиве, то эти изменения совершались не над копией массива, а над ним самим.

Бывают случаи, когда приходится работать с двумерными массивами. Допустим, вам необходимо передать двумерный массив какой-то хитрой функции. При этом учтем, что наш массив не глобальный, иначе его можно и не указывать в формальных параметрах.
Пусть у нас в функции определяется какой-то локальный массив m2d[3][5]. В таком представлении, грубо говоря, мы можем видеть этот массив в нашем богатом воображении как таблицу, у которой 3 строки и 5 столбцов. Итак вот каким образом мы передаем этот массив функции:

int foo( int (*mass)[5]) {
//some code
....
}

int main(){
//определяем и сразу инициализируем массив
int m2d[3][5] = {
(0, 1, 5, 7, 4),
(5, 12, 8, 0, 7),
(1, 1, 1, 59, 7)
};
foo(m2d);
return 0;
}
вот собственно и все. однако не злоупотребляйте многомерными массивами - это может привести к сжиранию памяти, т.к. в таких случаях ее очень сложно отслеживать.

10 комментариев:

  1. Спасибо ONIKSfly!

    Все доступно объяснил...

    ОтветитьУдалить
  2. Код сначала неплохо было бы проверить на машине. Работает ли ;)

    Могу заверить, что не работает!

    ОтветитьУдалить
  3. зачем писать не проверив. чушь полная. не будет работать

    ОтветитьУдалить
  4. У меня все работает. Большое спасибо!

    ОтветитьУдалить
  5. Я бы не стал представлять код, который не работает.
    Более того, не являясь фанатом языка C++, описал лишь задачу, при решении которой у меня возникли трудности.

    Просто хотел поделиться (:

    ОтветитьУдалить
  6. Все отлично работает

    ОтветитьУдалить
  7. cannot convert parameter 1 from 'int' to 'int []'
    сделал все как в примере

    ОтветитьУдалить
  8. присто return 0 убери и заработает

    ОтветитьУдалить
  9. double (*parr)[7];

    exp int __stdcall GetRates(double (*arr)[7])
    {
    parr=arr;
    }

    После такой записи можно во всех функциях использовать массив без передачи.

    void func()
    {
    parr[i][j]=123;
    }

    ОтветитьУдалить
  10. Спасибо, все прекрасно работает! (VS2010)

    ОтветитьУдалить