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
сообщение 5.11.2010 23:20
Сообщение #2


Гость






Ну вот, и я думал, что 7...

Однако, на самом деле происходит очень неприятная штука (FPC 2.4.0, Debug/Normal mode, любой из режимов совместимости TP/ObjFPC/Delphi/FPC):


Running "f:\programs\pascal\tst.exe "
No heap dump by heaptrc unit
Exitcode = 201
Runtime error 201 at $00401481
$00401481 main, line 15 of F:/Programs/Pascal/tst.pp
$004083C1



15 строка - это
if s[i] in myset then inc(count);


Как только очередной символ строки не входит во множество допустимых значений для myset - программа завершается аварийно при попытке проверить In. В багтрекере есть одна ошибка, связанная с множествами (она уже исправлена, в 2.5.1). Но этой нет. Вот я и думаю, это ж баг? Так быть не должно - не присутствует значение во множестве, значит надо вернуть False и все.
 К началу страницы 
+ Ответить 
Lapp
сообщение 6.11.2010 2:45
Сообщение #3


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

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

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


Цитата(volvo @ 5.11.2010 23:20) *
Вот я и думаю, это ж баг? Так быть не должно - не присутствует значение во множестве, значит надо вернуть False и все.
Другими словами, ты полагаешь, что тут должно работать автоматическое приведение типов? Но как?

Мне такое поведение представяется логичным.. То есть сравнение (выяснение принадлежности) происходит только для элементов множества. Не элемент - выяснение невозможно.

Сейчас пытался сделать нечто подобное для чисел и без множеств.. Не вышло )). Числовые типы приводятся, похоже, всегда. Например:
{$R+}
type
tN = 2..8;

var
n: tN;

begin
if n<5 then WriteLn('good');
if n<10 then WriteLn('bad');
ReadLn
end.

- это отрабатывает на ура без всяких ошибок..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  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:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"