Главная страница
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.02 c
15-1179762759
Dawid,
2007-05-21 19:52
2007.06.17
Основы программирования


2-1180049862
delphino
2007-05-25 03:37
2007.06.17
DISTINCT


15-1179846139
Andy BitOff
2007-05-22 19:02
2007.06.17
20.05.2007 умерла Тётя Валя


2-1179912586
DmitrichJ
2007-05-23 13:29
2007.06.17
Размер файла и создание каталога


1-1176801886
Zirf
2007-04-17 13:24
2007.06.17
Построение графика