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

 
 
> функция с переменным числом аргументов, экономная реализация в IAR
andrvisht
сообщение May 23 2006, 06:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



написал функцию для передачи переменного числа аргументов
Код
#include <stdarg.h>
void foo(unsigned char a, ...);
unsigned char A[5];
void foo(unsigned char a, ...)
{
char i;
  va_list arg_ptr;
  va_start(arg_ptr, a);
  for(i = 0; i < a; ++i)
    A[i]=va_arg(arg_ptr, unsigned char);
  va_end(arg_ptr);
}

void main(void)
{
  unsigned char b = '4', c = 'A';
  foo (5,23,b,32,c);
}

т.е. заполнение массива указанным числом аргументов, результат её работы получил следующий
A[] = {0x17, 0x00, 0x34, 0x00, 0x20}
как видно компилятор приводит мои аргументы к int. Для передачи числа 23 или 32 это еще можно понять, но как быть с явно указанными b и c ?

Попробовал данный код в Image Craft - результат тот-же, а вот Code Vision поступил честно (?)
и передал все параметры b и c как char.

Далее читаю help от IAR и узнаю что аргументом не может быть any integer type that changes when promoted естественно возник интерес к слову promoted и поиск по help дал следующее

Argument promotion occurs when the type of the function fails to provide any information about an argument. Promotion occurs if the function declaration is not a function prototype or if the argument is one of the unnamed arguments in a varying number of arguments. In this instance, the argument must be an rvalue expression.

на основании перевода (возможно неправильного) стало понятно что должна существовать возможность указания типа аргумента для неименованых аргументов в функции с переменным их числом, но как это сделать ... ?
PS: в книгах по С все приводимые примеры относятся к типу int sad.gif
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 16)
zltigo
сообщение Aug 1 2006, 10:12
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(GetSmart @ Aug 1 2006, 01:41) *
Так вот, если мне требуется процедура с переменным кол-вом параметров...
....
И желательно без этого: {va_list, va_start, va_arg,va_end}.

Все абсолютно так-же как и вышеизложенном примере.
va_xxxx бояться не надо, это простейшие макросы или inline,
они просто предназначены для универсального описания.
Посмотрите на них и все станет ясным.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 9 2006, 14:09
Сообщение #17


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(GetSmart @ Aug 1 2006, 01:41) *
Скажите, господа. Сам-то я знаю не весь синтаксис языка си. Так вот, если мне требуется процедура с переменным кол-вом параметров, в частности первый int, а остальные могут быть и int, и float, ну и long. В количестве всего от 2 до 5 параметров. То как мне объявить эту процедуру (пример) и как внутри читать параметры?
И желательно без этого: {va_list, va_start, va_arg,va_end}.

Информация о типах аргументов если они разные обычно передаётся в виде указателя на форматную строку (см. в качестве примера описание printf() и ключи форматной строки).
А вот без этого: {va_list, va_start, va_arg,va_end} ну никак нельзя.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:49
Рейтинг@Mail.ru


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