OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 14 Май, 2024 23:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: ARRAY OF BYTE и все-все-все
СообщениеДобавлено: Четверг, 16 Март, 2006 08:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
В Блэкбоксе, как я понимаю, в параметр типа 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;

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 16 Март, 2006 09:15 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
Для строк из 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 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Вот, проглядел! Отдыхать надо иногда :)

Итого для 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;


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 17 Март, 2006 18:59 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Ivor писал(а):
Никто не мешает сделать то же и для других типов. Спасибо!


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 20 Март, 2006 01:36 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 10:37
Сообщения: 875
Откуда: Россия, Владивосток
Vlad писал(а):
А что говорит документация по поводу таких лихих приведений типов? Implementation-specific или есть какие-то гарантии? Это я к тому, что даже в "низкоуоровневом" С за такие вещи можно получить по рукам.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 21 Март, 2006 00:14 

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


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

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 21 Март, 2006 12:51 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Тут нюанс такой: специфика поведения SYSTEM зависит от платформы. Но то, что модуль, использующий SYSTEM, откомпилируется в любой версии BB (т.е. сейчас и под Вин, и под Мак, и потом под Линукс) - это гарантируется, т.е. любой компилятор ББ поддерживает один набор псеводпроцедур из SYSTEM.

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB