Как создать динамический массив ардуино?
- Войдите на сайт для отправки комментариев
Пнд, 30/01/2017 - 22:42
Доброе время.
В файле на флешке список сотрудников и коды доступа. Как это все грамотно загрузить в массив, если его длинна заранее не известна? Копал копал - не накопал. :/
Доброе время если еще актуально пишите решим вопрос недорого golinskiy.konstantin@gmail.com
В глобальном пространстве имён - только с помощью "сырых" указателей и malloc. И ручками, ручками.
а вот внутри класса - лехко.
работает такие конструкции
использовать:
я тоже по всему гуголю искал - обыскался. методом проб и ошибок только выяснил, что и как.
кстати, в ArduIDE не проверял. У меня Студия 2015+Visual Micro plugin. Хотя, наерно, это больше от GCC зависит.
Кроме массивов есть другие способы хранения данных, например, списки. Весь вопрос в задаче, что лучше использовать массив или список.
Если внутри функции, так просто объявите массив переменной длины прямо в лоб.
:))))))
«все настоящие программисты знают, единственной полезной структурой данных является массив»
:))))))
Вопрос в том, как это правильно сделать. Допустим я могу пробежаться по файлу и посчитать количество сотрудников. Объявить массив из этого количества - вот в чем вопрос.
Если внутри функции, так просто объявите массив переменной длины прямо в лоб.
Вопрос в том, как это правильно сделать. Допустим я могу пробежаться по файлу и посчитать количество сотрудников. Объявить массив из этого количества - вот в чем вопрос.
Если внутри функции, так просто объявите массив переменной длины прямо в лоб.
Так я ж пишу "прямо так в лоб".
Функция же obrabotka выглядит так:
Вот это круто, если оно так будет работать. Сейчас буду пробовать.
Я вот кстати объявил вот такой массив прямо в setup после подсчета сотрудников
Что меня удивило - так это то, что компилятор не обругался. Буду пробовать оба варианта.
Вопрос в том, как это правильно сделать. Допустим я могу пробежаться по файлу и посчитать количество сотрудников. Объявить массив из этого количества - вот в чем вопрос.
Если внутри функции, так просто объявите массив переменной длины прямо в лоб.
Так я ж пишу "прямо так в лоб".
Функция же obrabotka выглядит так:
Короткая лекция, даже, скорее, просто замечание, о распределении памяти при компиляции и работе программ на Ардуино.
1. Стек - это как обойма у автомата Калашникова, - заполняется снизу, для простоты - от адреса 0.. Новый объект в памяти кладется поверх старого и используется. При ненужности - освобождается память, занимаемая самым верхним объектом.
2. Куча - ровно наоборот - растет вниз, от верхнего свободного адреса. Расет куча вниз, к стеку. ВСЯ сободная память - между ними.
========================
Пользуясь этими знаниями можно решать Вашу проблемму двумя способами:
1. поместить массив в стек. Это происходит всегда, когда переменная (в нашем случае массив) объявляется ВНУТРИ функции, после выхода из функции - память освобождается.
Стандарт С++ никаких ограничений на такой массив не накладывает, объявляйте его, также как и статический, просто указав переменную вместо числа:
Недостатки - покинуть функцию уже нельзя. Весь остальной код, если ему нужен это массив, должен работать внутри функции.
2. Куча. Зная как работает куча на Ардуино, очень легко ей оперировать.
Отведите память с запасом функцией malloc(), но больше всей, конечно!
После заполнения данными - излишки освободите, вызвав realloc() с уже вычисленным объемом.
Поскольку, по мере заполнения памяти с SD карты, Вы никак не работаете с кучей, то уменьшение запрошенного объема до актуального отработает корректно.
Я бы пошел этим путем. Удобно, модно, молодежно. И не нужно свой список два раза проходить.
Здравствуйте, попробовал применить код, но не компилируется. В C,C++ не силен. Выдает ошибку: invalid application of 'sizeof' to incomplete type 'fillingPressureArray()::Emp_code'
Ругается на строку: struct Emp_Code * empcode = (struct Emp_Code *) malloc(sizeof(struct Emp_code) * 100);
dardik - а сама структура у вас описана? покажите как
Скетч неполный, потому сказать ничего невозможно. Никто ведь не знает как именно описана
struct
Emp_Code
тут вообще какая-то чушь написана. указатель локален и никуда не отдается. Ошибка там, скорее всего детская - типа скобки не там, но это и не важно.
указатель локален и никуда не отдается.
так и память не освобождается. Но по этому вопросу никаких запросов от автора не поступало. Он спросил за компиляцию :)
Я не создавал структуру - не знаю как это делается ((. Мне понравился ваш подход, что не надо 2 раза файл перечитывать. С указателями и структурами не работал((. Суть - считать строки с SD карты, распарсить и записать в массив типа int.
В коде, что я написал, я пытался строки в массив записать
Так, а от нас-то Вы чего ждёте? Если Вы не создавали структуру, но пытаетесь завхватить под неё память ... ну, не получается у Вас, понятно. Учитесь создавать структуры. Литературы навалом, в т.ч. в первой теме раздела "Песочница".
Я понял, буду изучать.
Вопрос в том, как это правильно сделать. Допустим я могу пробежаться по файлу и посчитать количество сотрудников. Объявить массив из этого количества - вот в чем вопрос.
Если внутри функции, так просто объявите массив переменной длины прямо в лоб.
Так я ж пишу "прямо так в лоб".
Функция же obrabotka выглядит так:
Евгений, а если static int massiv [N] ( т.е. внутри функции obrabotka() объявляется static int massiv [N]) ? Не могу додумать как этом случае быть, компилятор выдает ошибку "error: storage size of 'massiv' isn't constant".
При static int massiv[N] число N должно быть известно на этапе компиляции.
salik, ты лучше скажи чотыхошь, а мы скажем четенада.
При static int massiv[N] число N должно быть известно на этапе компиляции.
Спасибо