OberonCore https://forum.oberoncore.ru/ |
|
Переменное число параметров https://forum.oberoncore.ru/viewtopic.php?f=27&t=4340 |
Страница 1 из 2 |
Автор: | ilovb [ Пятница, 03 Май, 2013 13:04 ] |
Заголовок сообщения: | Переменное число параметров |
Товарищи, подскажите как в CP описать такую сишную функцию: Код: void IupSetfAttribute (Ihandle* ih, const char* name, const char* format, ...);
|
Автор: | Валерий Лаптев [ Пятница, 03 Май, 2013 13:16 ] |
Заголовок сообщения: | Re: Переменное число параметров |
ilovb писал(а): Товарищи, подскажите как в CP описать такую сишную функцию: Код: void IupSetfAttribute (Ihandle* ih, const char* name, const char* format, ...); Насколько я знаю, в CP принципиально нет средств для переменного количества параметров. Вместо многоточия передавать некий контейнер, в котором хранятся параметры - например. Может быть, в недрах ББ есть некие механизмы ? |
Автор: | ilovb [ Пятница, 03 Май, 2013 13:19 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Я так понял что "format" - это форматная строка как в printf. А вот что такое "..."? Указатель на массив? |
Автор: | Ярослав Романченко [ Пятница, 03 Май, 2013 13:23 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Валерий Лаптев писал(а): Может быть, в недрах ББ есть некие механизмы ? Открытый массив.
|
Автор: | ilovb [ Пятница, 03 Май, 2013 13:29 ] |
Заголовок сообщения: | Re: Переменное число параметров |
У меня сейчас идея такая: Описываю это как массив arg = ARRAY OF BYTE; И пишу функции для записи в этот массив значений по порядку: PROCEDURE WriteInt*(a: arg; v: INTEGER) PROCEDURE WriteReal*(a: arg; v: REAL) и т.д. |
Автор: | Валерий Лаптев [ Пятница, 03 Май, 2013 13:38 ] |
Заголовок сообщения: | Re: Переменное число параметров |
ilovb писал(а): Я так понял что "format" - это форматная строка как в printf. А вот что такое "..."? Указатель на массив? Нет. Это именно языковая конструкция, которая задает ПРОИЗВОЛЬНЫЙ список дальнейших параметров. Естественно, в языке определены средства для перемещения по этому списку: va-start, va-end, va-arg и т.п. |
Автор: | ilovb [ Пятница, 03 Май, 2013 13:38 ] |
Заголовок сообщения: | Re: Переменное число параметров |
В FP вот так делают: http://www.freepascal.org/docs-html/ref/refsu63.html |
Автор: | ilovb [ Пятница, 03 Май, 2013 13:41 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Валерий Лаптев писал(а): ilovb писал(а): Я так понял что "format" - это форматная строка как в printf. А вот что такое "..."? Указатель на массив? Нет. Это именно языковая конструкция, которая задает ПРОИЗВОЛЬНЫЙ список дальнейших параметров. Естественно, в языке определены средства для перемещения по этому списку: va-start, va-end, va-arg и т.п. Ну это же просто строка. Т.е. из CP я ее могу передать. Может я выразился не так... Мне эту сишную функцию нужно вызвать из DLL, и передать в нее эти параметры соответственно. |
Автор: | ilovb [ Пятница, 03 Май, 2013 14:10 ] |
Заголовок сообщения: | Re: Переменное число параметров |
https://groups.google.com/group/comp.la ... s=no&pli=1 |
Автор: | ilovb [ Пятница, 03 Май, 2013 14:38 ] |
Заголовок сообщения: | Re: Переменное число параметров |
В модуле WinApi нашел такое описание: Код: PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR; ... PROCEDURE wvsprintfA* ["USER32.dll", ""] (p0: PtrSTR; p1: PtrSTR; arglist: PtrSTR): INTEGER; http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550(v=vs.85).aspx |
Автор: | Valery Solovey [ Пятница, 03 Май, 2013 15:07 ] |
Заголовок сообщения: | Re: Переменное число параметров |
В Яве, если в заголовке процедуры переменное количество параметров, то в теле процедуры это массив, каждый элемент которого - переданный параметр. А в си, я так понимаю, параметры просто запихиваются в стек, и последним, дополнительным, параметром является число переменных параметров. Процедура извлекает из стека это число и знает какое ещё количество данных нужно извлечь из стека, чтобы программа отработала корректно. Но это зависит от реализации, если не прописано в стандарте. Однако, если в стандарте сделано так, как описал я, то средствами КП подружиться с этой сишной библиотекой будет сложно. |
Автор: | ilovb [ Пятница, 03 Май, 2013 15:46 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Я могу ошибаться, но количество параметров автоматом вроде не передается. Все полностью зависит от форматной строки. |
Автор: | Ярослав Романченко [ Пятница, 03 Май, 2013 16:59 ] |
Заголовок сообщения: | Re: Переменное число параметров |
http://unixwiz.net/techtips/win32-callconv.html Цитата: Variadic functions like printf() are almost impossible to get right with __stdcall, because only the caller really knows how many arguments were passed in order to clean them up. The callee can make some good guesses (say, by looking at a format string), but the stack cleanup would have to be determined by the actual logic of the function, not the calling-convention mechanism itself. Hence only __cdecl supports variadic functions so that the caller can do the cleanup. Это называется Variadic functions и возможно только при cdecl соглашении.
|
Автор: | ilovb [ Пятница, 03 Май, 2013 17:45 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Значит должно сработать с указателем на массив. |
Автор: | Valery Solovey [ Пятница, 03 Май, 2013 18:10 ] |
Заголовок сообщения: | Re: Переменное число параметров |
ilovb писал(а): Я могу ошибаться, но количество параметров автоматом вроде не передается. Все полностью зависит от форматной строки. Может, я и неправ, но у меня в памяти что-то такое смутно крутится.Я тут полистал интернет, и узнал, что количество переданных в printf параметров может быть больше, чем требуется. Это допустимо. Наверное, это допустимо и для других функций. Тогда, чтобы разобраться с правильной индексацией переменных параметров, а также, чтобы обратиться к другим параметрам (фиксированным), наверно нужно знать количество переменных параметров. |
Автор: | ilovb [ Пятница, 03 Май, 2013 18:42 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Цитата: Общая процедура создания функции, которая может принимать переменное количество аргументов, такова: Функция должна иметь по крайней мере один известный параметр (может и больше), указываемый до переменного списка параметров. (Такие параметры называются также обязательными, а параметры, следующие за ними — необязательными.) Крайний правый известный параметр называется last_parm. (Он предшествует первому необязательному параметру.) Его имя используется в качестве второго параметра в обращении к макросу va_start(). Чтобы получить доступ к любому дополнительному параметру, сначала необходимо инициализировать указатель-аргумент argptr[1], обратившись к макросу va_start(). (Иными словами, необходимо выполнить вызов va_start(argptr, <имя last_parm>).) После этого значения параметров возвращаются в результате вызова макроса va_arg(). В качестве второго аргумента этого макроса (соответствующего параметру type), нужно указать тип следующего параметра[2]. Наконец, после прочтения всех параметров до возвращения из функции необходимо вызвать макрос va_end(), чтобы гарантировать корректное восстановление стека. Если макрос va_end() вызван не будет, высока вероятность аварийного отказа программы. http://lord-n.narod.ru/download/books/w ... a_copy.htm Похоже оно пляшет от адреса в стеке после последнего обязательного параметра. Видимо указатель на массив не прокатит Остается два варианта: 1. Делать несколько описаний с разным числом параметров 2. Писать обертку в маш. кодах |
Автор: | ilovb [ Пятница, 03 Май, 2013 19:22 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Еще вариант использовать record без выравнивания: Код: RECORD [noalign] (* без тега, размер = 7 байт *)
c: SHORTCHAR; (* смещение 0, размер = 1 byte *) x: INTEGER; (* смещение 1 , размер = 4 bytes *) i: SHORTINT (* смещение 5, размер = 2 bytes *) END |
Автор: | ilovb [ Пятница, 03 Май, 2013 19:48 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Или про RECORD я туплю? O_o Как он там в стеке укладывается? |
Автор: | Валерий Лаптев [ Пятница, 03 Май, 2013 21:26 ] |
Заголовок сообщения: | Re: Переменное число параметров |
ilovb писал(а): Похоже оно пляшет от адреса в стеке после последнего обязательного параметра. Видимо указатель на массив не прокатит Вот мое давнее сообщение на РСДН: http://www.rsdn.ru/?forum/cpp/418970 Там как раз о ручном доступе к списку по указателю. |
Автор: | ilovb [ Пятница, 03 Май, 2013 22:05 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Спасибо. Самое понятное объяснение. В общем я разобрался как это работает, и понял что в CP это никак не сделать (окромя маш. кодов) Решил забить на эти функции, ибо бинд похоже можно без них сделать. Судя по документации это просто обертки для более низкоуровневых функций. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |