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