Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.042 c
11-1145021247
AndreyRus
2006-04-14 17:27
2007.01.28
Выравнивание по правому краю


15-1168573828
Slider007
2007-01-12 06:50
2007.01.28
С днем рождения ! 12 января


15-1168006020
IMHO
2007-01-05 17:07
2007.01.28
Вечная компьютерная игра


2-1168325787
DelphiLexx
2007-01-09 09:56
2007.01.28
Быстрое заполнение дин. массива


15-1168438608
vasIzmax
2007-01-10 17:16
2007.01.28
"...свиные консервы..." :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский