Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Как да направя масив от константи?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=19141
Страница 1 от 2

Автор:  xor [ Сря Мар 27, 2024 8:26 pm ]
Заглавие:  Как да направя масив от константи?

Средата е 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;

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

Автор:  emilvtc [ Чет Мар 28, 2024 9:28 am ]
Заглавие:  Re: Как да направя масив от константи?

Сигурно аз нещо не разбирам, но хем говориш за константи, хем искаш процесора при стартирането на програмата сам да ги смята и попълва.

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

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

Автор:  al_at [ Чет Мар 28, 2024 11:00 am ]
Заглавие:  Re: Как да направя масив от константи?

emilvtc написа:
Сигурно аз нещо не разбирам, но хем говориш за константи, хем искаш процесора при стартирането на програмата сам да ги смята и попълва.

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

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

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

Автор:  miro_atc [ Чет Мар 28, 2024 11:17 am ]
Заглавие:  Re: Как да направя масив от константи?

Препроцесорът не поддържа рекурсия. Има трикове, но са много грозни и не ги препоръчвам.

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

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

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

Автор:  xor [ Чет Мар 28, 2024 11:23 am ]
Заглавие:  Re: Как да направя масив от константи?

Да. Поддържа C++.
С търсенето на примери в интернет нещо не се справих.

Автор:  TheWizard [ Чет Мар 28, 2024 12:07 pm ]
Заглавие:  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

Автор:  miro_atc [ Чет Мар 28, 2024 1:26 pm ]
Заглавие:  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 да се напишат, но не бива да се прекалява че компилатора почва да се шашка ;-)

Автор:  al_at [ Чет Мар 28, 2024 1:55 pm ]
Заглавие:  Re: Как да направя масив от константи?

Ето още "гимнастики":
https://stackoverflow.com/questions/319 ... eprocessor

Автор:  iss [ Чет Мар 28, 2024 1:56 pm ]
Заглавие:  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
-------------------------------------
(пиша по памет, може да има грешки)
И те така!

Автор:  syscop [ Чет Мар 28, 2024 2:13 pm ]
Заглавие:  Re: Как да направя масив от константи?

Моите пет стотинки...

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

Автор:  Н'бабане Гт'муан'га [ Чет Мар 28, 2024 3:33 pm ]
Заглавие:  Re: Как да направя масив от константи?

А гпт-то какво казва по въпроса? :D

Автор:  al_at [ Чет Мар 28, 2024 3:42 pm ]
Заглавие:  Re: Как да направя масив от константи?

Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

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

Автор:  Н'бабане Гт'муан'га [ Чет Мар 28, 2024 3:57 pm ]
Заглавие:  Re: Как да направя масив от константи?

al_at написа:
Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

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


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

Автор:  al_at [ Чет Мар 28, 2024 4:18 pm ]
Заглавие:  Re: Как да направя масив от константи?

Аз не успях /да формулирам въпроса/.
Английският не ми е силна страна, а на български мисля, че е безсмислено.
Затова си мълча и не питам :)

Автор:  slav4o.com [ Чет Мар 28, 2024 4:43 pm ]
Заглавие:  Re: Как да направя масив от константи?

Н'бабане Гт'муан'га написа:
А гпт-то какво казва по въпроса? :D

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

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

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/