IPB
ЛогинПароль:

> Работа со множествами, FPC, Будьте аккуратнее :)
volvo
сообщение 5.11.2010 22:51
Сообщение #1


Гость






Привет всем.

Сегодня наткнулся на непонятное (с точки зрения Паскаля) поведение FPC. Вот такой простейший код, совершенно корректно отрабатывающий в Турбо Паскале:

type
tset = set of 'a' .. 'z';
const
myset: tset = ['a' .. 'z'];
s: string = 'the test';
count: integer = 0;
var
i: integer;

begin
for i := 1 to length(s) do
begin
if s[ i ] in myset then inc(count);
end;
writeln(count);
end.

Попробуйте без его компиляции и запуска определить, что будет выведено на печать. А потом запустите на выполнение... smile.gif

Так что осторожнее с множествами...
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 6.11.2010 2:59
Сообщение #2


Гость






Цитата
Не элемент - выяснение невозможно.
, и надо выбрасывать критическую ошибку, да? В топку такое поведение. У меня не строка может состоять из символов 'a'..'z', а посторонняя переменная. И если символ из строки в ней не присутствует или не может присутствовать - то In должен вернуть False.

Заметь, подобное поведение было как минимум до версии 2.0.0 (на двойке не помню, на 1.0.10 проверил только что - работает), обратная совместимость где? smile.gif

Да. И еще одно - что мне совершенно непонятно. Откомпилируем программу в Options -> Mode = Release, все прекрасно работает и в 2.4.0. То есть, все-таки баг в отладочных режимах.
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.11.2010 3:04
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 6.11.2010 2:59) *
И еще одно - что мне совершенно непонятно. Откомпилируем программу в Options -> Mode = Release, все прекрасно работает и в 2.4.0. То есть, все-таки баг в отладочных режимах.
Гм. А разве в моде Release включен Range Checking?..

Володь, я в целом согласен, что фича ненужная и бесполезная. Я не могу привести примера для себя, где оно бы помогло. Но все же логику тут отрицать пока не могу.
Я еще подумаю над этим..


Добавлено через 4 мин.
Цитата(volvo @ 6.11.2010 2:59) *
, и надо выбрасывать критическую ошибку, да?
Это обычный RangeCheck.. Выключи/включи его для этого куска кода - и проблема решена..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.11.2010 8:26
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Lapp @ 6.11.2010 3:04) *
Я еще подумаю над этим..
Я подумал, как и обещал. И по-прежнему считаю, что это совершенно правильное поведение компилятора строго типизированного языка (каковым является объектный Паскаль в поздних реализациях). Справедливости ради, скажу, что я так и думал, что именно это произойдет еще при первом просмотре кода. Я понимаю, что это не довод, конечно )).

В твоем примере происходит обработка ВСЕХ входящих символов. Значит, конструкция для обработки должна принимать их ВСЕ. То, что в число "хороших" символов могут входить только буквы, еще не значит, что ты можешь ими ограничиться при обработке. Поэтому введение типа tset в этом коде не есть правильное действие. Если в твоем потоке символов предполагаются буквы и пробелы, а также цифры, но (допустим) никак не управляющие символы, то организуй соответствующее множество, и RCE (в процессе отладки, разумеется) будет означать, что пролез какой-нить ctrl-c, что есть признак ошики в коде и требует реакции программера.

Так что, тут нет никакого бага, мне кажется. IMHO, ессно. Но довольно твердое smile.gif.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
volvo   Работа со множествами, FPC   5.11.2010 22:51
TarasBer   Должно быть 7 же, а в ФПЦ чё за прикол происходит?   5.11.2010 23:02
Archon   FreePascal 2.4.0. Предсказуемо, 7.   5.11.2010 23:17
volvo   Ну вот, и я думал, что 7... Однако, на самом дел...   5.11.2010 23:20
Lapp   Вот я и думаю, это ж баг? Так быть не должно - не ...   6.11.2010 2:45
volvo   , и надо выбрасывать критическую ошибку, да? В топ...   6.11.2010 2:59
Lapp   И еще одно - что мне совершенно непонятно. Откомпи...   6.11.2010 3:04
Lapp   Я еще подумаю над этим..Я подумал, как и обещал. ...   6.11.2010 8:26
Archon   Delphi не ругается ни при выключенном RangeCheck, ...   6.11.2010 10:53
Lapp   При операциях с числами аргументы приводятся к бол...   7.11.2010 5:31
Client   ошибка всегда, если Range Checking включен, во все...   6.11.2010 11:25
volvo   Я не отмалчиваюсь, я просто сейчас сидел и разбира...   7.11.2010 14:20
Lapp   Если так все-таки было задумано, то чего бы не сде...   8.11.2010 4:12
volvo   Нет еще... Сегодня вечером запощу.   8.11.2010 13:28


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 14:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"