OberonCore https://forum.oberoncore.ru/ |
|
Переменное число параметров https://forum.oberoncore.ru/viewtopic.php?f=27&t=4340 |
Страница 2 из 2 |
Автор: | Comdiv [ Суббота, 04 Май, 2013 01:12 ] |
Заголовок сообщения: | Re: Переменное число параметров |
ilovb писал(а): В общем я разобрался как это работает, и понял что в CP это никак не сделать (окромя маш. кодов) Гм, а в чем проблема? В CP нет псевдомодуля SYSTEM с адресной арифметикой? |
Автор: | ilovb [ Суббота, 04 Май, 2013 16:44 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Да, через GET/PUT тоже можно |
Автор: | ilovb [ Воскресенье, 05 Май, 2013 21:27 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Оказывается в XDS есть поддержка: Цитата: The array of bytes which is passed to a procedure in place of a formal SEQ-parameter is formed as follows:
• values of all actual parameters forming the sequence are represented as described below and concatenated in the array in their textual order • integer values are converted to LONGINT • BOOLEAN, CHAR, cardinal, and enumeration values are converted to LONGCARD • range type values are converted according to their base type • real values are converted to LONGREAL • pointer, address, opaque, and procedure type values are converted to ADDRESS • a structured value (record or array) is interpreted as a one-dimensional array of bytes and is represented by a 3-element descriptor: • the address of the structure • a zero 32-bit word (reserved for future extensions) • size of the structure (in LOCs) minus one Example PROCEDURE write(SEQ args: SYSTEM.BYTE); BEGIN END write; VAR i: INTEGER; c: SYSTEM.CARD8; r: LONGREAL; S: RECORD a: LONGINT; c: CHAR END; p: POINTER TO ARRAY OF CHAR; . . . write(i,c,S,r,p^); For this call the actual byte array passed to write will contain: • 4 bytes of the sign-extended value of i • 4 bytes of the zero-extended value of c • 12 bytes of the array descriptor • 4 bytes containing the address of S • 4 bytes containing 0 • 4 bytes containing 4 (SIZE(S)-1) • 8 bytes value of r in the double-precision 80387 format • 12 bytes of the array descriptor • 4 bytes containing the address of the P data • 4 bytes containing the value 0 • 4 bytes containing SIZE(p^)-1 Copyright © 1999-2011 Excelsior, LLC. |
Автор: | Trurl [ Понедельник, 06 Май, 2013 07:45 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Проще всего определить необходимое число функций IupSetfAttribute1, IupSetfAttribute2 и т.п. с необходимым числом аргументов. |
Автор: | Alexey Veselovsky [ Понедельник, 06 Май, 2013 12:07 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Trurl писал(а): Проще всего определить необходимое число функций IupSetfAttribute1, IupSetfAttribute2 и т.п. с необходимым числом аргументов. Не выйдет. Попробуй так сделать для банального сишного printf'a. Тут полный аналог его. |
Автор: | Trurl [ Вторник, 07 Май, 2013 07:42 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Для банального сишного printf'a тоже можно. Но тут не полный аналог - IupSetfAttribute ожидает только строки. |
Автор: | Alexey Veselovsky [ Вторник, 07 Май, 2013 11:26 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Trurl писал(а): Для банального сишного printf'a тоже можно. Но тут не полный аналог - IupSetfAttribute ожидает только строки. Как с printf'ом? Пример можно? |
Автор: | Александр Ильин [ Вторник, 07 Май, 2013 11:39 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Alexey Veselovsky писал(а): Как с printf'ом? Пример можно? Код: PROCEDURE Print2Ints(format: ARRAY OF CHAR; int1, int2: INTEGER)...
Print2Ints("Error %i at line %i.", 15, 80); |
Автор: | Alexey Veselovsky [ Вторник, 07 Май, 2013 11:43 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Александр Ильин писал(а): Alexey Veselovsky писал(а): Как с printf'ом? Пример можно? Код: PROCEDURE Print2Ints(format: ARRAY OF CHAR; int1, int2: INTEGER)... Print2Ints("Error %i at line %i.", 15, 80); Ну это же не то. Чтобы сделать вменяемый бинд для print'f'a придется беребрать все возможные комбинации типов и числа аргументов. Будет абсолютно дикое число бинд-функций и это будет абсолютно не юзабельно. |
Автор: | Илья Ермаков [ Вторник, 07 Май, 2013 12:27 ] |
Заголовок сообщения: | Re: Переменное число параметров |
В принципе, в ББ 1.6 Meta позволяет конструировать вызов произвольной процедуры (т.е. "наталкивать" нужные параметры). Правда, там это типобезопасно, для корректно полученных ссылок (Meta.Item) на свои процедуры, имеющие метаинформацию. Но саму механику можно рассмотреть и заимствовать. Сделать модуль по аналогии, который также готовит стек, а потом - вызов по произвольному адресу, а не по Item. |
Автор: | Евгений Темиргалеев [ Среда, 08 Май, 2013 20:17 ] |
Заголовок сообщения: | Re: Переменное число параметров |
Trurl писал(а): Проще всего определить необходимое число функций IupSetfAttribute1, IupSetfAttribute2 и т.п. с необходимым числом аргументов. Присоединяюсь --- так же делал.Вложение:
|
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |