Про странный CASE

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Привет всем !

Сам не люблю непроверенные проблемы - но здесь уже устал проверять и какой-то тупик. :(
Простая комбинация:

Код: Выделить всё

     Case Chr(45)
     Of Chr(1) To Chr(9) OrOf Chr(11) To Chr(12) OrOf Chr(14) To Chr(31)
        Message('ПОЧЕМУ Я ЗДЕСЬ ?')
     else
        Message('ELSE')
     end
Почему я попадаю в секцию "OF", хотя должен в "ELSE" ?!
Ничего не понимаю. :( Заранее спасибо за помощь.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Про странный CASE

Сообщение kreator »

Можно спросить? А в чём смысл сравнивать стринги? Не трусы. Символ "-" (что есть код 45) наверняка попадает между Chr(14) и Chr(31) (вообще, непонятно что за символы).
We are hard at work… for you. :)
Alex_G
Бывалый
Сообщения: 61
Зарегистрирован: 09 Ноябрь 2009, 13:04
Поблагодарили: 2 раза

Про странный CASE

Сообщение Alex_G »

Проблема и со знаком '-' , он же CHR(45) и "неотображаемыми" знаками ASCII таблицы (в частности CHR(9))
во первых, неоднократно замечал, что если ключ описан по текстовому полю (Name STRING(60)),
делаю
CLEAR(name) ! очистка пробелом , т.е. CHR(32)
SET(By_name,by_name)
LOOP
NEXT()
...
end
и есть запись начинающаяся на '-', она в цикл чтения не попадает , необходимо делать CLEAR(name,-1)


В Вашем коде CHR(45) попадает в диапазон OF CHR(1) TO CHR(9). (так же он попадет в диапазон OF CHR(8) TO CHR(9) )
Почему - х.з. Причем проблема только с CHR(45)

Если Ваш код, слегка модифицировать, все будет работать как часы:

Case Chr(45)
Of Chr(1) To Chr(8) OROf Chr(9) OROf Chr(11) To Chr(12) OROf Chr(14) To Chr(31)
Message('ПОЧЕМУ Я ЗДЕСЬ ?')
else
Message('ELSE')
end
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Alex_G писал(а): 12 Сентябрь 2019, 14:30Почему - х.з. Причем проблема только с CHR(45)
Вот и я ХЗ. :(
Проблему-то я откостылил, переключив CASE на сравнение цифр кодов через VAL().
И хотя получил за это электрогроши и даже выпил пыва за успех - осадок-то остался.
Нерешённая проблема может где-то ещё вылезти. А время и место - то самое ХЗ ...
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Про странный CASE

Сообщение Yufil »

Chr(45) - знак минуса. Может быть, компилер его числом считает.
Недавно очередной раз напоролся на старый глюк - команда Message( '<b>Привет') - ничего не выводит...
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Про странный CASE

Сообщение Губин Игорь »

Сравнивать в подобной ситуации всегда надо именно VAL, т.к. порядок сортировки символов есть штука изменяемая. :idied:
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Про странный CASE

Сообщение vic7tar »

Игорь Столяров писал(а): 12 Сентябрь 2019, 12:31Почему я попадаю в секцию "OF", хотя должен в "ELSE" ?!
А я, как положено, попадаю в Else. :idied:
C10, Win10x64
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Про странный CASE

Сообщение Губин Игорь »

vic7tar писал(а): 12 Сентябрь 2019, 16:54А я, как положено, попадаю в Else
Я уже писал, что порядок сортировки символов зависит от локали Windows, файла env...
И, соответственно, на каждом компьютере может быть своё.
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Губин Игорь писал(а): 12 Сентябрь 2019, 16:56И, соответственно, на каждом компьютере может быть своё.
Я бы согласился с Вами, если бы речь шла о русских символах.
Но тут даже не латинская часть ASCII таблицы, а самое её начало, которая везде одинакова ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2301
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 17 раз

Про странный CASE

Сообщение Губин Игорь »

Игорь Столяров писал(а): 12 Сентябрь 2019, 19:02 Но тут даже не латинская часть ASCII таблицы, а самое её начало, которая везде одинакова ...
Если в каком-то месте возможно допустить ошибку, то она будет там допущена. Потому и лучше не давать ни малейшего шанса. Тем более, что в обработке сортировок символов у велосипедистов глюков вагон и маленькая тележка. Достаточно попробовать отсортировать очередь по строковому полю со смешанными символами верхнего и нижнего регистра (ЛАТИНСКИМИ).
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Я так смутно догадываюсь, что клюки с CASE как-то связаны с неявным преобразованием типов данных.
Что-то из той же оперы, что и Choose(УСЛОВИЕ,REAL,STRING) = ХЗ. А транслятору - такое пофиг, всё хорошо.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Про странный CASE

Сообщение Дед Пахом »

C11, никаких env файлов и locale, срабатывает Message('ELSE').
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Тоже C11 (впрочем тоже самое и в C63), но у меня включены:

Код: Выделить всё

  Locale('CLACHARSET','WINDOWS')
  Locale('CLACOLSEQ','WINDOWS')
  Locale('CLACASE','WINDOWS')
Попробую отключить и проверить … просто из спортивного интереса. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Про странный CASE

Сообщение Yufil »

Губин Игорь писал(а): 12 Сентябрь 2019, 16:54 Сравнивать в подобной ситуации всегда надо именно VAL, т.к. порядок сортировки символов есть штука изменяемая. :idied:
Никогда не пользовал OF...TO, есть InRange!

IF INRANGE( VAL(x),1,9 ) + INRANGE( VAL(x), 14,31 ) + INRANGE( VAL(x), 8,9 )
Message( 'Входит' )
ELSE
Message( 'Не входит')
END

:)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Про странный CASE

Сообщение Игорь Столяров »

Yufil писал(а): 12 Сентябрь 2019, 22:24Никогда не пользовал OF...TO
Вот и я, пожалуй, теперь тоже не буду юзать эту комбинацию … :)
Просто фильтрации символов через CASE ничего военного не предвещала, практически пример из справки.
А оно вон как повернулось. То ли зависимость от локализации, то ли вообще непонятно что.
И что обидно - почему-то переклинило её именно на дефисе (код 45), остальное ведь всё работает ...
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить