Отговори на тема  [ 18 мнения ]  Отиди на страница 1, 2  Следваща
Как да направя масив от константи? 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Ное 11, 2005 9:30 am
Мнения: 142
Местоположение: София
Мнение Как да направя масив от константи?
Средата е Arduino.
Искам да направя масив от константи.
Например ето този код работи:

#define arrSize 100
#define arr {\
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\
.... и т.н. \
90, 91, 92, 93, 94, 95, 96, 97, 98, 99\
}
const int table[] = arr;

Идеята е обаче попълването на масива да го прави препроцесора по някаква зададена формула.
Нещо като:

#define arrSize 100
#define arr {\
for (i = 0; i < arrSize; i++) {
arr[i] = 5 * i; //примерно
}
}
const int table[] = arr;

С това второто обаче не знам как да се справя!
Ако някой може да помогне...


Сря Мар 27, 2024 8:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 06, 2007 8:44 pm
Мнения: 3175
Местоположение: Пловдив
Мнение Re: Как да направя масив от константи?
Сигурно аз нещо не разбирам, но хем говориш за константи, хем искаш процесора при стартирането на програмата сам да ги смята и попълва.

Константите обикновено са разположени във флаша на процесора и са поставени там по време на компилирането на програмата.

Щом искаш да ги променяш/генерираш и попълваш от самата програма след стартирането и - защо въобще мислиш и говориш за константи?


Чет Мар 28, 2024 9:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение Re: Как да направя масив от константи?
emilvtc написа:
Сигурно аз нещо не разбирам, но хем говориш за константи, хем искаш процесора при стартирането на програмата сам да ги смята и попълва.

Константите обикновено са разположени във флаша на процесора и са поставени там по време на компилирането на програмата.

Щом искаш да ги променяш/генерираш и попълваш от самата програма след стартирането и - защо въобще мислиш и говориш за константи?

Той говори за препроцесора - т.е. в процеса на компилиране да попълва константите по някаква формула - това не го знам как става. Гурутата могат да кажат повече.
Иначе е ясно, че в програмата при ициализация в началото може да се направи с масив от променливи.


Чет Мар 28, 2024 11:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Как да направя масив от константи?
Препроцесорът не поддържа рекурсия. Има трикове, но са много грозни и не ги препоръчвам.

Това, което може с препроцесора е да смята без рекурсия. Примерно ако функцията е индекса по 5, то може да се направи макрос от сорта:
#define FILL(X) ((x)*5)

и после да се ползва
const int arr = {FILL(1), FILL(2)....}

В Ардуино обаче съм чувал че се поддържа Ц++ или греша?
При Ц++ има шаблони, има constexpr функции, има инициализации... Така че няма проблем да се генерират каквито и да е данни compile time, включително и да се изпълнява код пак compile time. Пълно е с примери в нета...


Чет Мар 28, 2024 11:17 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Ное 11, 2005 9:30 am
Мнения: 142
Местоположение: София
Мнение Re: Как да направя масив от константи?
Да. Поддържа C++.
С търсенето на примери в интернет нещо не се справих.


Чет Мар 28, 2024 11:23 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Как да направя масив от константи?
може да използваш и platform.local.txt (Арду ИДЕ )
малко тъпо е направено
https://arduino.github.io/arduino-cli/0 ... no-ide-165

и да страртираш някъв скрипт ( примерно Питон ) за създаване на масива или квото и да е
и после #include file.h


за ПлатформИО има https://docs.platformio.org/en/latest/s ... tions.html

_________________
main[-1u]={1};


Чет Мар 28, 2024 12:07 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Как да направя масив от константи?
xor написа:
Да. Поддържа C++.
С търсенето на примери в интернет нещо не се справих.


Може би малко те подведох... Значи по принцип в С++ работиш със стандартната библиотека (STL) и с контейнери (без значение дали са масиви и т.н.). Там може да си ги инициализираш както си искаш, но проблемът е че те самите не може да са във флаша (а предполагам това е целта).
Ако инициализацията е в constexpr конструктор би трябвало (но не е гарантирано) да е compile time. Но пак не е във флаша и на практика има смисъл само ако изчисленията са сложни.
В по-новите версии (Cx017 0x20) има и ламбди и други трикове, но май и те няма да свършат работа.

Освен пак гадните трикове на стария препроцесор...

Да кажем, че искаш да генерираш поредица от числата до 100...

#define N10(X) X+0, X+1, X+2, X+3, X+4, X+5, X+6, X+7, X+8, X+9
#define N100(X) N10(X+0), N10(X+10), N10(X+20), N10(X+30), N10(X+40), N10(X+50), N10(X+60), N10(X+70), N10(X+80), N10(X+90)

const int table[] = {N100(0)};


едит всъщност по-красиво и с произволна функция (*5) ще е да кажем така:

Код:
#define N1(index)  (index)*5
#define N10(X)  N1(X+0), N1(X+1), N1(X+2), N1(X+3), N1(X+4), N1(X+5), N1(X+6), N1(X+7), N1(X+8), N1(X+9)
#define N100(X)  N10(X+0), N10(X+10), N10(X+20), N10(X+30), N10(X+40), N10(X+50), N10(X+60), N10(X+70), N10(X+80), N10(X+90)

const int table[] = {N100(0)};


може и макрос за N1000 и N10000 да се напишат, но не бива да се прекалява че компилатора почва да се шашка ;-)


Чет Мар 28, 2024 1:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение Re: Как да направя масив от константи?
Ето още "гимнастики":
https://stackoverflow.com/questions/319 ... eprocessor


Чет Мар 28, 2024 1:55 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Съб Фев 06, 2016 8:29 pm
Мнения: 237
Мнение Re: Как да направя масив от константи?
В случая за генериране на данни/код по време на компилиране се изисква цикъл.
(приема се и "рекурсия" за верен отговор, но цикъл е по-по :)).
(приема се и "скриптовото" генериране за верен отговор!)

Та цикъл се прави с ... макроси - и решението идва само => асемблер :twisted:
Във файл (напр.): array.S се слага:
-------------------------------------
.macro table N
.set count,0
.rept \N
.byte \count
.set count,count+1 <- тук нещо като формула за всеки байт
.endr
.byte
.endm

.section .rodata
.globl arr
arr: table 100 <- тук колкото данни трябват
.end
-------------------------------------
(пиша по памет, може да има грешки)
И те така!


Чет Мар 28, 2024 1:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2277
Мнение Re: Как да направя масив от константи?
Моите пет стотинки...

След 2-3 месеца(може и по-малко :)) "... кой ши***як е писал това?"...
Търсенето на грешки в такъв код ще е едно (не)приятно приключение.
Ако константите се менят често - няма нужда да са константи. Ако не се менят често - ръчно или външен генератор.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!


Чет Мар 28, 2024 2:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Как да направя масив от константи?
А гпт-то какво казва по въпроса? :D

_________________
'просто' е технически синоним на 'красиво'


Чет Мар 28, 2024 3:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение Re: Как да направя масив от константи?
Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

Ако успееш да формулираш въпроса, може да опиташ. :)
Иначе, ето още една идея:
https://stackoverflow.com/questions/128 ... eprocessor


Чет Мар 28, 2024 3:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 9:14 am
Мнения: 5298
Мнение Re: Как да направя масив от константи?
al_at написа:
Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

Ако успееш да формулираш въпроса, може да опиташ. :)
Иначе, ето още една идея:
https://stackoverflow.com/questions/128 ... eprocessor


Е то ако не успееш... Какво питаш тогава? :D

_________________
'просто' е технически синоним на 'красиво'


Чет Мар 28, 2024 3:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Апр 13, 2018 4:00 pm
Мнения: 1622
Местоположение: София
Мнение Re: Как да направя масив от константи?
Аз не успях /да формулирам въпроса/.
Английският не ми е силна страна, а на български мисля, че е безсмислено.
Затова си мълча и не питам :)


Чет Мар 28, 2024 4:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Как да направя масив от константи?
Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

You
Искам да направя масив от константи. Идеята е обаче попълването на масива да го прави препроцесора по някаква зададена формула. Средата е Arduino.

ChatGPT
...Тук е важно да отбележим, че препроцесорът в C++ е много прост и не поддържа сложни операции или цикли. Всеки макрос е проста замяна на текст и не може да извършва сложни изчисления или да създава цикли. Във вашия случай, ако искате да генерирате масив с определени стойности, изчислени по формула, единственият начин да го направите ефективно е да използвате функция (както в примера) или да напишете макроси за всеки елемент поотделно, което не е практично за големи масиви. ...

_________________
https://github.com/slav4ocom/


Чет Мар 28, 2024 4:43 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 18 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни