|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 11:27 am
Как да направя масив от константи?
| Автор |
Съобщение |
|
xor
Ранг: Новодошъл
Регистриран на: Пет Ное 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 |
|
 |
|
emilvtc
Ранг: Форумен бог
Регистриран на: Вто Фев 06, 2007 8:44 pm Мнения: 3175 Местоположение: Пловдив
|
 Re: Как да направя масив от константи?
Сигурно аз нещо не разбирам, но хем говориш за константи, хем искаш процесора при стартирането на програмата сам да ги смята и попълва.
Константите обикновено са разположени във флаша на процесора и са поставени там по време на компилирането на програмата.
Щом искаш да ги променяш/генерираш и попълваш от самата програма след стартирането и - защо въобще мислиш и говориш за константи?
|
| Чет Мар 28, 2024 9:28 am |
|
 |
|
al_at
Ранг: Форумен бог
Регистриран на: Пет Апр 13, 2018 4:00 pm Мнения: 1622 Местоположение: София
|
 Re: Как да направя масив от константи?
Той говори за препроцесора - т.е. в процеса на компилиране да попълва константите по някаква формула - това не го знам как става. Гурутата могат да кажат повече. Иначе е ясно, че в програмата при ициализация в началото може да се направи с масив от променливи.
|
| Чет Мар 28, 2024 11:00 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11265 Местоположение: Добрич
|
 Re: Как да направя масив от константи?
Препроцесорът не поддържа рекурсия. Има трикове, но са много грозни и не ги препоръчвам.
Това, което може с препроцесора е да смята без рекурсия. Примерно ако функцията е индекса по 5, то може да се направи макрос от сорта: #define FILL(X) ((x)*5)
и после да се ползва const int arr = {FILL(1), FILL(2)....}
В Ардуино обаче съм чувал че се поддържа Ц++ или греша? При Ц++ има шаблони, има constexpr функции, има инициализации... Така че няма проблем да се генерират каквито и да е данни compile time, включително и да се изпълнява код пак compile time. Пълно е с примери в нета...
|
| Чет Мар 28, 2024 11:17 am |
|
 |
|
xor
Ранг: Новодошъл
Регистриран на: Пет Ное 11, 2005 9:30 am Мнения: 142 Местоположение: София
|
 Re: Как да направя масив от константи?
Да. Поддържа C++. С търсенето на примери в интернет нещо не се справих.
|
| Чет Мар 28, 2024 11:23 am |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 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 |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11265 Местоположение: Добрич
|
 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) ще е да кажем така:  |  |  |  | Код: #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 |
|
 |
|
al_at
Ранг: Форумен бог
Регистриран на: Пет Апр 13, 2018 4:00 pm Мнения: 1622 Местоположение: София
|
 Re: Как да направя масив от константи?
|
| Чет Мар 28, 2024 1:55 pm |
|
 |
|
iss
Ранг: Ориентиран
Регистриран на: Съб Фев 06, 2016 8:29 pm Мнения: 237
|
 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 ------------------------------------- (пиша по памет, може да има грешки) И те така!
|
| Чет Мар 28, 2024 1:56 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
 Re: Как да направя масив от константи?
Моите пет стотинки... След 2-3 месеца(може и по-малко  ) "... кой ши***як е писал това?"... Търсенето на грешки в такъв код ще е едно (не)приятно приключение. Ако константите се менят често - няма нужда да са константи. Ако не се менят често - ръчно или външен генератор.
_________________ Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ! Опонентът се оборва с ФАКТИ, а не с ЕПИТЕТИ!
|
| Чет Мар 28, 2024 2:13 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: Как да направя масив от константи?
А гпт-то какво казва по въпроса? 
_________________ 'просто' е технически синоним на 'красиво'
|
| Чет Мар 28, 2024 3:33 pm |
|
 |
|
al_at
Ранг: Форумен бог
Регистриран на: Пет Апр 13, 2018 4:00 pm Мнения: 1622 Местоположение: София
|
 Re: Как да направя масив от константи?
Ако успееш да формулираш въпроса, може да опиташ. Иначе, ето още една идея: https://stackoverflow.com/questions/128 ... eprocessor
|
| Чет Мар 28, 2024 3:42 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: Как да направя масив от константи?
Е то ако не успееш... Какво питаш тогава? 
_________________ 'просто' е технически синоним на 'красиво'
|
| Чет Мар 28, 2024 3:57 pm |
|
 |
|
al_at
Ранг: Форумен бог
Регистриран на: Пет Апр 13, 2018 4:00 pm Мнения: 1622 Местоположение: София
|
 Re: Как да направя масив от константи?
Аз не успях /да формулирам въпроса/. Английският не ми е силна страна, а на български мисля, че е безсмислено. Затова си мълча и не питам 
|
| Чет Мар 28, 2024 4:18 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Как да направя масив от константи?
YouИскам да направя масив от константи. Идеята е обаче попълването на масива да го прави препроцесора по някаква зададена формула. Средата е Arduino. ChatGPT...Тук е важно да отбележим, че препроцесорът в C++ е много прост и не поддържа сложни операции или цикли. Всеки макрос е проста замяна на текст и не може да извършва сложни изчисления или да създава цикли. Във вашия случай, ако искате да генерирате масив с определени стойности, изчислени по формула, единственият начин да го направите ефективно е да използвате функция (както в примера) или да напишете макроси за всеки елемент поотделно, което не е практично за големи масиви. ...
|
| Чет Мар 28, 2024 4:43 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|