Case, String и диапазон

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Case, String и диапазон

Сообщение Brainenjii » 12.07.2012 21:42:49

Код: Выделить всё
Case StringVar Of
  'A', 'B', 'O', 'U', 'T':;
  'ABOUT':;
End;

Case StringVar Of
  'A'..'Z':;
  'ABOUT':; // <- Error: duplicate case label
End;

Это баг или так и должно быть?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Case, String и диапазон

Сообщение SAK » 12.07.2012 22:15:33

В первой строке диапазон символов (Char), а во второй строка. Видимо компилятор преобразует сроку к символу и получает повтор. Я не могу себе представить диапазон строк, например какие строки будут входить в 'AD'..'PP' ?
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Case, String и диапазон

Сообщение Brainenjii » 12.07.2012 22:25:47

Ну, когда я это писал я, разумеется, предполагал, что компилятор диапазон строк 'A'..'Z' воспримет 'A','B',..,'Z'. Вроде бы логично? ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Case, String и диапазон

Сообщение Максим » 12.07.2012 23:40:28

Об этом лучше спросить в списке рассылки.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Case, String и диапазон

Сообщение SAK » 12.07.2012 23:59:43

Brainenjii писал(а):компилятор диапазон строк 'A'..'Z' воспримет 'A','B',..,'Z'. Вроде бы логично? ^_^

Логично, но нелогичность возникает когда во второй строке вместо отдельных символов появляется строка.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Case, String и диапазон

Сообщение Brainenjii » 13.07.2012 00:20:26

Код: Выделить всё
Var
  StringVar: String;
begin
  Case StringVar Of
    'А'..'Я':;
    'Арбуз':;
  End;
end.

StringVar объявлен как String -> я ожидаю что Case будет разбирать строки. 'А'..'Я' - соответственно диапазон строк 'А', 'Б', 'В', .., 'Я' (уже не символов, UTF8), чтобы не нарушать ожидаемое поведение. 'Арбуз' - ещё одна строка в Case. И все-равно ошибка ^_^ Все-таки, наверное, баг
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Case, String и диапазон

Сообщение SSerge » 13.07.2012 05:04:33

Одиночное значение в кавычках - это всегда char, а не строка (за исключением ситуации, когда под кавычки попадает знак из utf-8, тогда он всяко строка, ибо многобайтовых char не бывает).

Поэтому

Var s:string;

s:='c';

условно эквивалентно

s:=CharToString('c');

Ну и для строк вообще не может быть каким либо образом заданного диапазона :) При компиляции, естественно. Поэтому, у вас возможно наведенная ошибка, на деле относящаяся к строчке "'A'..'Z':;"
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case, String и диапазон

Сообщение Ask » 13.07.2012 07:20:45

для строк вообще не может быть каким либо образом заданного диапазона


Нет, диапазон для строк добавлен в новых версиях FPC.
Диапазон определён по стандартным правилам, а именно s находится в диапазоне от a до b тогда и только тогда,
когда a <= s <= b.
Ошибка выдаётся в случае, когда диапазоны перекрываются -- в приведённом примере вторая метка находится в диапазоне первой.
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37

Re: Case, String и диапазон

Сообщение SSerge » 13.07.2012 09:51:32

Ask писал(а):Нет, диапазон для строк добавлен в новых версиях FPC.


описание этого где нибудь есть? WIKI.freepascal молчит.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Case, String и диапазон

Сообщение Brainenjii » 13.07.2012 11:25:35

В общем, понятно... 'А'..'Я' - это не "массив" строк, размером один литерал ('А', 'Б', 'В', .., 'Ю', 'Я'), а все строки, начинающиеся с букв А по Ю и символ Я включительно. Такой код компилируется нормально. Лично я был бы рад, если бы 'А'..'Я' превращалось бы в 'А', 'Б', 'В', .., 'Ю', 'Я'. ИМХО, это логичнее ^_^
Код: Выделить всё
Var
  StringVar: String;
Begin
  Case StringVar Of
    'А'..'Я':;
    'Яблоко':;
  End;
End.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Case, String и диапазон

Сообщение Ask » 13.07.2012 16:09:36

описание этого где нибудь есть? WIKI.freepascal молчит.


Да, действительно. Вот оригинальное обсуждение -- там есть testcase'ы
http://bugs.freepascal.org/view.php?id=13700
Ask
постоялец
 
Сообщения: 163
Зарегистрирован: 25.12.2008 03:51:37


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru