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

Вниз

Не пойму почему код работает :)   Найти похожие ветки 

 
Kolan ©   (2007-01-03 21:57) [0]

Объясните почему такое:
function TEquation.EvaluateX1(A,B,C: Double): Double;
var
 Equat: TEquation;
begin
 Result := (-B+Equat.EvaluateDiscriminant(A,B,C))/(2*A);
end;


Работает?
И почему нет не утечек не AV&#133


 
tesseract ©   (2007-01-03 21:59) [1]

А почему не должен?


 
kaZaNoVa ©   (2007-01-03 21:59) [2]

Kolan ©   (03.01.07 21:57)
И почему нет не утечек не AV…

радоваться надо ...


 
Kolan ©   (2007-01-03 22:02) [3]

Хочу понять. Прислал «начинающий». Надо объяснить(себе прежде всего) почему это вообще работает&#133


 
tesseract ©   (2007-01-03 22:03) [4]


> kaZaNoVa ©   (03.01.07 21:59) [2]


Да, он просто напрямую к функции через VMT обращается, ты же Create тоже, не создав объект вызываешь :-).


 
Kolan ©   (2007-01-03 22:03) [5]

«А почему не должен?»

Ну экземпляр не создается. Я не понимаю что в этом случае происходит. Объясни.


 
Kolan ©   (2007-01-03 22:05) [6]

«Create»

Это же не Create. Я думал с конструктор — особый случай.


 
ferr ©   (2007-01-03 22:06) [7]

Что с народ а ? :)


 
ferr ©   (2007-01-03 22:06) [8]

static method"s


 
tesseract ©   (2007-01-03 22:11) [9]


> ferr ©   (03.01.07 22:06) [8]
> static method"s


Virtual methods. В Delphi нет статических классов.

Он просто вызывает функцию, сделай "С" например полем объекта и вызови функцию, AV может и не будет, но результат  измениться :-).


 
vidiv ©   (2007-01-03 22:11) [10]

program Project2;
{$APPTYPE CONSOLE}
type

   TMy = class(TObject)
       public
       class procedure OutLine();
   end;
   TMyClass = class of TMy;

   class procedure TMy.OutLine;
   begin
       WriteLn("This is OutLine method.");
   end;

var
   My: TMyClass;
begin
 My.OutLine;
 Readln;
end.


 
vidiv ©   (2007-01-03 22:14) [11]


> Virtual methods. В Delphi нет статических классов.

OutLine в моем случае статический метод.
А виртуальный метод это вообще из другой оперы.


 
Gero ©   (2007-01-03 22:16) [12]

> [0] Kolan ©   (03.01.07 21:57)

Что такое TEquation и что такое EvaluateDiscriminant?


 
tesseract ©   (2007-01-03 22:17) [13]


> OutLine в моем случае статический метод.


Метод статический - класс виртуальный, даже объектный тип имеет VMT в Delphi.


 
palva ©   (2007-01-03 22:19) [14]

> vidiv ©   (03.01.07 22:11) [10]
Ну это классовый метод. А вот обычный. Тоже работает.

program Project2;
{$APPTYPE CONSOLE}
type
  TMy = class(TObject)
      procedure OutLine();
  end;
procedure TMy.OutLine;
begin
  WriteLn("This is OutLine method.");
end;

var
  My: TMy;
begin
 My.OutLine;
 Readln;
end.



 
tesseract ©   (2007-01-03 22:21) [15]

Да вроде классовые методы при typecasting от обычных не сильно отличаеться, всё равно вызоветься функция по тому-же адресу.


 
vidiv ©   (2007-01-03 22:22) [16]


> palva ©   (03.01.07 22:19) [14]

Точно =) Все так просто =)


 
Kolan ©   (2007-01-03 22:25) [17]

Не не никаких class procedure .

Вот класс:
 TEquation = class
   
   protected
     function EvaluateDiscriminant(A,B,C: Double): Double;
   public

     function EvaluateX1: Double;
     function EvaluateX2: Double;
 end;


 
Kolan ©   (2007-01-03 22:27) [18]

«Тоже работает.»

Так почему?


 
tesseract ©   (2007-01-03 22:29) [19]


> Kolan ©   (03.01.07 22:27) [18]


см [9] ты вызываешь ФУНКЦИЮ. Неважно, по какому адресу она будет вызвана, код в памяти, он выполниться.


 
isasa ©   (2007-01-03 23:04) [20]

tesseract ©   (03.01.07 22:29) [19]

Да, но в варианте

var
 My: TMy;
begin
My.OutLine;
My.Free;
Readln;
end.

все встанет на свои места, хотя Free, тоже только функция. :)


 
tesseract ©   (2007-01-03 23:11) [21]


> isasa ©   (03.01.07 23:04) [20]


My=nil.

Free не вызовет AV.


 
vidiv ©   (2007-01-03 23:12) [22]

А интересно, из My.OutLine можно создать объект My ?


 
isasa ©   (2007-01-03 23:15) [23]

У меня на Д7 AV

...
var
 My: TMy;
begin
try
 My.OutLine;
 My.Free;
except
 on E: Exception do
  writeln(e.message);
end;
Readln;
end.


 
vidiv ©   (2007-01-03 23:15) [24]

А еще интересно:
program Project2;
{$APPTYPE CONSOLE}
type

   TMy = class(TObject)
       public
       Text:String;
       procedure OutLine();
   end;

   procedure TMy.OutLine;
   begin
       Writeln(Integer(@Self));
   end;

var
   My: TMy;
