Форум: "Прочее";
Текущий архив: 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 не обращается к полям этого класса.
Ну вот, все испортил. :)
Ну а если сдвинув брови вещать, то
... не обращается к полям объекта этого класса ...
← →
Контра (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;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.063 c