Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Задачка или почему это работает?   Найти похожие ветки 

 
R.D.I. ©   (2005-02-19 19:35) [0]

Почему переменная B всегда равна переменной A, хотя явного присваивания значения нет? %))))
Code just for fun:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function Magic: Integer;
var
 M: Integer;
begin
 M:=M xor $fd64c90a;
 Result:= M xor not $29b36f5;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
 Loops = 10000;
var
 i, Faileds: Integer;    
 S: string;
 A, B: Integer;
begin
 Randomize;
 Faileds:=0;
 Caption:="Count loops = " + IntToStr(Loops);
 Memo1.Lines.BeginUpdate;
 Memo1.Lines.Clear;
 for i:=1 to Loops do
   begin  
   A:=Random(High(Integer));
   B:=Magic;
   //Почему A всегда равно B?
   S:=Format("A=%d,%sB=%d", [A,#9,B]);
   if A = B then
     S:="[  OK  ] " + S
   else
     begin
     S:="[FAILED] " + S;
     Inc(Faileds);
     end;
   Memo1.Lines.Add(S);
   end;
 Memo1.Lines.EndUpdate;
 MessageDlg("FAILEDS = "+IntToStr(Faileds), mtInformation, [mbOk], 0);
end;

end.

Код был написан под Delphi 7.


 
Sergey_Masloff   (2005-02-19 19:49) [1]

Во-первых, замени свою Magic на


function Magic: Integer;
var
M: Integer;
begin
M:=M;
end;


Результат не поменялся? ;-)
Ладно продолжаем. В своем коде поменяй вызовы сначала присваивай B потом A. Ну как?

Из этих 2 фактов ответ найти легко.


 
begin...end ©   (2005-02-19 19:50) [2]

> R.D.I. ©   (19.02.05 19:35)

Очень просто. Значение M внутри функции Magic не инициализируется, поэтому оно равно старому содержимому регистра EAX, а именно переменной B. Ужимки внутри Magic приводят к тому же содержимому EAX на выходе, что и на входе.


 
begin...end ©   (2005-02-19 19:51) [3]

> begin...end ©   (19.02.05 19:50) [2]

> а именно переменной B

Следует читать: "а именно переменной А"


 
R.D.I. ©   (2005-02-19 19:53) [4]

Я то ответ знаю ;) можно вообще

function Magic: Integer;
begin
end;
%)


 
begin...end ©   (2005-02-19 19:55) [5]

> R.D.I. ©   (19.02.05 19:53) [4]

Да, так ещё проще. В этом случае содержимое EAX внутри функции, можно сказать, вообще не трогается.



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
14-1109077825
Soft
2005-02-22 16:10
2005.03.13
Покупка CD-RW


1-1109317855
Pashkerton
2005-02-25 10:50
2005.03.13
Дерево подчинённости


1-1109594673
hgd
2005-02-28 15:44
2005.03.13
Какая функция позволяет


14-1108895946
Delta
2005-02-20 13:39
2005.03.13
манифест Windows XP


8-1101366528
_Nikolay
2004-11-25 10:08
2005.03.13
Как сделать клиентскую область формы на весь экран ?