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

Clarion, Clarion 7

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

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

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 12:31

Привет всем !

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

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

     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" ?!
Ничего не понимаю. :( Заранее спасибо за помощь.
«V» значит Вендетта !

kreator
✯ Ветеран ✯
Сообщения: 3437
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator » 12 Сентябрь 2019, 13:58

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

Alex_G
Посетитель
Сообщения: 44
Зарегистрирован: 09 Ноябрь 2009, 13:04

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

Сообщение Alex_G » 12 Сентябрь 2019, 14:30

Проблема и со знаком '-' , он же 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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4237
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 14:44

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

Yufil
Ветеран движения
Сообщения: 1156
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 12 Сентябрь 2019, 16:51

Chr(45) - знак минуса. Может быть, компилер его числом считает.
Недавно очередной раз напоролся на старый глюк - команда Message( '<b>Привет') - ничего не выводит...

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1304
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

Сообщение Губин Игорь » 12 Сентябрь 2019, 16:54

Сравнивать в подобной ситуации всегда надо именно VAL, т.к. порядок сортировки символов есть штука изменяемая. :idied:
Это я только кажусь дураком! На самом деле я полный идиот!

Аватара пользователя
vic7tar
Старожил
Сообщения: 241
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar » 12 Сентябрь 2019, 16:54

Игорь Столяров писал(а):
12 Сентябрь 2019, 12:31
Почему я попадаю в секцию "OF", хотя должен в "ELSE" ?!
А я, как положено, попадаю в Else. :idied:
C10, Win10x64

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1304
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

Сообщение Губин Игорь » 12 Сентябрь 2019, 16:56

vic7tar писал(а):
12 Сентябрь 2019, 16:54
А я, как положено, попадаю в Else
Я уже писал, что порядок сортировки символов зависит от локали Windows, файла env...
И, соответственно, на каждом компьютере может быть своё.
Это я только кажусь дураком! На самом деле я полный идиот!

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4237
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 19:02

Губин Игорь писал(а):
12 Сентябрь 2019, 16:56
И, соответственно, на каждом компьютере может быть своё.
Я бы согласился с Вами, если бы речь шла о русских символах.
Но тут даже не латинская часть ASCII таблицы, а самое её начало, которая везде одинакова ...
«V» значит Вендетта !

Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1304
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

Сообщение Губин Игорь » 12 Сентябрь 2019, 20:20

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4237
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 21:01

Я так смутно догадываюсь, что клюки с CASE как-то связаны с неявным преобразованием типов данных.
Что-то из той же оперы, что и Choose(УСЛОВИЕ,REAL,STRING) = ХЗ. А транслятору - такое пофиг, всё хорошо.
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2307
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 12 Сентябрь 2019, 21:17

C11, никаких env файлов и locale, срабатывает Message('ELSE').
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4237
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 21:20

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

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

  Locale('CLACHARSET','WINDOWS')
  Locale('CLACOLSEQ','WINDOWS')
  Locale('CLACASE','WINDOWS')
Попробую отключить и проверить … просто из спортивного интереса. :)
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1156
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 12 Сентябрь 2019, 22:24

Губин Игорь писал(а):
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

:)

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4237
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 12 Сентябрь 2019, 22:40

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

Ответить