OberonCore https://forum.oberoncore.ru/ |
|
B39: DevCPB.Promote не проп-т слож-е CHAR-конст. в цепочку https://forum.oberoncore.ru/viewtopic.php?f=116&t=6162 |
Страница 1 из 1 |
Автор: | Евгений Темиргалеев [ Вторник, 14 Ноябрь, 2017 23:22 ] |
Заголовок сообщения: | B39: DevCPB.Promote не проп-т слож-е CHAR-конст. в цепочку |
Логическая ошибка в 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; |
Автор: | Trurl [ Четверг, 16 Ноябрь, 2017 21:19 ] |
Заголовок сообщения: | Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо |
Лечение поможет, но диагноз поставлен неправильно. Promote не устанавливает тип результата операции, а приводит аргументы к нужным типам. Кстати, в 1.7 сделано очень похоже. |
Автор: | Евгений Темиргалеев [ Пятница, 17 Ноябрь, 2017 04:06 ] |
Заголовок сообщения: | Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо |
Да, спасибо, Вы правы... сложение цепочек у меня было в фокусе внимания. -- https://redmine.blackboxframework.org/issues/40 Код: ELSIF ((f = Char16) OR (g = Char16)) & (op # plus) THEN new := DevCPT.char16typ Это решение мне тоже напрашивалось первым делом.
|
Автор: | Евгений Темиргалеев [ Пятница, 17 Ноябрь, 2017 23:51 ] |
Заголовок сообщения: | Re: DevCPB.Promote не пропускает сложение CHAR-конст. в цепо |
Поставлю правку Центра, чтобы было одинаково. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |