![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ordinal type required
waif © (2007-05-28 11:25:00)Здравствуйте. помогите чайнику плиз.
buf : String;
simvol : String;
.................
buf := '123Петров';
dlina := length(buf);
for j := 1 to dlina do
begin
simvol := copy(buf,j,1);
case simvol of
'1'..'9': ;
else delete(buf,j,1);
end;
end;
выдает ошибку Ordinal type required на строчке case simvol of ... :(
что я не так делаю?
waif (2007-05-28 13:01:00) [1]точно!!! первый же символ удаляется, второй на его место, а по циклу j уже равно два... :)
ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!!!!!!!!
begin...end (2007-05-28 12:57:00) [2]> waif (28.05.07 12:35) [6]
Фокус в том, что границы счётчика цикла for вычисляются только один раз -- перед первым проходом цикла.
Давайте посмотрим, что произойдёт, если в [3] использовать прямой цикл (for ... to ... do).
Возьмём строку buf := 'N123'. Перед первым проходом цикла определятся границы его счётчика: начальное значение -- 1, конечное -- 4. На первом же проходе цикла выполняется Delete: в результате от строки останется '123', а счётчик станет равным 2.
Теперь нам надо обратиться ко второму символу исходной строки ('N123'), т.е. к '1'. Но ведь строка buf только что изменилась! Поэтому код buf[2] обратится ко второму символу новой строки ('123'), т.е. к '2'. Таким образом, предыдущий символ будет просто пропущен.
Но это только полбеды. Конечная граница счётчика не изменилась и по-прежнему равна 4, тогда как строка buf содержит теперь всего 3 символа. Очевидно, что код buf[j] при j = 4 вызовет ошибку -- выход за границы строки.
А чтор будет в случае обратного цикла (for ... downto ... do) -- постарайтесь разобраться сами...
ЮЮ (2007-05-28 12:40:00) [3]> такое ощущение, что с кодировкой ошибка какае-то... )
неверное ошущение.
Включи Range Checking в опциях компилятора и ощущения прояснятся. А так просто 1) "портишь" память, не замечая этого 2) перескакиваешь через один символ после "удаленного", не обрабатывая его
waif (2007-05-28 12:35:00) [4]не совсем понятно со второй ошибкой, но действительно не работает, если сделать с моим циклом... то есть работает, но символы в строке buf заменяются на другие, такое ощущение, что с кодировкой ошибка какае-то... )
ЮЮ (2007-05-28 11:50:00) [5]> плиз, скажите, если не сложно, что я не так делал????
1) buf[j] - это Char, с которым можно (в отличии от string) использовать Case
2) использовал цикл for j := 1 to dlina в котором dlina, по существу, менялась, а количество итераций цикла оставалось прежним.
waif (2007-05-28 11:46:00) [6]все заработало!!!!
плиз, скажите, если не сложно, что я не так делал????
begin...end (2007-05-28 11:37:00) [7]for j := Length(buf) downto 1 do
case buf[j] of
'1'..'9': ... ;
...: ...;
else
Delete(buf, j, 1)
end
waif (2007-05-28 11:33:00) [8]ноль на минус... :( ошибка та же...
tesseract (2007-05-28 11:28:00) [9]
> выдает ошибку Ordinal type required на строчке case simvol
> of ... :(
Строковой символ не являеться простым.
Используй Ord('1')...Ord('9') например.