Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.13.255] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Суть такова: для определенных циклических вычислений вычислений мне необходимо определенные диапазоны массива пересчитывать через разные функции, причем им передается массив как таковой и его длина. Покумекав вспомнил, что можно сделать указатель на массив, сместив индекс на нужное значение. Покопался в статьях, помучился методом проб и ошибок и получил вот такую конструкцию:
//Инициализируем массив 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, но в обратно порядке. Для получения зеркального набора значений? Заранее спасибо за помощь! |
Сообщ.
#2
,
|
|
|
Цитата Kearvan @ //Теперь у наc 2 массива. ar[] p[]. Причем ar[5]=p[0] //и значения связаны. Операция с любым членом изменит оба. //Есть одна проблема - длина массива p[] не указана. Можно вылететь за массив и набедокурить в другой памяти. Не два у вас массива, а по прежнему один. Просто указатель p указывает на пятый элемент в массиве ar. Длину можно использовать - (sizeof(ar)/sizeof(ar[0])) - длина массива. |
Сообщ.
#3
,
|
|
|
Kearvan, сделанное - это Си-подход. Используя "плюшки" С++ можно всю эту кухню оформить в виде собственного класса, с проверками на выходы за границы массива. Для осуществления проверок можно использовать, как хранитель массива - std::vector, а как способ доступа к элементу - метод std::vector::at. В этом случае, при выходе за пределы std::vector выбросит исключение std::out_of_range. Для своих нужд можно определить свой метод/методы At, с несколькими параметрами (в том числе и с параметром, определяющим способ выборки элементов). Как еще один вариант - можно реализовать набор собственных итераторов, с помощью которых получать доступ к элементам в нужном порядке и с нужными смещениями.
|
Сообщ.
#4
,
|
|
|
Цитата KILLER Не два у вас массива, а по прежнему один. Спасибо, я неправильно выразился. Как раз и была идея не создавать новый массив для расчетов (потому что в микроконтроллерах и так памяти мало), а создать именно "ссылку" или "указатель" на участок массива для расчетов с другим именем как с отдельным массивом. Прошу простить мое косноязычие - я стихийный самоучка и путаю термины. Цитата JoeUser можно использовать, как хранитель массива - std::vector, а как способ доступа к элементу - метод std::vector::at. Спасибо за указанное направление, но вряд ли мне подойдет этот способ. В Arduino IDE все это происходит как-то волшебно, я не разобрался. А в пиндосськой мове я весьма не силен. Все таки для "отзеркаливания" части массива придется использовать вспомогательный массив. |
Сообщ.
#5
,
|
|
|
Цитата Kearvan @ Спасибо за указанное направление, но вряд ли мне подойдет этот способ. В Arduino IDE все это происходит как-то волшебно, я не разобрался. А в пиндосськой мове я весьма не силен. Всё как обычно, инклюдите vector, и пишите как на обычных плюсах. Вы не заметите никакой разницы. Памяти там предостаточно, если оптимально использовать всё что вам дано, никаких проблем испытывать не будете. Вот когда у вас будут контроллеры с сотней-двумя килобайт памяти - тогда думайте о таких извращениях, а щас у вас всего в достатке. |
Сообщ.
#6
,
|
|
|
Цитата VisualProg Вот когда у вас будут контроллеры с сотней-двумя килобайт памяти... Извините, уважаемый VisualProg, но у меня контроллеры с 32kB памяти и всего лишь 2kB под переменные. Так что эти извращения жизненно необходимы. По факту моя проблема только что решилась: Методом из кода первого поста я ссылаюсь на произвольные участки массива и передаю их функциям сторонней библиотеки на обработку. Для "зеркальной" обработки оказалось проще дописать в библиотеку "зеркальную" функцию. Всем большое спасибо за помощь!!! Венсеремос! |
Сообщ.
#7
,
|
|
|
Цитата Kearvan @ Извините, уважаемый VisualProg, но у меня контроллеры с 32kB памяти и всего лишь 2kB под переменные. Так что эти извращения жизненно необходимы. О таком надо сразу предупреждать в вопросе) Цитата Kearvan @ По факту моя проблема только что решилась: Методом из кода первого поста я ссылаюсь на произвольные участки массива и передаю их функциям сторонней библиотеки на обработку. Для "зеркальной" обработки оказалось проще дописать в библиотеку "зеркальную" функцию. Всем большое спасибо за помощь!!! Венсеремос! При открытых сорсах - это самое действенное решение. |
Сообщ.
#8
,
|
|
|
Цитата VisualProg @ О таком надо сразу предупреждать в вопросе) ! Посты с оффтопиком перенесены в тему "Вопросы использования Arudino". Здесь мы обсуждаем язык программирования С/C++ и его конструкции. Особенности применения языка обсуждаются в смежных разделах. Просьба это учитывать. Сообщения были разделены в тему "Размер массива-параметра функции" Сообщения были разделены в тему "Размер массива-параметра функции" |