| Микроконтролери и електроника 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: Как да направя масив от константи? | |||||||||
Той говори за препроцесора - т.е. в процеса на компилиране да попълва константите по някаква формула - това не го знам как става. Гурутата могат да кажат повече. Иначе е ясно, че в програмата при ициализация в началото може да се направи с масив от променливи. |
||||||||||
| Автор: | 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: Как да направя масив от константи? | ||||||||||||||||||
Може би малко те подведох... Значи по принцип в С++ работиш със стандартната библиотека (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) ще е да кажем така:
може и макрос за N1000 и N10000 да се напишат, но не бива да се прекалява че компилатора почва да се шашка |
|||||||||||||||||||
| Автор: | al_at [ Чет Мар 28, 2024 1:55 pm ] |
| Заглавие: | Re: Как да направя масив от константи? |
Ето още "гимнастики": https://stackoverflow.com/questions/319 ... eprocessor |
|
| Автор: | iss [ Чет Мар 28, 2024 1:56 pm ] |
| Заглавие: | Re: Как да направя масив от константи? |
В случая за генериране на данни/код по време на компилиране се изисква цикъл. (приема се и "рекурсия" за верен отговор, но цикъл е по-по (приема се и "скриптовото" генериране за верен отговор!) Та цикъл се прави с ... макроси - и решението идва само => асемблер Във файл (напр.): 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: Как да направя масив от константи? |
А гпт-то какво казва по въпроса? |
|
| Автор: | al_at [ Чет Мар 28, 2024 3:42 pm ] | |||||||||
| Заглавие: | Re: Как да направя масив от константи? | |||||||||
Ако успееш да формулираш въпроса, може да опиташ. Иначе, ето още една идея: https://stackoverflow.com/questions/128 ... eprocessor |
||||||||||
| Автор: | Н'бабане Гт'муан'га [ Чет Мар 28, 2024 3:57 pm ] | ||||||||||||||||||
| Заглавие: | Re: Как да направя масив от константи? | ||||||||||||||||||
Е то ако не успееш... Какво питаш тогава? |
|||||||||||||||||||
| Автор: | al_at [ Чет Мар 28, 2024 4:18 pm ] |
| Заглавие: | Re: Как да направя масив от константи? |
Аз не успях /да формулирам въпроса/. Английският не ми е силна страна, а на български мисля, че е безсмислено. Затова си мълча и не питам |
|
| Автор: | slav4o.com [ Чет Мар 28, 2024 4:43 pm ] | |||||||||
| Заглавие: | Re: Как да направя масив от константи? | |||||||||
You Искам да направя масив от константи. Идеята е обаче попълването на масива да го прави препроцесора по някаква зададена формула. Средата е Arduino. ChatGPT ...Тук е важно да отбележим, че препроцесорът в C++ е много прост и не поддържа сложни операции или цикли. Всеки макрос е проста замяна на текст и не може да извършва сложни изчисления или да създава цикли. Във вашия случай, ако искате да генерирате масив с определени стойности, изчислени по формула, единственият начин да го направите ефективно е да използвате функция (както в примера) или да напишете макроси за всеки елемент поотделно, което не е практично за големи масиви. ... |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|