ФлеймФорумПрограммирование

Ord - Delphi

#0
23:12, 23 янв 2012

Доброго времени суток, помогите разобраться, а то у меня уже голова кипит =).
Суть проблемы в том, что не могу получить код символа. Для этой цели я заношу слово в переменную типа String длинной 16 знаков. Затем идёт так:

for i:=1 to 16 do
                        Begin
                                code:=0;
                                code:=Ord(Num1SN);
                                ShowMessage(IntToStr(code));
                        End;

Дело в том, что в переменную code (вот уж не знаю как) заноситься два значения сперва нормальное, а потом, как я понял, аналог из другого языка.

К примеру: вводим вместо слова букву С(Англ). Программа мне выдаёт сперва 67, а затем 243 (Выдаёт два сообщения). Как избавиться от этого 243?

#1
23:32, 23 янв 2012

Судя по тому, что тут написано у тебя вообще должно 16 ShowMessage'й сработать.

code:=0; //зачем?

Num1SN // а это что такое?

Кусочек кода побольше можно увидеть?

#2
23:38, 23 янв 2012

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;
#3
0:07, 24 янв 2012
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
#4
0:10, 24 янв 2012

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 в каждом цикле проверки, а не сперва код знака который я ввёл, а затем левый знак.

#5
0:20, 24 янв 2012

KicuM
> то есть проверка таких строк начинается с 1 элемента
да

>Кроме того если и так, то мне программа должна выдавать 0 везде
Почему?

> а не сперва код знака который я ввёл, а затем левый знак.
Символ который ты ввел появляется правильно. Левый знак вылезает, если дело доходит до второй итерации, а строка уже кончилась. В этом случае программа получит что-то, что записано в памяти позади первого символа строки, то есть мусор

#6
1:25, 24 янв 2012

Cannibal
> > роме того если и так, то мне программа должна выдавать 0 везде
> Почему?
По условию, если число равно нулю, то идёт дальше проверка.

Cannibal
> > а не сперва код знака который я ввёл, а затем левый знак.
> Символ который ты ввел появляется правильно. Левый знак вылезает, если дело
> доходит до второй итерации, а строка уже кончилась. В этом случае программа
> получит что-то, что записано в памяти позади первого символа строки, то есть
> мусор
А этот мусор можно как-то убрать?

UPD Trim-ом убирать?

#7
5:00, 24 янв 2012

Ах, скучаю по временам, когда я учил паскаль, и когда была большая разница между char и char.

#8
10:18, 24 янв 2012

KicuM
> А этот мусор можно как-то убрать?

Да, тебе же сказали - не обрабатывай его. Пиши цикл правильно:

for i:=1 to Length(Num1SN) do
#9
19:19, 24 янв 2012

Всё ясно, всем спасибо за помощь.

ФлеймФорумПрограммирование

Тема в архиве.