На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Дебри связанных массивов, указателей , Помогите понять, что я делаю не так и, по возможности, как это корректно оформить.
    Доброго времени суток! Суть такова: для определенных циклических вычислений вычислений мне необходимо определенные диапазоны массива пересчитывать через разные функции, причем им передается массив как таковой и его длина. Покумекав вспомнил, что можно сделать указатель на массив, сместив индекс на нужное значение. Покопался в статьях, помучился методом проб и ошибок и получил вот такую конструкцию:
    ExpandedWrap disabled
      //Инициализируем массив
      int ar[]={1,2,3,4,5,6,7,8,9,10};
      //Инициализируем указатель на нужный член массива+1
      int* p= ar+5;
      //Теперь у наc 2 массива. ar[] p[]. Причем ar[5]=p[0]
      //и значения связаны. Операция с любым членом изменит оба.
      //Есть одна проблема - длина массива p[] не указана. Можно вылететь за массив и набедокурить в другой памяти.
       
      void setup() {
      Serial.begin(9600);
      delay(1000);
      Serial.println();
      Serial.print("ar[5]=");
      Serial.println(ar[5]);
      Serial.print("p[0]=");
      Serial.println(p[0]);
      p[0]++;
      Serial.println("p[0]++");
      Serial.print("p[0]=");
      Serial.println(p[0]);
      Serial.print("ar[5]=");
      Serial.println(ar[5]);
       
      }

    В целом при проверке меня этот код устроил, кроме опасений вылететь за пределы исходного массива и накосячить в непонятно какой, но явно не предназначенной для этого памяти.
    Но сразу появился вопрос - можно ли эту процедуру выполнить корректнее и можно ли массив p заполнить связанными членами массива ar, но в обратно порядке. Для получения зеркального набора значений?
    Заранее спасибо за помощь!
      Цитата Kearvan @
      //Теперь у наc 2 массива. ar[] p[]. Причем ar[5]=p[0]
      //и значения связаны. Операция с любым членом изменит оба.
      //Есть одна проблема - длина массива p[] не указана. Можно вылететь за массив и набедокурить в другой памяти.

      Не два у вас массива, а по прежнему один. Просто указатель p указывает на пятый элемент в массиве ar. Длину можно использовать - (sizeof(ar)/sizeof(ar[0])) - длина массива.
      Сообщение отредактировано: KILLER -
        Kearvan, сделанное - это Си-подход. Используя "плюшки" С++ можно всю эту кухню оформить в виде собственного класса, с проверками на выходы за границы массива. Для осуществления проверок можно использовать, как хранитель массива - std::vector, а как способ доступа к элементу - метод std::vector::at. В этом случае, при выходе за пределы std::vector выбросит исключение std::out_of_range. Для своих нужд можно определить свой метод/методы At, с несколькими параметрами (в том числе и с параметром, определяющим способ выборки элементов). Как еще один вариант - можно реализовать набор собственных итераторов, с помощью которых получать доступ к элементам в нужном порядке и с нужными смещениями.
          Цитата KILLER
          Не два у вас массива, а по прежнему один.

          Спасибо, я неправильно выразился. Как раз и была идея не создавать новый массив для расчетов (потому что в микроконтроллерах и так памяти мало), а создать именно "ссылку" или "указатель" на участок массива для расчетов с другим именем как с отдельным массивом.
          Прошу простить мое косноязычие - я стихийный самоучка и путаю термины.

          Цитата JoeUser
          можно использовать, как хранитель массива - std::vector, а как способ доступа к элементу - метод std::vector::at.

          Спасибо за указанное направление, но вряд ли мне подойдет этот способ. В Arduino IDE все это происходит как-то волшебно, я не разобрался. А в пиндосськой мове я весьма не силен.

          Все таки для "отзеркаливания" части массива придется использовать вспомогательный массив.
            Цитата Kearvan @
            Спасибо за указанное направление, но вряд ли мне подойдет этот способ. В Arduino IDE все это происходит как-то волшебно, я не разобрался. А в пиндосськой мове я весьма не силен.

            Всё как обычно, инклюдите vector, и пишите как на обычных плюсах. Вы не заметите никакой разницы. Памяти там предостаточно, если оптимально использовать всё что вам дано, никаких проблем испытывать не будете.

            Вот когда у вас будут контроллеры с сотней-двумя килобайт памяти - тогда думайте о таких извращениях, а щас у вас всего в достатке.
              Цитата VisualProg
              Вот когда у вас будут контроллеры с сотней-двумя килобайт памяти...

              Извините, уважаемый VisualProg, но у меня контроллеры с 32kB памяти и всего лишь 2kB под переменные. Так что эти извращения жизненно необходимы.
              По факту моя проблема только что решилась: Методом из кода первого поста я ссылаюсь на произвольные участки массива и передаю их функциям сторонней библиотеки на обработку. Для "зеркальной" обработки оказалось проще дописать в библиотеку "зеркальную" функцию. Всем большое спасибо за помощь!!! Венсеремос!
                Цитата Kearvan @
                Извините, уважаемый VisualProg, но у меня контроллеры с 32kB памяти и всего лишь 2kB под переменные. Так что эти извращения жизненно необходимы.

                О таком надо сразу предупреждать в вопросе)

                Цитата Kearvan @
                По факту моя проблема только что решилась: Методом из кода первого поста я ссылаюсь на произвольные участки массива и передаю их функциям сторонней библиотеки на обработку. Для "зеркальной" обработки оказалось проще дописать в библиотеку "зеркальную" функцию. Всем большое спасибо за помощь!!! Венсеремос!

                При открытых сорсах - это самое действенное решение.
                  Цитата VisualProg @
                  О таком надо сразу предупреждать в вопросе)


                  !
                  Посты с оффтопиком перенесены в тему "Вопросы использования Arudino". Здесь мы обсуждаем язык программирования С/C++ и его конструкции. Особенности применения языка обсуждаются в смежных разделах. Просьба это учитывать.


                  Сообщения были разделены в тему "Размер массива-параметра функции"

                  Сообщения были разделены в тему "Размер массива-параметра функции"
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0295 ]   [ 17 queries used ]   [ Generated: 20.04.24, 01:16 GMT ]