OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 15:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:04 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Товарищи, подскажите как в CP описать такую сишную функцию:
Код:
void      IupSetfAttribute (Ihandle* ih, const char* name, const char* format, ...);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:16 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
ilovb писал(а):
Товарищи, подскажите как в CP описать такую сишную функцию:
Код:
void      IupSetfAttribute (Ihandle* ih, const char* name, const char* format, ...);

Насколько я знаю, в CP принципиально нет средств для переменного количества параметров.
Вместо многоточия передавать некий контейнер, в котором хранятся параметры - например.
Может быть, в недрах ББ есть некие механизмы ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:19 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Я так понял что "format" - это форматная строка как в printf.
А вот что такое "..."? Указатель на массив?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:23 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Валерий Лаптев писал(а):
Может быть, в недрах ББ есть некие механизмы ?
Открытый массив.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:29 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
У меня сейчас идея такая:

Описываю это как массив arg = ARRAY OF BYTE;

И пишу функции для записи в этот массив значений по порядку:

PROCEDURE WriteInt*(a: arg; v: INTEGER)
PROCEDURE WriteReal*(a: arg; v: REAL)
и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:38 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
ilovb писал(а):
Я так понял что "format" - это форматная строка как в printf.
А вот что такое "..."? Указатель на массив?

Нет. Это именно языковая конструкция, которая задает ПРОИЗВОЛЬНЫЙ список дальнейших параметров.
Естественно, в языке определены средства для перемещения по этому списку: va-start, va-end, va-arg и т.п.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:38 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
В FP вот так делают: http://www.freepascal.org/docs-html/ref/refsu63.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 13:41 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Валерий Лаптев писал(а):
ilovb писал(а):
Я так понял что "format" - это форматная строка как в printf.
А вот что такое "..."? Указатель на массив?

Нет. Это именно языковая конструкция, которая задает ПРОИЗВОЛЬНЫЙ список дальнейших параметров.
Естественно, в языке определены средства для перемещения по этому списку: va-start, va-end, va-arg и т.п.

Ну это же просто строка. Т.е. из CP я ее могу передать.
Может я выразился не так... Мне эту сишную функцию нужно вызвать из DLL, и передать в нее эти параметры соответственно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 14:10 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
https://groups.google.com/group/comp.la ... s=no&pli=1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 14:38 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
В модуле 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 15:07 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
В Яве, если в заголовке процедуры переменное количество параметров, то в теле процедуры это массив, каждый элемент которого - переданный параметр.

А в си, я так понимаю, параметры просто запихиваются в стек, и последним, дополнительным, параметром является число переменных параметров. Процедура извлекает из стека это число и знает какое ещё количество данных нужно извлечь из стека, чтобы программа отработала корректно. Но это зависит от реализации, если не прописано в стандарте. Однако, если в стандарте сделано так, как описал я, то средствами КП подружиться с этой сишной библиотекой будет сложно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 15:46 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Я могу ошибаться, но количество параметров автоматом вроде не передается. Все полностью зависит от форматной строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 16:59 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
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 соглашении.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 17:45 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Значит должно сработать с указателем на массив.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 18:10 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
ilovb писал(а):
Я могу ошибаться, но количество параметров автоматом вроде не передается. Все полностью зависит от форматной строки.
Может, я и неправ, но у меня в памяти что-то такое смутно крутится.
Я тут полистал интернет, и узнал, что количество переданных в printf параметров может быть больше, чем требуется. Это допустимо. Наверное, это допустимо и для других функций. Тогда, чтобы разобраться с правильной индексацией переменных параметров, а также, чтобы обратиться к другим параметрам (фиксированным), наверно нужно знать количество переменных параметров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 18:42 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
Общая процедура создания функции, которая может принимать переменное количество аргументов, такова:

Функция должна иметь по крайней мере один известный параметр (может и больше), указываемый до переменного списка параметров. (Такие параметры называются также обязательными, а параметры, следующие за ними — необязательными.) Крайний правый известный параметр называется 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. Писать обертку в маш. кодах


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 19:22 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Еще вариант использовать record без выравнивания:
Код:
RECORD [noalign]      (* без тега, размер = 7 байт *)
   c: SHORTCHAR;   (* смещение 0, размер = 1 byte *)
   x: INTEGER;   (* смещение 1 , размер = 4 bytes *)
   i: SHORTINT   (* смещение 5, размер = 2 bytes *)
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 19:48 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Или про RECORD я туплю? O_o
Как он там в стеке укладывается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 21:26 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
ilovb писал(а):
Похоже оно пляшет от адреса в стеке после последнего обязательного параметра. Видимо указатель на массив не прокатит :(

Вот мое давнее сообщение на РСДН: http://www.rsdn.ru/?forum/cpp/418970
Там как раз о ручном доступе к списку по указателю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переменное число параметров
СообщениеДобавлено: Пятница, 03 Май, 2013 22:05 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Спасибо. Самое понятное объяснение. :)

В общем я разобрался как это работает, и понял что в CP это никак не сделать (окромя маш. кодов)

Решил забить на эти функции, ибо бинд похоже можно без них сделать. Судя по документации это просто обертки для более низкоуровневых функций.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB