Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

(Язык Си) Как написать макрос с неизвестным числом аргументов?

Hello comp,

Программа для микроконтроллера с ограниченным объемом ОЗУ.
Поэтому приходится извращаться и размещать строковые константы во
FLASH.
Для печати строк приходится писать:
...
{static __flash char tmp[] = "Текст1 %i\n";printf_P(tmp,para11);}
...
{static __flash char tmp[] = "Текст2 %f, %i\n";printf_P(tmp,par21,par22);}
...

И так по всей программе.

А хочется:

#define PRINTF_P(A,...) {static __flash char PRINTF_P_1[] = A; printf_P(PRINTF_P_1,...);}
//Естественно компилер не понимает многоточие
...
PRINTF_P("Текст1 %i\n",para11);
...
PRINTF_P("Текст2 %f, %i\n",par21,par22);
...

Как быть?

Ответить   Thu, 3 Feb 2005 16:54:21 +0500 (#309721)

 

Ответы:

Здравствуйте, Albert.

Вы писали 3 февраля 2005 г., 17:54:21:

Я плохо знаком с с/с++ но мне кажется что можно применить
переопределение функций.

Ответить   Thu, 3 Feb 2005 20:25:41 +0600 (#309844)

 

Hello janalex,

Thursday, February 03, 2005, 7:25:41 PM, you wrote:

описание функции printf_P в *.h файле выглядит примерно так:

int printf_P (const char __flash *format, ...);

В программе пишу:

printf_P("Hello world");

Т.е. хочу чтоб компилятор разместил строку "Hello world" во FLASH и
распечатал ее.

Но компилер размещает строку в ОЗУ и передает функции указатель на
строку в ОЗУ далее следует несоместимость типов:

Error[Pe167]: argument of type "char *" is incompatible with parameter of type
"char const __flash *"

т.о. при указании содержимого строки в качестве аргумента функции, строка
будет размещена в ОЗУ, как выход из этой ситуации я видел написание
макроса, в котором объявляется временная переменная во FLASH, хранящая
содержимое строки-аргумента макроса.

Ответить   Fri, 4 Feb 2005 09:56:25 +0500 (#310166)

 

Макросы с переменным числом аргументов есть в GNU C,
однако это не стандартная конструкция:

#define PRINTF_P(A, args...) { \
static __flash char PRINTF_P_1[] = A; printf_P(PRINTF_P_1 , ## args); }

Маловероятно, что подобный синтаксис поддерживается в
используемом компиляторе. Так что проще вынести
все определения строковых констант в начало исходника.
Выглядеть будет немного эстетичнее, IMHO.

Есть еще шанс, что в компиляторе определены какие-нибудь
параметры командной строки или прагмы, которые
заставили бы размещать строковые константы
во flash. Подходящей документации под
рукой нет, так что точнее сказать не могу.

Номер выпуска : 4002
Возраст листа : 502 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/310259
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 4 Feb 2005 13:23:54 +0300 (#310259)

 

Попробуй заюзать один из старых, но эффективных способов:

#define MAKE_INT_ARRAY(name,size,values) int name [size] = { /values/ }

MAKE_INT_ARRAY (i1, 1, *"*/ 1 /*"*);
MAKE_INT_ARRAY (i2, 2, *"*/ 1, 2 /*"*);
MAKE_INT_ARRAY (i8, 8, *"*/ 1, 2, 3, 4, 5, 6, 7, 8 /*"*);

Здесь главный секрет в том, что в нужный момент комментарится всё ненужное.

Номер выпуска : 4005
Возраст листа : 502 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/310562
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Fri, 4 Feb 2005 13:00:00 +0300 (#310562)

 

Здравствуйте !


Может, он понимает va_start, va_end, va_arg, ... ?
Если так, то все решается на раз.
Все это дело, вроде, даже в стандарте есть.

--
С уважением, Вахтуров Виктор.

Номер выпуска : 4009
Возраст листа : 503 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/310640
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Sat, 5 Feb 2005 01:29:59 +0300 (#310640)