Главная страница
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.031 c
1-1109336366
denis24
2005-02-25 15:59
2005.03.13
stringlist и создание модальной формы


14-1108573257
Sour
2005-02-16 20:00
2005.03.13
Motorola mpx200


9-1103379826
йцуеук
2004-12-18 17:23
2005.03.13
Угол между векторами?


14-1108752675
вредитель
2005-02-18 21:51
2005.03.13
О музыке сложной для восприятия или... ля-ля-ля, а я сошла с ума


14-1108748490
Knoxville
2005-02-18 20:41
2005.03.13
Как из картинки с текстом сделать просто текст?