OberonCore
https://forum.oberoncore.ru/

Системонезависимое выделение байтов из чисел
https://forum.oberoncore.ru/viewtopic.php?f=23&t=6647
Страница 1 из 1

Автор:  adimetrius [ Четверг, 13 Август, 2020 17:23 ]
Заголовок сообщения:  Системонезависимое выделение байтов из чисел

Коллеги, в ББ там и сям разбросан код наподобие:

outObj.WriteByte(SHORT(SHORT(i MOD 256)))

Ясно-понятно, что это обращение к младшему байту. Увы, такое выражение не проходит проверку на диапазоны при i > 127 или i < -128.

Можно вот так сделать:
WriteByte(SYSTEM.VAL(BYTE, i))
Однако это, во-первых, SYSTEM, во-вторых не проходит на BigEndian... правда, ББ нет на БигЭндиан (. Но это пока - в ближайшие 25 лет мож появится. И перфекционист внутри меня недоволен.

Можно еще вот так системо-независимо:
j := i MOD 256;
IF j > MAX(BYTE) THEN DEC(j, 256) END;
b := SHORT(SHORT(j);

Длинновато как-то...

А есть ли еще способы системо-независимо выделить младший байт?

Автор:  Илья Ермаков [ Четверг, 13 Август, 2020 21:32 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Была какая-то махинация с ORD/CHR. Сейчас не могу вспомнить/найти сходу.

Автор:  Пётр Кушнир [ Пятница, 14 Август, 2020 21:46 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Думать о байтах это платформозависимость.

Автор:  Trurl [ Суббота, 15 Август, 2020 07:43 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Я не понял, о какой проверке на диапазоны идет речь?

Автор:  adimetrius [ Суббота, 15 Август, 2020 12:46 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Пётр Кушнир писал(а):
Думать о байтах это платформозависимость.

Интересно... есть над чем подумать!
Задача вообще такая: надо целые числа записывать в файл. Хочется платформонезависимости: чтобы независимо от платформы младшие байты (например) записывались первыми. Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости.

Trurl писал(а):
Я не понял, о какой проверке на диапазоны идет речь?

Той, которая по умолчанию отключена, но включаетсяпцией компилятора. Platform-specific issues, 12. SHORT(SHORT(INTEGER)) получается BYTE, диапазон -128..127, i MOD 256 в этот диапазон может не влезть. Вы об этом спрашиваете?

Автор:  Пётр Кушнир [ Суббота, 15 Август, 2020 19:43 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.

Автор:  Иван Денисов [ Воскресенье, 16 Август, 2020 13:49 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Интересно, нашел вот тут такой пример.

https://github.com/congdm/Patchouli-Com ... rce/Sys.cp

Код:
PROCEDURE Write_4bytes* (VAR file : FileHandle; n : INTEGER);
   VAR b : UBYTE;
BEGIN
   b := USHORT(n MOD 256); file.f.WriteByte (b);
   n := n DIV 256; b := USHORT(n MOD 256); file.f.WriteByte (b);
   n := n DIV 256; b := USHORT(n MOD 256); file.f.WriteByte (b);
   n := n DIV 256; b := USHORT(n MOD 256); file.f.WriteByte (b)
END Write_4bytes;

Что за функция USHORT? Видимо она в GPCP поддерживается.

Есть идея, что они на пару с UBYTE... беззнаковый байт и беззнаковое укорачивание?

Автор:  Comdiv [ Воскресенье, 16 Август, 2020 20:35 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

adimetrius писал(а):
j := i MOD 256;
IF j > MAX(BYTE) THEN DEC(j, 256) END;
b := SHORT(SHORT(j);

Длинновато как-то...

Код:
j := i MOD 100H;
b := SHORT(SHORT(j - j DIV 80H * 100H));
Не сильно короче, конечно, но возможно, быстрее и при неоптимизирующем компиляторе

Автор:  adimetrius [ Понедельник, 17 Август, 2020 01:35 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Пётр Кушнир писал(а):
adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.


А как прикажете записывать целые числа в файл?

Автор:  adimetrius [ Понедельник, 17 Август, 2020 01:44 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Comdiv писал(а):
adimetrius писал(а):
j := i MOD 256;
IF j > MAX(BYTE) THEN DEC(j, 256) END;
b := SHORT(SHORT(j);

Длинновато как-то...

Код:
j := i MOD 100H;
b := SHORT(SHORT(j - j DIV 80H * 100H));
Не сильно короче, конечно, но возможно, быстрее и при неоптимизирующем компиляторе


Вау! Ну вы двоичный арифметик!! Снимаю шляпу!

Автор:  Artyemov [ Понедельник, 17 Август, 2020 21:24 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

adimetrius писал(а):
Пётр Кушнир писал(а):
adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.


А как прикажете записывать целые числа в файл?

Бинарный файл...

Автор:  adimetrius [ Вторник, 18 Август, 2020 11:26 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Artyemov писал(а):
adimetrius писал(а):
А как прикажете записывать целые числа в файл?

Бинарный файл...


Коллега, так я ж его и делаю как раз!

У меня в универе был один доцент, который говорил (лет 25 назад, когда ИИ был только в универах): Не понимаю, чего сложного в этом вашем ИИ? Все ж элементарно: просто добавляете в принципиальную схему компьютера блок искусственного интеллекта...

Автор:  Artyemov [ Среда, 19 Август, 2020 00:15 ]
Заголовок сообщения:  Re: Системонезависимое выделение байтов из чисел

Цитата:
У меня в универе был один доцент...

;-) Поразительной мудрости человек. Поразительной...

Прошу прощения, затормозил: глянул в свой давний код
Код:
VAR
   d, sample_bit :BYTE;
   LCD_RAM :ARRAY 512 OF BYTE;
   indx, i :INTEGER;
   
   reader.ReadByte(d);

и чёт не то брякнул.

Но там же было и вот такое:
Код:
LCD_RAM[(indx + i)] := SHORT(SHORT(ORD(BITS(LCD_RAM[(indx + i)]) + BITS(sample_bit))));

BITS преобразует INTEGER в 32-битный SET, над коим допустимы логические операции (т.е. нативно выделить 8 младших битов), ORD обратно в INTEGER (но 0..255) и SHORTы "укоротят" до требуемого.

PS: отставить извинения - writer.WriteInt разве не даст бинарный файл без выделения байтов (и тем более без системонезависимого)

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