локальный массив в фукнции Loop()
- Войдите на сайт для отправки комментариев
Пт, 05/03/2021 - 12:20
Привет. Столкнулся с такой задачей. Необходимо создать локальный массив, величина которого задается в секции Setup().
Т.к секция Loop() выполняется в бесконечном цикле, то массив надо объявить один раз. Полученный код не пропускает компилятор, требуя объявлять массив безусловно, т.е без if. Как решить мою задачу?
boolean Flag = true; byte Max_Star; void setup() { Max_Star=5; } void loop() { if (Flag) { int Mas[Max_Star]; Flag=false; } Mas[1]=3; }
Массив видно только в обрамляющих его "{" "}"
понял. А какие есть варианты решения моей задачи? Глобальный массив требует известного заранее кол-ва элементов
можно его объявить в Setup и передать в Viod?
понял. А какие есть варианты решения моей задачи?
Мля, да поменяйте ж Вы местами строки №№ 8 и 9
более чем спасибо.
Какой сокральный смысл объявлять массив только если выполняется условие?
Какой сокральный смысл объявлять массив только если выполняется условие?
Дофига смыслов может быть
Например если массив нужен только при определенном условии
более чем спасибо.
рано благодарите :) Полученный код скомпилируется, но будет работать не так, как вы ожидаете.
Какой сокральный смысл объявлять массив только если выполняется условие?
Штобы память сыканомить. Вдруг понадобится в другом месте.
del (глупость написал)
PS http://arduino.ru/forum/programmirovanie/kak-sozdat-dinamicheskii-massiv-arduino
А Max_star на момент компиляции не известна? То есть значение приходит откуда-то в момент старта контроллера?
Rumata, обычное дело - читаем размер из EEPROM, например.
Какой сокральный смысл объявлять массив только если выполняется условие?
Штобы память сыканомить. Вдруг понадобится в другом месте.
уже и в микроконтроллерах вычислительный ресурс стали продавать налево?
уже и в микроконтроллерах вычислительный ресурс стали продавать налево?
https://www.youtube.com/watch?v=EHc2TG90VWM
https://docs.microsoft.com/ru-ru/cpp/cpp/new-and-delete-operators?view=m...
Какой сокральный смысл объявлять массив только если выполняется условие?
Штобы память сыканомить. Вдруг понадобится в другом месте.
В области видимости массива (или любой другой переменной) это понятно, но в примере ТС мне не понятно. Судя по его коду - если флаг стоит - объявляем переменную, которая должна быть «видима» где-то ещё.
Я, наверное, вопрос не верно сформулировал.
Размер массива по умалчиванию считывается из Epprom. Потом его размер может меняться в процессе работы программы, через последовательный порт.
Я думал что если определить массив в секции Loop без условия, то при каждой итерации Loop под него будет выделяться память в разных частях Heap. И в итоге у меня будут теряться данные масива.
рано благодарите :) Полученный код скомпилируется, но будет работать не так, как вы ожидаете.
- как ни странно все отлично работает. Пока...
Размер массива по умалчиванию считывается из Epprom. Потом его размер может меняться в процессе работы программы, через последовательный порт.
Я думал что если определить массив в секции Loop без условия, то при каждой итерации Loop под него будет выделяться память в разных частях Heap. И в итоге у меня будут теряться данные масива.
Тут два варианта:
1. В конце цикла массив уничтожается ,освобождая занимаемые адреса(освобождает память), и в начале цикла создаётся заново.
2. Массив имеет тип static и адреса закрепляются за ним на все время работы программы.
ЗЫ: Это справедливо для Ардуино.
ЗЗЫ: рекомендую спросить в Гугле и ознакомится с информацией по запросу "область видимости и время жизни переменных в C++"
Вариант 2 - не получится, static не работает для нашего случая
А вот так, правильно?
Помогите пож. Ничего не понимаю.
Вот код:
В результате в последовательном порту имеем такую картину:
Star Mas[0]; ??
Если сделать безусловный вход в условие, то все работает!
В порту имеем:
RainMan - еще раз, внимательно, прочитайте что написал дон Румата в #23.
так
вы тоже, что ли, "учитесь по примерам", а книжки читать не умеете?
Вы размер массива определили в 0 элементов. Я вообще много нового узнал сейчас об инициализации несуществующих элементов массива :) Шаблон слегка треснул у меня, пойду пивом лечиться ))
спасибо! Давно читал, уже забыл что-то.
много нового узнал сейчас об инициализации несуществующих элементов массива :)
в этом-то как раз нет ничего удивительного. Типичный выход за границу. Ничем не отличается от случая обьявления массива byte arr[5] и потом присвоения значения элементу arr[5] = 1 :))))
Типичный выход за границу. Ничем не отличается от случая обьявления массива byte arr[5] и потом присвоения значения элементу arr[5] = 1 :))))
Это все понятно. Меня поразило, что у него это ПОЛУЧИЛОСЬ
ЗЗЫ: рекомендую спросить в Гугле и ознакомится с информацией по запросу "область видимости и время жизни переменных в C++"
Или здесь почитать.
Это все понятно. Меня поразило, что у него это ПОЛУЧИЛОСЬ
А чего тут удивительного ?
byte b[0] - эквивалент byte* b.
То что он "накакал" в некую область памяти там пролежало недолго :) Надо еще посмотреть чего там накомпилил компилятор :)
А чего тут удивительного ?
byte b[0] - эквивалент byte* b.
Мало того, что он положил байт в "необъявленную" ячейку памяти, так еще хватило наглости и везения получить его оттуда обратно))
Я бы на месте компилятора просто печать константных значений оставил в коде.
Вот я и говорю, интересно посмотреть . Но лениво :)