OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 13 Август, 2020 17:23 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Коллеги, в ББ там и сям разбросан код наподобие:

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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Была какая-то махинация с ORD/CHR. Сейчас не могу вспомнить/найти сходу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Август, 2020 21:46 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Думать о байтах это платформозависимость.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Август, 2020 07:43 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Я не понял, о какой проверке на диапазоны идет речь?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Август, 2020 12:46 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Пётр Кушнир писал(а):
Думать о байтах это платформозависимость.

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Август, 2020 19:43 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 13:49 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Интересно, нашел вот тут такой пример.

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... беззнаковый байт и беззнаковое укорачивание?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Август, 2020 20:35 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
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));
Не сильно короче, конечно, но возможно, быстрее и при неоптимизирующем компиляторе


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Август, 2020 01:35 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Пётр Кушнир писал(а):
adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Август, 2020 01:44 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
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));
Не сильно короче, конечно, но возможно, быстрее и при неоптимизирующем компиляторе


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Август, 2020 21:24 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 592
adimetrius писал(а):
Пётр Кушнир писал(а):
adimetrius писал(а):
Выходит, чтобы добиться платформонезависимости, нужно подумать о платформозависимости
Просто не надо записывать в файл целые числа через байты, то есть вводить в задачу платформозависимость.


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Август, 2020 11:26 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Artyemov писал(а):
adimetrius писал(а):
А как прикажете записывать целые числа в файл?

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Август, 2020 00:15 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 592
Цитата:
У меня в универе был один доцент...

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

Прошу прощения, затормозил: глянул в свой давний код
Код:
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 разве не даст бинарный файл без выделения байтов (и тем более без системонезависимого)


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

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


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

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


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

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