как передать в функцию указатель на массив?
- Войдите на сайт для отправки комментариев
Ср, 19/08/2020 - 19:31
хочу скопировать один массив в другой. для этого запускаю цикл for
arr[8]; arr2[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
for(int i = 0; i < 8; i++){ arr[i] = arr2[i]; }
все работает прекрасно. но хочу сделать это функцией и передавать ссылку на массивы
void copyarr(byte *lincarr){ for(int i = 0; i < 8; i++){ arr[i] = lincarr[i]; } }
тоже работает но памяти больше занимает. такое ощущение что не ссылку даю а массив копирую
а все же почему у меня память увеличивается?
а все же почему у меня память увеличивается?
приведите оба варианта кода, чтобы можно было скомпилировать и сравнить занимаемую память, теоретически обсуждать бессмысленно
Вы не передаёте ссылку, Вы передаёте указатель на 0-ой элемент.
приведите оба варианта кода, чтобы можно было скомпилировать и сравнить занимаемую память, теоретически обсуждать бессмысленно
вот так это занимает 8 байт а если через функцию то 16
код "через функцию" тоже выложите, чтобы нам не гадать
вот тут уже 16 байт
del
вот тут уже 16 байт
А теперь давайте удалим откровенно бредовую строчку
(надеюсь, Вы понимаете, почему она бредовая)
И случится чудо:
и
Вот, как-то так :-)
да просто теперь компилятор понял что это все без толку и скомпилировал вырезав весь код
заметьте что код в обоих случаях одинаковый. но памяти занимает разно
Что значит одинаковый и что значит "разно".
Код у Вас неодинаковый.
А памяти без откровенного бреда занимает одинаково.
ну а в чем бред? в том что копировал и забыл исправить 8 на 7? или в том что смысла в нем нет?
так лучше?
так лучше?
С точки зрения бреда - лучше. С точки зрения памяти - одинаково
почему же меня не понять.
создайте массив byte arr3[8000000]; и попробуйте скомпилировать. скомпилировалось а памяти не убавилось. вот чудеса
Понятное дело - оптимизатор его выкинет, если в коде обращений не будет к элементам. Ловкость рук и никакого мошенства.
создайте массив byte arr3[8000000]; и попробуйте скомпилировать. скомпилировалось а памяти не убавилось. вот чудеса
Это Вы мне предлагаете? Ну, если Вы это понимаете, то зачем этот топик? Или только сейчас поняли?
В чём цимес-то?
почему же меня не понять.
создайте массив byte arr3[8000000]; и попробуйте скомпилировать. скомпилировалось а памяти не убавилось. вот чудеса
так вы не просто массив создайте, а попробуйте что-нибудь с ним сделать - все сразу станет ясно
так вот именно для этого я и написал
-------------------------
давайте немного по другому. с точки зрения компилятора вот этот код (плохой, бесполезный, ненужный это все понятно) -
аналогичен вот этому ?
тогда почему память занята разная?
Полагаю потому, что: Вы передаёте в функцию КОПИЮ массива, а не сам массив. Сам массив передают по ссылке.
будьте добры подскажите как правильно
Вот мы щас все бросим и начнем гадать, какие паттерны у оптимизатора отрабатывают.
А так я только последний вопрос прочёл, и не знаю что Вам нужно в итоге. Если просто передать массив целиком в функцию - так используйте адрес, а не указатель. А точнее это называется «разименование адреса» (простите гуру, если не верно написал).
давайте немного по другому.
Постом выше я ваш же код и привел. Вам же все равно строка с записью в нулевой пин не нужна. А без нее память расходуется абсолютно одинаково
только вопрос почему с ней же второй код на 8 байт короче остается не разгаданным
Вопрос конечно интересный ;) https://tsibrov.blogspot.com/2019/06/ide-arduino-disassembling.html
без функции:
С функцией копирования:
В первом случае, без функции копирования, в ОЗУ программно тупо копируются константы (в массив arr).
Скетч использует 692 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 17 байт
(резервирование ОЗУ под один массив)
Во втором случае, с функцией, данные arr1 прописанные в флэше, сначала копируются в ОЗУ, далее из ОЗУ arr1 копируются в область ОЗУ для arr.
Скетч использует 706 байт (2%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 25 байт
(резервирование ОЗУ под два массива)
Любопытно..
И в случае неиспользования в теле скетча, оптимизируются в 0 компилятором, и код и данные.
Скетч использует 444 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт
аналогичен вот этому ?
Да, нет же! Я ж Вам ещё в #12 писал, что они принципиально разные!
Мне казалось по последним постам, что Вы это понимаете. Или просто троллите нас?
только вопрос почему с ней же второй код на 8 байт короче остается не разгаданным
А по вашему для вызова функции не надо никаких команд?