OberonCore
https://forum.oberoncore.ru/

ARRAY OF BYTE и все-все-все
https://forum.oberoncore.ru/viewtopic.php?f=2&t=131
Страница 1 из 1

Автор:  Иван Горячев [ Четверг, 16 Март, 2006 08:01 ]
Заголовок сообщения:  ARRAY OF BYTE и все-все-все

В Блэкбоксе, как я понимаю, в параметр типа ARRAY OF BYTE нельзя передать произвольное значение. Другими словами Files.Writer.WriteBytes кушает только ARRAY OF BYTE и для записи строки SHORTCHARов длиной 64K (или двух мегабайтов CHARов, буде таковые появятся) мне предлагается воспользоваться циклом :(

Ситуация такова:
Имеется процедура
Код:
PROCEDURE (m : Memo) WriteChars* (block : INTEGER; IN val : ARRAY OF SHORTCHAR), NEW;
BEGIN
  m.WriteUsedHeader(LEN(val$));
  (* а вот тут надо писать строку, желательно побыстрее и желательно за один присест *)
END WriteChars;


Пытался сделать так:
Код:
PROCEDURE (m : Memo) WriteChars* (block : INTEGER; IN val : ARRAY OF SHORTCHAR), NEW;
TYPE bt : POINTER TO ARRAY OF BYTE;
VAR b : bt;
BEGIN
  m.WriteUsedHeader(LEN(val$));
  b := SYSTEM.VAL(bt, val [параметр не соответствует] );
  m.w.WriteBytes(b, 0, LEN(val$))
END WriteChars;


Вот такой вариант работает:
Код:
PROCEDURE (m : Memo) WriteChars* (block : INTEGER; IN val : ARRAY OF SHORTCHAR), NEW;
TYPE bt : POINTER [untagged] TO ARRAY OF BYTE;
VAR b : bt; i : INTEGER;
BEGIN
  m.WriteUsedHeader(LEN(val$));
  i := SYSTEM.ADR(val[0]) - 16;
  b := SYSTEM.VAL(bt, val);
  m.w.WriteBytes(b, 0, LEN(val$))
END WriteChars;

Но он мне не нравится потенциальными граблями.

Может быть я чего-то не понимаю и проглядел простое решение?

Автор:  Trurl [ Четверг, 16 Март, 2006 09:15 ]
Заголовок сообщения: 

Для строк из SHORTCHAR можно так.
Код:
PROCEDURE SString* (IN s: ARRAY  OF SHORTCHAR);
 TYPE AB= ARRAY OF BYTE;
 BEGIN
    f.WriteBytes(SYSTEM.VAL(AB,s),0,LEN(s$))
 END SString;

Правда, для CHAR уже не пойдет.

Автор:  Иван Горячев [ Четверг, 16 Март, 2006 10:00 ]
Заголовок сообщения: 

Вот, проглядел! Отдыхать надо иногда :)

Итого для SHORTCHARов имеем:
Код:
PROCEDURE Write* (IN val : ARRAY OF SHORTCHAR);
TYPE tb = ARRAY OF BYTE;
BEGIN
  f.WriteBytes(SYSTEM.VAL(tb, val), 0, LEN(val$))
END Write;

PROCEDURE Read* (VAR res : ARRAY OF SHORTCHAR);
TYPE tb = ARRAY OF BYTE;
BEGIN
  f.ReadBytes(SYSTEM.VAL(tb, res), 0, размер)   <- как ни странно, так тоже можно
END Read;


Никто не мешает сделать то же и для других типов. Спасибо!

Автор:  Vlad [ Пятница, 17 Март, 2006 18:59 ]
Заголовок сообщения: 

Ivor писал(а):
Никто не мешает сделать то же и для других типов. Спасибо!


А что говорит документация по поводу таких лихих приведений типов? Implementation-specific или есть какие-то гарантии? Это я к тому, что даже в "низкоуоровневом" С за такие вещи можно получить по рукам.

Автор:  Иван Горячев [ Понедельник, 20 Март, 2006 01:36 ]
Заголовок сообщения: 

Vlad писал(а):
А что говорит документация по поводу таких лихих приведений типов? Implementation-specific или есть какие-то гарантии? Это я к тому, что даже в "низкоуоровневом" С за такие вещи можно получить по рукам.


А документация говорит, что за использование SYSTEM язык/среда ответственности не несёт. Или Вы хотите, чтобы каждый раз при импорте SYSTEM вылазил диалог типа "Я понимаю всю ответственность и согласен с использованием модуля SYSTEM"? Ну так пожалуйста, специально для Вас можно сделать версию среды ;)

Автор:  Vlad [ Вторник, 21 Март, 2006 00:14 ]
Заголовок сообщения: 

Ivor писал(а):
А документация говорит, что за использование SYSTEM язык/среда ответственности не несёт. Или Вы хотите, чтобы каждый раз при импорте SYSTEM вылазил диалог типа "Я понимаю всю ответственность и согласен с использованием модуля SYSTEM"?


Я бы хотел, чтобы прибегать к его использованию приходилось как можно реже.

Ivor писал(а):
Ну так пожалуйста, специально для Вас можно сделать версию среды ;)


А в идеале - чтобы среда могла контролировать попытку подключения модуля, непосредственно использующего SYSTEM, в случае когда он идет без исходников.

Автор:  Илья Ермаков [ Вторник, 21 Март, 2006 12:51 ]
Заголовок сообщения: 

Тут нюанс такой: специфика поведения SYSTEM зависит от платформы. Но то, что модуль, использующий SYSTEM, откомпилируется в любой версии BB (т.е. сейчас и под Вин, и под Мак, и потом под Линукс) - это гарантируется, т.е. любой компилятор ББ поддерживает один набор псеводпроцедур из SYSTEM.

В этом отличие от того же Kernel или модулей Host, насчет которых производитель ничего не гаратнирует и может в дальнейшем менять его интерфейс как угодно.

Да, разрядность всех элементарных типов зафиксирована (она намеренно сделана одинаковой с Java), поэтому такие преобразования, которые обсуждались в этой ветке, вполне переносимы.

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