Из телеграм-чата по A2:
Определил
TYPE Ar = ARRAY OF CHAR;
Использую
Bytes(SYSTEM.VAL(Arr, bytes), ...), где bytes - типа ARRAY OF UNSIGNED8
Сообщает
is no basic type. Bytes(SYSTEM.VAL((*!*)Ar, bytes)...
Почему так?
Ответ (Сергей Дурманов): фактический параметр должен быть с размером, т.к .размер всегда помещается в стек.
преобразование типов массивов с помощью SYSTEM.VAL
Re: преобразование типов массивов с помощью SYSTEM.VAL
Код: Выделить всё
модуль Proba;
использует НИЗКОУР;
(* Proba.Дуй ~ *)
тип БесконтрольныйМассивЛитер = ряд SIZEOF(SIZE) из литера8;
проц Внутр(конст п: ряд из литера8);
тело
TRACE(LEN(п)); (* 5 *)
TRACE(п); (* АБ *)
кн Внутр;
проц Внеш(конст п: ряд из бцел8);
тело Внутр(НИЗКОУР.VAL(БесконтрольныйМассивЛитер, п)) кн Внеш;
проц Дуй*;
перем строка := "АБ": ряд 5 из литера8;
перем байты: ряд 5 из бцел8; ч : бцел32;
тело
цикл_для ч := 0 до 4 делай
байты[ч] := (ORD(строка[ч]) MOD 256)(бцел8) кн;
Внеш(байты) кн Дуй кн Proba.
Re: преобразование типов массивов с помощью SYSTEM.VAL
А вот так с помощью разбора стека можно переназначить длину открытого массива:
Код: Выделить всё
модуль 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.