Главная страница
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 не обращается к полям этого класса.


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

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


 
Контра   (2007-01-04 10:53) [41]

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

...полям данных экземпляра класса...


 
Kolan ©   (2007-01-04 11:22) [42]

> [37] KSergey ©   (04.01.07 09:52)

О наконец я понял. :)


 
$Pl@Sh ©   (2007-01-04 12:57) [43]

Обычно задают вопросы типа "почему не работает", ИМХО на них отвечать проще :-)


 
Anatoly Podgoretsky ©   (2007-01-04 18:04) [44]

> $Pl@Sh  (04.01.2007 12:57:43)  [43]

> Обычно задают вопросы типа "почему не работает", ИМХО на них отвечать проще :-)

С какой стати.


 
isasa ©   (2007-01-04 18:38) [45]

Контра   (04.01.07 10:53) [41]

В паре object/instance -> объект/образец, мне больше объект нравится.
А вы каким переводчиком пользуетесь? :)


 
$Pl@Sh ©   (2007-01-04 20:40) [46]


> Anatoly Podgoretsky ©   (04.01.07 18:04) [44]


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

var i : integer;
begin
i := strtoint(edit1.text);
end;


почему работает????


 
Anatoly Podgoretsky ©   (2007-01-04 21:47) [47]

> $Pl@Sh  (04.01.2007 20:40:46)  [46]

Это не рабочий код


 
$Pl@Sh ©   (2007-01-04 21:59) [48]


> Anatoly Podgoretsky ©   (04.01.07 21:47) [47]


Это часть рабочего кода


 
Anatoly Podgoretsky ©   (2007-01-04 22:11) [49]

> $Pl@Sh  (04.01.2007 21:59:48)  [48]

Тогда зачем приводишь незначимую часть


 
$Pl@Sh ©   (2007-01-04 22:13) [50]


> Anatoly Podgoretsky ©   (04.01.07 22:11) [49]


Ну вот весь код:

unit Unit1;

interface

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

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

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
i := strtoint(edit1.text);

end;

end.



Почем уработает?


 
Sergey Masloff   (2007-01-04 22:31) [51]

$Pl@Sh ©   (04.01.07 22:13) [50]
Edit1.Text ;= "Бла-бла"

Все еще работает?
А компилятор ничего не говорит насчет того что присвоенное значение нигде не используется?


 
$Pl@Sh ©   (2007-01-04 22:32) [52]


> Все еще работает?
> А компилятор ничего не говорит насчет того что присвоенное
> значение нигде не используется?


Говорит, но работает же...


 
isasa ©   (2007-01-04 22:38) [53]

$Pl@Sh ©   (04.01.07 22:32) [52]
Говорит, но работает же...


Разное поведение кода на разніх машинах на набор значений
"1,25" и "1.25"


 
isasa ©   (2007-01-04 22:39) [54]

Сорри пропетрил  strtoint ... :)


 
$Pl@Sh ©   (2007-01-04 22:41) [55]


> isasa ©   (04.01.07 22:39) [54]


:-)



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

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

Наверх




Память: 0.61 MB
Время: 0.033 c
15-1168525657
*Pavel
2007-01-11 17:27
2007.01.28
Выбор серверной платформы


15-1167997829
DelphiLexx
2007-01-05 14:50
2007.01.28
Бесплатна ли библиотека JVCL


15-1167991529
alexeis
2007-01-05 13:05
2007.01.28
Установить принтер, не подключая его


15-1168081075
kaZaNoVa
2007-01-06 13:57
2007.01.28
Покритикуйте программу, Self-loader


2-1168419274
СержК
2007-01-10 11:54
2007.01.28
Как развернуть свернутое приложение поверх всех окон