реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Задачка усложнилась :о) #define var to str
Trashy_2
сообщение Jan 22 2018, 13:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 254
Регистрация: 27-10-08
Пользователь №: 41 220



Вечер добрый.
Запутался в дефайнах.
Дефайном определено число 48 как dWorkLine .
Далее, другим дефайном хочу состряпать строку, в которую входит число 48 в виде текста.
Должно получиться так: "\e[48;1H" с возможностью менять 48 на любые другие числа.
Вызов должен быть без передачи переменных или констант в таком виде sComandLine().
Код
#define dWorkLine  48
#define svComandLine(vROW_Z) Serial2.print("\e["#vROW_Z";1H");

В таком виде не работает:
Код
#define sComandLine() svComandLine(dWorkLine)


Так работает:
Код
#define sComandLine() svComandLine(48)


В общем, как заставить работать первый вариант?

вопрос снят

https://stackoverflow.com/questions/1264898...ber-to-a-string

В рабочем варианте заменил
Код
#define dWorkLine  48

на
Код
#define dWorkLine  48+6

И опять всё накрылось...

Сообщение отредактировал Trashy_2 - Jan 22 2018, 14:51


--------------------
Транзистор не сможет измерить широкое сердце героя!(ц)
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jan 22 2018, 15:07
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



#define STR(s) #s
#define ANSI_STR(s) STR(s) // только через двойной макрос можно #define QQQ 222 превратить в "222". Пример sprintf( ANSI_STR(QQQ) "=%d", ...


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 22 2018, 15:12
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Trashy_2 @ Jan 22 2018, 16:48) *
В рабочем варианте заменил
Код
#define dWorkLine  48

на
Код
#define dWorkLine  48+6

И опять всё накрылось...

Препроцессор не умеет сумму превращать в строку, так что умерьте хотелки.
Go to the top of the page
 
+Quote Post
Trashy_2
сообщение Jan 22 2018, 15:50
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 254
Регистрация: 27-10-08
Пользователь №: 41 220



Цитата(scifi @ Jan 22 2018, 18:12) *
Препроцессор не умеет сумму превращать в строку, так что умерьте хотелки.

Я опечален.
А как состряпать нужные "стринги" на этапе компиляции?
Я хреновый программист, поэтому от чистого сердца спрашиваю. sprintf вроде как время контроллера жрёт и память...


--------------------
Транзистор не сможет измерить широкое сердце героя!(ц)
Go to the top of the page
 
+Quote Post
adnega
сообщение Jan 22 2018, 17:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Trashy_2 @ Jan 22 2018, 18:50) *
А как состряпать нужные "стринги" на этапе компиляции?

Внешней утилитой.
Go to the top of the page
 
+Quote Post
_pv
сообщение Jan 22 2018, 17:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(scifi @ Jan 22 2018, 22:12) *
Препроцессор не умеет сумму превращать в строку, так что умерьте хотелки.

зато умеет компилятор
https://stackoverflow.com/questions/6713420...824971#26824971
но правда таким образом, что лучше бы не умел.

Цитата
А как состряпать нужные "стринги" на этапе компиляции?

самому поработать препроцессором.
скриптом на любом понравившимся скриптовом языке, который будет автоматически генерить .h файл
Go to the top of the page
 
+Quote Post
amiller
сообщение Jan 23 2018, 07:16
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(scifi @ Jan 22 2018, 18:12) *
Препроцессор не умеет сумму превращать в строку, так что умерьте хотелки.

Я давно-давно (ещё до ARM-ов) начал использовать такой способ.
Размещаю основную структуру константных данных (элементы инициализации, диапазоны изменения, строковые описатели) в ассемблерном файле.
Мне тоже понадобилось делать подсчёт разных элементов внутри структуры.
Так вот, в ассемблере это достаточно легко, примерно так:
CODE
PAR_COUNT SET 0 ; Номер параметра
...
PAR_COUNT SET PAR_COUNT + 1 ; Следующий параметр
...
PAR_COUNT SET PAR_COUNT + 1 ; Следующий параметр
...
В любой момент значением этого счётчика можно с помощью компилятора инициализировать константу, а потом использовать где угодно.
CODE
device:
DC8 A_LEN, 32
DC16 PAR_COUNT


Сообщение отредактировал amiller - Jan 23 2018, 07:18
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 23 2018, 07:19
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(amiller @ Jan 23 2018, 10:16) *
Я давно-давно (ещё до ARM-ов) начал использовать такой способ.

В сях для этого и не только можно использовать метод X Macro.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 07:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016