begin
 My.OutLine;
 Writeln(Integer(@My));
 Readln;
end.

Тут адрес у Self и у My разные... Где находится My это понятно, а где в таком случае находится Self? ведь память под него небыла выделена.


 
isasa ©   (2007-01-03 23:17) [25]

Да.
This is OutLine method.
Access violation at address 00403220 in module "Project1.exe". Read of address 0
000FFFC


 
vidiv ©   (2007-01-03 23:21) [26]

Отладка модуля system показала, что в процедуре
procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;

Integer(@Self) = 0, при этом условие Self <> nil истенно и AV происходит уже внутри Destroy, что странно.


 
vidiv ©   (2007-01-03 23:22) [27]

Хотя нет,  я ошибся... AV происходит как раз при вычислении значения этого условия.


 
tesseract ©   (2007-01-03 23:23) [28]


> end.Тут адрес у Self и у My разные... Где находится My это
> понятно, а где в таком случае находится Self? ведь память
> под него небыла выделена.


В куче или хз где ещё, AV зависит от настроек дебаггера , хотя  лучше проверять на Assigned. Про Self в данном случае надо читать в документации. Она от версии к версии разная (D7 и Turbo delphi реагируют по разному, проверено).


 
vidiv ©   (2007-01-03 23:27) [29]

А вот еще пример:
program Project2;
{$APPTYPE CONSOLE}
type

   TMy = class(TObject)
       public
       procedure OutLine();
   end;

   TMy2 = class(TObject)
       public
       procedure OutLine();
   end;

   procedure TMy.OutLine;
   begin
       Writeln(Integer(@Self));
   end;

   procedure TMy2.OutLine;
   begin
       Writeln(Integer(@Self));
   end;

var
   My: TMy;
   My2: TMy2;
begin
 My.OutLine;
 My2.OutLine;
 Readln;
end.


Результат:
1245092
1245092


 
tesseract ©   (2007-01-03 23:29) [30]


> vidiv ©   (03.01.07 23:27) [29]


В чем непонятки?


 
vidiv ©   (2007-01-03 23:30) [31]

Короче походу Self это просто так... осталось от неизвестно чего =))


 
isasa ©   (2007-01-03 23:32) [32]

tesseract ©   (03.01.07 23:29) [30]

:)
Это неубиенный класс. Здесь AV нет.

type
 TMy = class(TObject)
     procedure OutLine();
 end;
procedure TMy.OutLine;
begin
 WriteLn(format("This is OutLine method. %p",[pointer(self)]));
end;

var
 My: TMy;
begin
 try
   My:=nil;
   My.OutLine;
except
 on E: Exception do
   writeln(e.message);
end;
Readln;
end.


 
tesseract ©   (2007-01-03 23:33) [33]


> Это неубиенный класс. Здесь AV нет.


Приколы RTTI :-)


 
tesseract ©   (2007-01-03 23:36) [34]

точнее, VMT есть в памяти и вызвать функцию можно.


 
isasa ©   (2007-01-03 23:48) [35]

tesseract ©   (03.01.07 23:36) [34]
Гы, а что еще нужно сделать, чтобы "выгрузить" эту чертову виртуальную таблицу? Взорвать динамитом? :)


 
tesseract ©   (2007-01-04 09:16) [36]


> Гы, а что еще нужно сделать, чтобы "выгрузить" эту чертову
> виртуальную таблицу? Взорвать динамитом? :)


Закрыть программу - выгрузиться, как миленькая.


 
KSergey ©   (2007-01-04 09:52) [37]

Я что-то никак не пойму о чем тут говорят...
В исходном вопросе все работает, очевидно, потому, что метод EvaluateDiscriminant класса TEquation не обращается к полям этого класса. Ну и не вызывает другие методы, которые к полям класа обращается. Вот и все.
Как только он обратится к полям класса - сразу понадобится (будет неявное обращение к) Self - тут и вылезет все что угодно в зависимости от положения звезд.

Последующие "эксперименты" это и иллюстрируют.

Так о чем разговор-то?


 
tesseract ©   (2007-01-04 09:53) [38]


> Так о чем разговор-то?


Про "Почему ?" в нетрезвом виде.


 
Аноним   (2007-01-04 10:28) [39]


> KSergey ©  


Хоть один здравомыслящий человек в ветке .
ОТ себя добавлю
не обращается к полям этого класса и не вызывает вируальные (динамичские) методы, ну и сам таковым не является, разумеется.
Работать будет всегда и давать всегда одинаковый результат


 
isasa ©   (2007-01-04 10:28) [40]

KSergey ©   (04.01.07 09:52) [37]

Я что-то никак не пойму о чем тут говорят...
В исходном вопросе все работает, очевидно, потому, что метод EvaluateDiscriminant класса TEquation не обращается к полям этого класса.


Ну вот, все испортил. :)
Ну а если сдвинув брови вещать, то

... не обращается к полям объекта этого класса ...



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

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

Наверх




Память: 0.56 MB
Время: 0.059 c
11-1146387189
gugua
2006-04-30 12:53
2007.01.28
Движение курсором мыши над ListView в режиме VirtualListView


11-1144662651
Godness
2006-04-10 13:50
2007.01.28
Почему не меняется стиль формы?


2-1168607110
O.O
2007-01-12 16:05
2007.01.28
Тип DECIMAL


1-1164787681
*Ray*
2006-11-29 11:08
2007.01.28
перерисовка DBGrid


15-1167926050
kaZaNoVa
2007-01-04 18:54
2007.01.28
Психология и интернет, реальность и виртуальность.