agorkov
@agorkov

Странное поведение Delphi XE2?

Я понимаю, что Delphi тут не особо любят, но в качестве учебного языка он не так уж и плох. Не так давно мне выпал шанс поработать с самой новой версией компилятора Delphi.

Наконец-то появилась возможность писать 64-битные приложения. И вопрос, собственно, про такие приложения.

Есть код:

var

s1,s2: string;

begin

s1:='00000000';

s2:='00000000';

if s1=s2 then

writeln('Равны')

else

writeln('Не равны');

end;


Этот код, скомпилированный под 32 бита выводит «Равны», этот же код, скомпилированный под 64 бита выводит «Не равны».


А если срокам s1,s2 присвоить '0000' и '0000', соответственно, то вне зависимости от «битности» приложения будет выведено «Не равны».
  • Вопрос задан
  • 3311 просмотров
Пригласить эксперта
Ответы на вопрос 4
@AndreyDaeron
Простая программа под 32 бита выдаёт «Не равны», что в общем-то правильно. Delphi XE2, Update1

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
s1,s2: string;

begin
  try
    s1:='00000000';
    s2:='00000001';
    if s1=s2 then
    writeln('Равны')
    else
    writeln('Не равны');
    Sleep(100000);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Ответ написан
dimmaq
@dimmaq
А что генерит компилятор? Поставьте точку на s1:=, запустите и нажмите ALT+CTRL+C.
Вот для 32бит:
Project1.dpr.9: s1:='00000000';
0045E31A B86C9B4600       mov eax,$00469b6c
0045E31F BAA0E34500       mov edx,$0045e3a0
0045E324 E80F6AFAFF       call @LStrAsg
Project1.dpr.10: s2:='00000000';
0045E329 B8709B4600       mov eax,$00469b70
0045E32E BAA0E34500       mov edx,$0045e3a0
0045E333 E8006AFAFF       call @LStrAsg
Project1.dpr.11: if s1=s2 then
0045E338 A16C9B4600       mov eax,[$00469b6c]
0045E33D 8B15709B4600     mov edx,[$00469b70]
0045E343 E8A06DFAFF       call @LStrCmp
0045E348 751B             jnz $0045e365
Ответ написан
Комментировать
@Pyatochkin
именно xe2 нет и проверить не могу, но есть занятный документ, валяющийся на embarcodero, по вашему вопросу можно пробовать читать с середины страницы 24 и начало 25-й…
Ответ написан
@AndreyDaeron
Добрался дома до х64:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
s1,s2: string;

begin
  try
    s1:='00000000';
    s2:='00000000';
    if s1=s2 then
    writeln('Равны')
    else
    writeln('Не равны');
    Sleep(100000);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Выводит — равны.

Обычная ХЕ2 с Update 3, для х64 стоит стандартный же paserver.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы