Форум: "Прочее";
Текущий архив: 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…
← →
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]Хочу понять. Прислал «начинающий». Надо объяснить(себе прежде всего) почему это вообще работает…
← →
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.044 c