Доброго времени суток, помогите разобраться, а то у меня уже голова кипит =).
Суть проблемы в том, что не могу получить код символа. Для этой цели я заношу слово в переменную типа String длинной 16 знаков. Затем идёт так:
for i:=1 to 16 do
Begin
code:=0;
code:=Ord(Num1SN);
ShowMessage(IntToStr(code));
End;
Дело в том, что в переменную code (вот уж не знаю как) заноситься два значения сперва нормальное, а потом, как я понял, аналог из другого языка.
К примеру: вводим вместо слова букву С(Англ). Программа мне выдаёт сперва 67, а затем 243 (Выдаёт два сообщения). Как избавиться от этого 243?
Судя по тому, что тут написано у тебя вообще должно 16 ShowMessage'й сработать.
code:=0; //зачем? Num1SN // а это что такое?
Кусочек кода побольше можно увидеть?
Cannibal
> Судя по тому, что тут написано у тебя вообще должно 16 ShowMessage'й сработать.
> code:=0; //зачем?
>
> Num1SN // а это что такое?
> Кусочек кода побольше можно увидеть?
Да-да, извиняюсь, говорю же мозги уже выкипели.
Num1SN это переменная String, о которой написано выше.
В общем вот весь код (уберите беременных женщин и детей - программа не дописана):
procedure TForm1.Button1Click(Sender: TObject); var Answer,Num1:real; Num1SN:string[16]; Num1SNBuf:char; system, i, code:integer; begin case ComboBox1.ItemIndex of 0:Begin Try Num1:=StrToFloat(Edit1.Text); Except on EConvertError do Begin ShowMessage(''); Edit1.Clear; Exit; End; End; End; 1:Begin Try Num1:=StrToFloat(Edit1.Text); Except on EConvertError do Begin ShowMessage(''); Edit1.Clear; Exit; End; End; End; 2:Begin Try Num1:=StrToFloat(Edit1.Text); Except on EConvertError do Begin ShowMessage(''); Edit1.Clear; Exit; End; End; End; 3:Begin Num1SN:=Edit1.Text; for i:=1 to 16 do Begin Num1SNBuf:=Num1SN[i]; code:=Ord(Num1SNBuf); ShowMessage(IntToStr(code)); if((code>9)AND(code<65))then Begin ShowMessage('Число в першому полі введено не вірно.1'); Edit1.Clear; Exit; End else if(code>70)AND(code<97)then Begin ShowMessage('Число в першому полі введено не вірно.2'); Edit1.Clear; Exit; End else if(code>102)then Begin ShowMessage('Число в першому полі введено не вірно.3'); Edit1.Clear; Exit; End; End; End; End; end;
for i:=1 to 16 do
Тут ты пытаешься проверить 16 символов, даже если их там столько нет.
Когда первый и единственный символ в строке - 'С', его код (67) не попадает в твои проверки
if((code>9)AND(code<65))then ... else if(code>70)AND(code<97)then ... else if(code>102)then
и, соответственно, не выходит по Exit'у.
А так как у тебя там жесткий цикл до 16, он пытается считать второй символ, которого там нет, и получает какой-то случайный мусор.
Как минимум тут тебе нужно учитывать количество символов, которое фактически присутствует в строке
for i:=1 to Length(Num1SN) do
Cannibal
> for i:=1 to 16 do
> Тут ты пытаешься проверить 16 символов, даже если их там столько нет.
> Когда первый и единственный символ в строке - 'С', его код (67) не попадает в
> твои проверки
> if((code>9)AND(code<65))then
> ...
> else if(code>70)AND(code<97)then
> ...
> else if(code>102)then
> и, соответственно, не выходит по Exit'у.
> А так как у тебя там жесткий цикл до 16, он пытается считать второй символ,
> которого там нет, и получает какой-то случайный мусор.
> Как минимум тут тебе нужно учитывать количество символов, которое фактически
> присутствует в строке
>
> for i:=1 to Length(Num1SN) do
Дело в том, что, вроде, первый элемент стринга резервируется под 0 (то есть проверка таких строк начинается с 1 элемента). Кроме того если и так, то мне программа должна выдавать 0 в каждом цикле проверки, а не сперва код знака который я ввёл, а затем левый знак.
KicuM
> то есть проверка таких строк начинается с 1 элемента
да
>Кроме того если и так, то мне программа должна выдавать 0 везде
Почему?
> а не сперва код знака который я ввёл, а затем левый знак.
Символ который ты ввел появляется правильно. Левый знак вылезает, если дело доходит до второй итерации, а строка уже кончилась. В этом случае программа получит что-то, что записано в памяти позади первого символа строки, то есть мусор
Cannibal
> > роме того если и так, то мне программа должна выдавать 0 везде
> Почему?
По условию, если число равно нулю, то идёт дальше проверка.
Cannibal
> > а не сперва код знака который я ввёл, а затем левый знак.
> Символ который ты ввел появляется правильно. Левый знак вылезает, если дело
> доходит до второй итерации, а строка уже кончилась. В этом случае программа
> получит что-то, что записано в памяти позади первого символа строки, то есть
> мусор
А этот мусор можно как-то убрать?
UPD Trim-ом убирать?
Ах, скучаю по временам, когда я учил паскаль, и когда была большая разница между char и char.
KicuM
> А этот мусор можно как-то убрать?
Да, тебе же сказали - не обрабатывай его. Пиши цикл правильно:
for i:=1 to Length(Num1SN) do
Всё ясно, всем спасибо за помощь.
Тема в архиве.