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/ |