|
функция с переменным числом аргументов, экономная реализация в IAR |
|
|
|
May 23 2006, 06:09
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
May 23 2006, 08:02
|

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

|
Хорошо, а если вызвать foo() по прототипу foo( uchar, uchar, uchar, uchar, uchar ), то все отрабатывает?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 23 2006, 08:31
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(zltigo @ May 23 2006, 11:02)  Хорошо, а если вызвать foo() по прототипу foo( uchar, uchar, uchar, uchar, uchar ), то все отрабатывает? да, так все нормально, что собственно и описано в приведенной в первом посте выдержки из Help, он приводит к int только те параметры тип которых не указан, как в случае передачи неименованных параметров. PS: конечно можно обойтись и другими методами, но интересен сам факт, чтобы знать стоит ли применять такие подходы в дальнейшем, или забыть о существовании оной.
|
|
|
|
|
May 23 2006, 08:53
|

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

|
Цитата(&-rey @ May 23 2006, 11:31)  да, так все нормально, ... PS: конечно можно обойтись и другими методами, но интересен сам факт, чтобы знать стоит ли применять такие подходы в дальнейшем, или забыть о существовании оной. Тогда конкретная ошибка компилятора?/макроса?. В принципе можете - не использовать макросы - написать альтернативные с учетом фокуса - и самая простая заплатка - извлекать из стека int вместо char Это стоит применять - удобно, кроме того, это фирменная 'C' фишка для обеспечения которой делася обратный порядок аргументов в стеке. А Вы 'не применять' :-)
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 23 2006, 09:27
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(zltigo @ May 23 2006, 11:53)  Тогда конкретная ошибка компилятора?/макроса?. В принципе можете - не использовать макросы - написать альтернативные с учетом фокуса - и самая простая заплатка - извлекать из стека int вместо char ну да, если int извлекать тогда все впорядке конечно. Компилятор ведь int туда и ложит. но хочется же экономии  а переписка макросов не даст экономии ввиду возникновения проблемы на этапе компилятора, да еще и своих ошибок добавлю ... Цитата Это стоит применять - удобно, кроме того, это фирменная 'C' фишка для обеспечения которой делася обратный порядок аргументов в стеке. А Вы 'не применять' :-) Да наверное я погорячился, на С перешел где-то с пол-года назад поэтому пока нет четкого представления что для чего удобно пользовать, вот и прорабатываю варианты испоьзования по мере необходимости. И все таки есть сомнение что это глюк, или на других компиляторах IAR (под другие процы) все нормально ?
|
|
|
|
|
May 23 2006, 09:38
|

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

|
Цитата(&-rey @ May 23 2006, 12:27)  И все таки есть сомнение что это глюк, или на других компиляторах IAR (под другие процы) все нормально ? Я даже проверять у себя на ARM не буду :-) ибо не предстваляю, как нужно извратиться, дабы сие неправильно работало на процессоре с размерностью стека равной int - сразу отвечаю - работает. А дабы не быть совсем уж голословным - использую переменное число аргументов лет двадцать, часто, платформы разные (но не менее 16bit), компиляторы еще более разные. Непониманий не возникало. А в случае 8bit стека и 16bit int открываются просторы для невзаимоувязки :-( что и имеет место быть во всей красе..... Цитата а вот Code Vision поступил честно (?) и передал все параметры b и c как char. Т.е. Именно в стек поместил 8bit, или извлекал 16bit вместо 8??
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 23 2006, 09:54
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(zltigo @ May 23 2006, 12:38)  А в случае 8bit стека и 16bit int открываются просторы для невзаимоувязки :-( что и имеет место быть во всей красе..... Да наверное вот тут он и приводит к int чтоб не нарушать общих правил, вот в книге Страуструпа тоже есть упоминание о приведении char к int а float к duble. Вероятно Code Vision всего лишь исключение из правил, а жаль. Спасибо за поддержку. Code Vision помещал в стек 8 бит, и извлекал соответственно char. т.е. оказался экономнее.
|
|
|
|
Сообщений в этой теме
&-rey функция с переменным числом аргументов May 23 2006, 06:09 zltigo Цитата(&-rey @ May 23 2006, 09:0... May 23 2006, 07:31 &-rey Цитата(zltigo @ May 23 2006, 10:31) Точно... May 23 2006, 07:49 _Bill Цитата(&-rey @ May 23 2006, 09:0... May 23 2006, 11:38 &-rey Цитата(_Bill @ May 23 2006, 14:38) Видимо... May 23 2006, 12:04  _Bill Цитата(&-rey @ May 23 2006, 15:0... May 23 2006, 12:38   &-rey Цитата(_Bill @ May 23 2006, 15:38) Видимо... May 23 2006, 12:49 zltigo Цитата(_Bill @ May 23 2006, 14:38) Видимо... May 23 2006, 12:35 GetSmart Скажите, господа. Сам-то я знаю не весь синтаксис ... Jul 31 2006, 22:41 zltigo Цитата(GetSmart @ Aug 1 2006, 01:41) Так ... Aug 1 2006, 10:12 IgorKossak Цитата(GetSmart @ Aug 1 2006, 01:41) Скаж... Aug 9 2006, 14:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|