На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Передача двумерных массивов в функцию
    Как передать двумерный массив в функцию?Помогите, пожалуйста!!!
      Либо использовать массив указателей
      Или
      void f(int *a,int Row,int Col){}

      int main()
      {
      int a[2][2];
      f(&a[0][0],2,2);
      return 0;
      }


      Добавлено в
      Второй метод будет и быстрее (к многомерным массивам доступ происходит медленнее)
        Совсем вылетело из головы, что все равно в элементам надо обращаться в стиле a[j*n+i]
          void f(int ** arr, int n, int m)
          {
          }
          int a[20][20];
          ...
          f(a,20,20);

          должно работатьsmile.gif

          можно фунцию даже так определить:
          void f(int arr[20][]);
          или
          void f(int arr[20][20]);

          . можно еще для разнообразия использовать vector<vector<int> >
          (вектор векторов)
            Demo_S

            void f(int ** arr, int n, int m)
            {
            }
            int a[20][20];
            ...
            f(a,20,20);

            Ты сам такую фишку пробовал? wink.gif
            Я как-то писал прожку и тоже воспоользовался такой штукой.. И вот у меня возникало исключение.. Долго искал ошибку, потом дошло, что двумерный массив это не указатель на указатель...
            Так что это не сработает.
            А вот это должно сработать:
            void f(int arr[20][]);
            или
            void f(int arr[20][20]);
              Цитата (byte @ 5.12.03, 16:35)
              Demo_S

              void f(int ** arr, int n, int m)
              {
              }
              int a[20][20];
              ...
              f(a,20,20);

              Ты сам такую фишку пробовал? wink.gif
              Я как-то писал прожку и тоже воспоользовался такой штукой.. И вот у меня возникало исключение.. Долго искал ошибку, потом дошло, что двумерный массив это не указатель на указатель...
              Так что это не сработает.
              А вот это должно сработать:
              void f(int arr[20][]);
              или
              void f(int arr[20][20]);

              Это работает, если двумерный массив создать динамически, тогда получается массив указателей на указатели smile.gif
                да. сори, так
                void f(int ** arr, int n, int m)
                {
                }
                int a[20][20];
                ...
                f(a,20,20);

                низя.

                Lavrik правильно сказал, я просто давно уже статические массивы не использую

                int **a=new int* a[10];
                for(int i=0;i<10;i++)
                a[i]=new int[10];
                ....
                f(a,10,10);
                ...
                for(int i=0;i<10;i++)
                delete[] a[i];

                delete[] a;

                вот что имелось ввиду:)
                  int a[2][2];
                  f(&a[0][0],2,2);

                  Вариант одобренный стандартом (во всяком случае так стоит у меня в книге biggrin.gif )
                  Но по-моему лучше написать один раз шаблон, когда одномернуй массив эмулирует двумерний.
                  Немного больше проблем с массивами большей размерности.
                    Поднимаю тему.

                    Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ?

                    И лучшим по простоте и понятности( :rolleyes: ) способом остается
                    ExpandedWrap disabled
                      int a[2][2];
                      f(&a[0][0],2,2);

                    ?

                    Еще, нам говорили что можно передать таким способом:
                    ExpandedWrap disabled
                      int a[10][10], **st;
                      *st=*a;
                      func(st);

                    но он не работает.
                      Цитата Ilar @
                      Поднимаю тему.

                      Интересно с какой целью? Новую создать так тяжело? Блин сообщения за 2003 год откопал...
                          оффтоп
                          n0rd, а потом мы жалуемся, что люди не пользуются поиском...
                          Ilar, правильно сделал

                          Цитата Ilar @
                          Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ?

                          объяву func покажи

                          ExpandedWrap disabled
                            *st=*a;

                          куда ты записываешь *a?
                          скажи словами

                          Добавлено
                          Цитата ElcnU @
                          недавно обсуждали

                          гы, тогда не очень правильно сделал
                            Цитата Alek86 @
                            n0rd, а потом мы жалуемся, что люди не пользуются поиском...

                            Если поиск не дал ответов на вопрос, нефиг заниматься некромантией.
                              n0rd, проблема актуальна, написанный ранее код/утверждения так же верны сейчас, как и тогда. Почему же вас так смущает дата ?

                              ElcnU, я не С++ Builder использую, да и в той теме автору нужно передать массив не меняя объявление функции. Здесь же вопрос как лучше передать такой массив.

                              Alek86, объявление простое, для проверки:
                              ExpandedWrap disabled
                                void func(**a)
                                Цитата Ilar @
                                Может кто-то объяснить или ткнуть в объяснение почему для двумерного массива "a[5][5]" неверно написание "func(**a)" ?
                                Действительно, тема поднималась неоднократно. Поищи получше или (что ещё лучше) попробуй понять сам, основываясь на том, что
                                ExpandedWrap disabled
                                  int a[5][5];
                                  int **b;
                                   
                                  const size_t size1 = sizeof(*a); // == sizeof(int)*5
                                  const size_t size2 = sizeof(*b); // == sizeof(int*)
                                   
                                  const bool equals = size1==size2; // == false (Win32 and x86)
                                Сообщение отредактировано: Qraizer -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0425 ]   [ 16 queries used ]   [ Generated: 2.05.24, 04:04 GMT ]