преобразование типов массивов с помощью SYSTEM.VAL

Только технические вопросы по ЯОС и MINOS. Терминология и прочее - в других форумах.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

преобразование типов массивов с помощью SYSTEM.VAL

Сообщение БудДен » 03.01.21 13:57

Из телеграм-чата по A2:
Определил
TYPE Ar = ARRAY OF CHAR;

Использую
Bytes(SYSTEM.VAL(Arr, bytes), ...), где bytes - типа ARRAY OF UNSIGNED8

Сообщает
is no basic type. Bytes(SYSTEM.VAL((*!*)Ar, bytes)...

Почему так?

Ответ (Сергей Дурманов): фактический параметр должен быть с размером, т.к .размер всегда помещается в стек.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: преобразование типов массивов с помощью SYSTEM.VAL

Сообщение БудДен » 03.01.21 14:08

Код: Выделить всё

модуль Proba;
использует НИЗКОУР;
(* Proba.Дуй ~ *)
тип БесконтрольныйМассивЛитер = ряд SIZEOF(SIZE) из литера8;

проц Внутр(конст п: ряд из литера8);
тело 
  TRACE(LEN(п)); (* 5 *)
  TRACE(п); (* АБ *)
кн Внутр;

проц Внеш(конст п: ряд из бцел8);
тело Внутр(НИЗКОУР.VAL(БесконтрольныйМассивЛитер, п)) кн Внеш;

проц Дуй*;
перем строка := "АБ": ряд 5 из литера8;
перем байты: ряд 5 из бцел8; ч : бцел32;
тело 
  цикл_для ч := 0 до 4 делай
    байты[ч] := (ORD(строка[ч]) MOD 256)(бцел8) кн;
  Внеш(байты) кн Дуй кн Proba.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: преобразование типов массивов с помощью SYSTEM.VAL

Сообщение БудДен » 03.01.21 15:21

А вот так с помощью разбора стека можно переназначить длину открытого массива:

Код: Выделить всё

модуль Proba;
использует НИЗКОУР;
(* Proba.Дуй ~ *)
тип БесконтрольныйМассивЛитер = ряд MAX(SIZE) из литера8;

проц Внутр(конст п: ряд из литера8);
тело 
  TRACE(LEN(п)); (* 1945 *)
  TRACE(п); (* АБ *) 
кн Внутр;

проц Средн(конст п: ряд из литера8; будетДлина : SIZE);
перем адресПеременнойЗаМассивом, адресДлины: АДРЕС; текущаяДлина: SIZE;
тело
	адресПеременнойЗаМассивом := АДРЕС из будетДлина;
	адресДлины := адресПеременнойЗаМассивом + 2 * SIZEOF(АДРЕС);
	НИЗКОУР.GET(адресДлины, текущаяДлина);
	ASSERT(текущаяДлина = LEN(п));
	НИЗКОУР.PUT(адресДлины, будетДлина);
	Внутр(п) кн Средн;	

проц Внеш(конст п: ряд из бцел8);
тело Средн(НИЗКОУР.VAL(БесконтрольныйМассивЛитер, п), LEN(п)) кн Внеш;

проц Дуй*;
перем строка := "АБ": ряд 5 из литера8;
перем байты: ряд 1945 из бцел8; ч : бцел32;
тело 
  цикл_для ч := 0 до 4 делай
    байты[ч] := (ORD(строка[ч]) MOD 256)(бцел8) кн;
  Внеш(байты) кн Дуй кн Proba.

Ответить