OberonCore https://forum.oberoncore.ru/ |
|
B40: CASE не до конца совмещает прилегающие отрезки? https://forum.oberoncore.ru/viewtopic.php?f=116&t=6184 |
Страница 1 из 1 |
Автор: | Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 17:43 ] |
Заголовок сообщения: | B40: CASE не до конца совмещает прилегающие отрезки? |
Товарищи, если этот вопрос ещё не обсуждался, посмотрите DevCPDump от этой процедуры в своих сборках. Код: (*"DevCompiler.CompileOpt('@')"*) MODULE Mod; PROCEDURE UrlChar2 (ch: CHAR): BOOLEAN; VAR res: BOOLEAN; BEGIN CASE ch OF | "a".."z", "A".."Z", "0".."9", ";", "/", "?", ":", "@", "=", "&", "$", "-", "_", ".", "+", "!", "*", "'", "(", ")", ",", '"', "#", "%": res := TRUE ELSE res := FALSE END; RETURN res END UrlChar2; END Mod. Код: MODULE Mod
PROCEDURE UrlChar2 VAR ch: CHAR VAR res: BOOLEAN BEGIN CASE ch OF | 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122: res := TRUE; ELSE res := FALSE; END; RETURN (res); END UrlChar2 BEGIN CLOSE END Mod |
Автор: | Rifat [ Среда, 29 Ноябрь, 2017 18:13 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться. |
Автор: | Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 18:14 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется. Код: (*^Q"DevCompiler.CompileOpt('@')"*)
MODULE Mod; PROCEDURE Proc (ch: CHAR); BEGIN CASE ch OF | "A", "C", "B": ELSE END; END Proc; END Mod. MODULE Mod PROCEDURE Proc VAR ch: CHAR BEGIN CASE ch OF | 65..66, 67: END; END Proc BEGIN CLOSE END Mod |
Автор: | Евгений Темиргалеев [ Среда, 29 Ноябрь, 2017 18:16 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
Rifat писал(а): Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться. Так делается, не во всех случаях. Но вопрос-то в причине, а не в том, что медленно работает. |
Автор: | Kemet [ Среда, 29 Ноябрь, 2017 18:22 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
это оптимизатор должен делать |
Автор: | Rifat [ Среда, 29 Ноябрь, 2017 18:59 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
Причина в том, что так не было задумано или же было задумано, но неправильно реализовано. Всё просто) |
Автор: | Евгений Темиргалеев [ Четверг, 30 Ноябрь, 2017 16:45 ] |
Заголовок сообщения: | Re: CASE не до конца совмещает прилегающие отрезки? |
Евгений Темиргалеев писал(а): Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется. При добавлении нового отрезка (не пересекается с существующими) в список/дерево он объединяется с одним из имеющихся, если прилегает к нему.[a, A - 1] -> [A, B] ---> [a, B] (1) [B + 1, b] -> [A, B] ---> [A, b] (2) После объединения новый отрезок может достичь соседнего с "выросшего" конца, и должен быть объединён с ним, что не выполняется. Случай (2): [B + 1, C - 1] -> [A, B] [C, D] ---> [A, C - 1] [C, D] ---> [A, D] Результат для процедуры UrlChar2 (строки дампа): Код: CASE ch OF Полное описание исправления в дельте.
| 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122: CASE ch OF | 33..59, 61, 63..90, 95, 97..122: |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |