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 и т.п. с необходимым числом аргументов.
Присоединяюсь --- так же делал.
Вложение:
Снимок.png
Снимок.png [ 54.24 КБ | Просмотров: 3037 ]

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/