Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1177061961
Desdechado
2007-04-20 13:39
2007.06.17
Работа с группами пользователей из Active Directory


15-1179715384
Slider007
2007-05-21 06:43
2007.06.17
С днем рождения ! 19 мая


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


15-1179779275
ElectriC
2007-05-22 00:27
2007.06.17
Закачка файлов


8-1159790519
Nickla
2006-10-02 16:01
2007.06.17
DSPack: ошибка при инициализации TSampleGraber как службу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский