Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
15-1179715558
Slider007
2007-05-21 06:45
2007.06.17
С днем рождения ! 21 мая


2-1180094400
JanMihail
2007-05-25 16:00
2007.06.17
Запись цветного текста в файл


15-1180005025
Reactor
2007-05-24 15:10
2007.06.17
Обновление виндов


2-1180346730
nem0
2007-05-28 14:05
2007.06.17
File To String


3-1175082815
Thely
2007-03-28 15:53
2007.06.17
IB и ADO?