Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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') например.


Наверх

Титульная страница Поиск, карта сайта Написать письмо