На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Передача двумерных массивов в функцию
    Как передать двумерный массив в функцию?Помогите, пожалуйста!!!
      Либо использовать массив указателей
      Или
      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 -
                                  Цитата Ilar @
                                  я не С++ Builder использую

                                  не принципиально для данного вопроса, синтаксис тот же, С++
                                  Цитата Ilar @
                                  Здесь же вопрос как лучше передать такой массив.

                                  как передать именно такой статический массив там есть решение(9й,12й пост)
                                  но это при определенных условиях
                                  ExpandedWrap disabled
                                    #include <iostream>
                                    typedef int arrayint5x5_t [5][5];
                                    void foo(arrayint5x5_t  arr)
                                    {
                                      for(int i=0;i<5;++i)
                                        for(int ii=0;ii<5;++ii)
                                        std::cout<<arr[i][ii]<<"  ";
                                    }
                                     
                                    int main()
                                    {
                                      int ar[5][5];
                                      for(int i=0;i<5;++i)
                                        for(int ii=0;ii<5;++ii)
                                          ar[i][ii]=i*ii+ii;
                                      foo(ar);
                                    }

                                  там есть еще варианты, посмотри ;)
                                    Цитата Ilar @
                                    Здесь же вопрос как лучше передать такой массив.

                                    Если размерность фиксированная (size1 * size2), то так

                                    ExpandedWrap disabled
                                      f(Type (&arr)[size2][size1]);

                                    или так

                                    ExpandedWrap disabled
                                      f(Type (*arr)[size2][size1]);
                                      Здраствуйте. Подскажите пожалуйста, как передать массив строк, количество которых n? Задал я его динамически таким способом:
                                      ExpandedWrap disabled
                                           char **str;
                                           str=(char**)calloc(n,sizeof(char*));
                                           for(int i=0;i<n;i++)
                                            str[i]=(char*)calloc(MAX_LEN,sizeof(char));


                                      А передать его в функцию никак не могу..((
                                      Когда пишу вот так:
                                      ExpandedWrap disabled
                                        ExcStr(str,n);

                                      то Builder ругается:
                                      E2034 Cannot convert 'char * *' to 'char ( *)[10240]'
                                      E2342 Type mismatch in parameter 'str' (wanted 'char ( *)[10240]', got 'char * *')

                                      З.Ы. Эту тему читал полностью, но как передать вот такое, как у меня, к сожалению не понял :(
                                      Сообщение отредактировано: Tolias -
                                        Странный вопрос - компилятор же тебе прямо написал, как переделать:
                                        ... ExcStr(char** str, int n);
                                          Пожалуй самый казуальный способ передачи массива в функцию - это применение структуры :P
                                          ExpandedWrap disabled
                                            using namespace std;
                                            struct MyStruct{
                                              float arr[2][2];
                                            };
                                            void AnyFunc(MyStruct );
                                            int main()
                                            {
                                              MyStruct a;
                                              a.arr[0][0]=1.1;
                                              a.arr[0][1]=2.2;
                                              a.arr[1][0]=3.3;
                                              a.arr[1][1]=4.4;
                                              AnyFunc(a);
                                             
                                              system("pause");
                                              return 0;
                                            }
                                            void AnyFunc(MyStruct a)
                                            {
                                              for(int i=0; i<2; i++)
                                                for(int j=0; j<2; j++)
                                                  cout<<a.arr[i][j]<<" : ";
                                                cout<<endl;
                                            }

                                          Никаких указателей, все четко и просто...
                                            Не самый, но вполне достаточно. Далеко не всегда в цели входит передача копии массива постоянного размера.
                                              Цитата Qraizer @
                                              Далеко не всегда в цели входит передача копии массива постоянного размера.

                                              Это как это далеко не всегда ? я не в том смысле что наехать, я спрашиваю, обычно передают по:
                                              const MyStruct& perem
                                              Просот есл иамперсанд убрать бред получица полный, этож будет весь массив скопирован во внутрений объект, я просто не видел случаев на своей практике, когда бы это понадобилось...
                                                KILLER, я чёт не понял. Ты согласился или споришь? :unsure:
                                                  Цитата Qraizer @
                                                  KILLER, я чёт не понял. Ты согласился или споришь?

                                                  Я спрашиваю, нафига передавать структуру с массивом по значению а не поссылке ??
                                                    Значит согласился. :)
                                                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                    0 пользователей:


                                                    Рейтинг@Mail.ru
                                                    [ Script execution time: 0,0537 ]   [ 15 queries used ]   [ Generated: 17.05.24, 04:53 GMT ]