Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
ВнизOrdinal type required Найти похожие ветки
← →
waif (2007-05-28 11:25) [0]Здравствуйте. помогите чайнику плиз.
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 ... :(
что я не так делаю?
← →
tesseract © (2007-05-28 11:28) [1]
> выдает ошибку Ordinal type required на строчке case simvol
> of ... :(
Строковой символ не являеться простым.
Используй Ord("1")...Ord("9") например.
← →
waif (2007-05-28 11:33) [2]ноль на минус... :( ошибка та же...
← →
begin...end © (2007-05-28 11:37) [3]for j := Length(buf) downto 1 do
case buf[j] of
"1".."9": ... ;
...: ...;
else
Delete(buf, j, 1)
end
← →
waif (2007-05-28 11:46) [4]все заработало!!!!
плиз, скажите, если не сложно, что я не так делал????
← →
ЮЮ © (2007-05-28 11:50) [5]> плиз, скажите, если не сложно, что я не так делал????
1) buf[j] - это Char, с которым можно (в отличии от string) использовать Case
2) использовал цикл for j := 1 to dlina в котором dlina, по существу, менялась, а количество итераций цикла оставалось прежним.
← →
waif (2007-05-28 12:35) [6]не совсем понятно со второй ошибкой, но действительно не работает, если сделать с моим циклом... то есть работает, но символы в строке buf заменяются на другие, такое ощущение, что с кодировкой ошибка какае-то... )
← →
ЮЮ © (2007-05-28 12:40) [7]> такое ощущение, что с кодировкой ошибка какае-то... )
неверное ошущение.
Включи Range Checking в опциях компилятора и ощущения прояснятся. А так просто 1) "портишь" память, не замечая этого 2) перескакиваешь через один символ после "удаленного", не обрабатывая его
← →
begin...end © (2007-05-28 12:57) [8]> 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) -- постарайтесь разобраться сами...
← →
waif (2007-05-28 13:01) [9]точно!!! первый же символ удаляется, второй на его место, а по циклу j уже равно два... :)
ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!!!!!!!!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c