OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 00:11

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




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 14 Ноябрь, 2017 23:22 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Логическая ошибка в Promote: если один из аргументов типа Char16, то результат операции выдаётся Char16 без учёта типа операции — для отношений это верно, а для сложения — нет.
Код:
MODULE Mod;
   IMPORT Log;

   PROCEDURE Do;
   BEGIN
      Log.String(21X + 20X);
      Log.String(LONG(21X) + 20X);   (* ошибка *)
      Log.String(LONG(21X) + LONG(20X));   (* ошибка *)
      Log.String("А" + "Б");   (* ошибка *)
      Log.String("…" + "…");   (* ошибка *)
      Log.String(2026X + 2026X);   (* ошибка *)
   END Do;

BEGIN
   Do
END Mod.
Исправление:
Код:
      ELSIF f IN charSet + {String8, String16} THEN
         IF g IN charSet + {String8, String16} THEN
            IF (f = String16) OR (g = String16) OR (f = Char16) & (g = String8) OR (f = String8) & (g = Char16) THEN
               new := DevCPT.string16typ
>>>> вставить            ELSIF op = plus THEN
               IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ
               ELSE new := DevCPT.string8typ
               END<<<<
            ELSIF (f = Char16) OR (g = Char16) THEN new := DevCPT.char16typ
            ELSIF (f = String8) OR (g = String8) THEN new := DevCPT.string8typ
>>>> вырезать            ELSIF op = plus THEN
               IF (f = Char16) OR (g = Char16) THEN new := DevCPT.string16typ
               ELSE new := DevCPT.string8typ
               END<<<<
            END;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 16 Ноябрь, 2017 21:19 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Лечение поможет, но диагноз поставлен неправильно. Promote не устанавливает тип результата операции, а приводит аргументы к нужным типам.

Кстати, в 1.7 сделано очень похоже.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Ноябрь, 2017 04:06 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Да, спасибо, Вы правы... сложение цепочек у меня было в фокусе внимания.
--
https://redmine.blackboxframework.org/issues/40
Код:
            ELSIF ((f = Char16) OR (g = Char16)) & (op # plus) THEN new := DevCPT.char16typ
Это решение мне тоже напрашивалось первым делом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Ноябрь, 2017 23:51 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Поставлю правку Центра, чтобы было одинаково.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 4 ] 

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


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

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


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

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