![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятки с кодом [D7]
Дмитрий Белькевич © (2008-08-09 14:57:00)Делаю так:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTestRec = record
s: string;
i: integer;
end;
TTest = array of TTestRec;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function Test: TTest;
function Test2(var Test: TTest): string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.Test: TTest;
begin
;
end;
function TForm1.Test2(var Test: TTest): string;
begin
Finalize(Test);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Test2(Test));
end;
end.
Компайлер пишет, что Type of actual and formal var parameters must be identiacal.
Странное поведение на мой взгляд. Почему так происходит?
Как сделать по-другому объяснять не нужно.
{RASkov} (2008-08-10 10:18:00) [1]И что бы это еще могло означать?
Ну может быть то и значит, что результат функции и var параметр - не совместим :)
Но данный Error точно с именами не связан...
Palladin (2008-08-10 02:20:00) [2]
> А динамический резалт куда пишется?
именно туда и пишется, в регистры или, если регистров не хватает, в стек. а теперь угадай как передается параметр с префиксом var. в принципе угадывать нечего, достаточно сходить по F1.
Дмитрий Белькевич (2008-08-10 00:11:00) [3]>И что бы это еще могло означать?
Вот, собственно, главный вопрос ;) Немного неочевидно, конечно.
Amoeba (2008-08-09 23:45:00) [4]
> Ну с именами хоть и бардак, но не "противозаконно"... вроде
> :)
Уверен, что компилятор в состоянии разгрести сей бардак?
> Type of actual and formal var parameters must be identiacal.
И что бы это еще могло означать?
{RASkov} (2008-08-09 22:58:00) [5]> [11] Amoeba © (09.08.08 21:55)
Ну с именами хоть и бардак, но не "противозаконно"... вроде :)
Т.е.
function TForm1.Test: TTest;
begin
;
end;
function TForm1.Test2(var Test: TTest): string;
begin
Finalize(Test); // Тут Test параметр
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Test2(Test)); //Тут Test функция
end;
Дмитрий Белькевич (2008-08-09 22:03:00) [6]Спасибо. Вопросов больше не имею.
Amoeba (2008-08-09 21:55:00) [7]
> Дмитрий Белькевич © (09.08.08 21:00) [9]
>
> > var TestT: Test;
> > и
> > function TForm1.Test: TTest;
>
> Неправильно написано, так верно:
>
> > var Test: TTest;
> > и
> > function TForm1. Test: TTest;
Ну, описАлся, добавив "Т". А речь шла об одинаковых именах переменной и метода (выделил жирным).
{RASkov} (2008-08-09 21:04:00) [8]> [9] Дмитрий Белькевич © (09.08.08 21:00)
Еще раз взгляни на [6], а именно, как ты себе представляешь такое:
function F(N: Integer): Integer;
begin
Result:=N*2;
end;
F:=10; !? А смысл?
А вар параметр и подразумевает изменение фактического параметра....
Дмитрий Белькевич (2008-08-09 21:00:00) [9]> var TestT: Test;
> и
> function TForm1.Test: TTest;
Неправильно написано, так верно:
> var Test: TTest;
> и
> function TForm1.Test: TTest;
Что должно смущать?
Функция Test2 предполагает на вход переменную типа TTest, функция Test имеет на выходе результат типа TTest.
>а как она еще должна интерпретироватся если она функция?
Не она, но её результат.
То есть результат функции, в терминах delphi - это const? Т.е. на выходе функции мы не имеем 'честную' переменную?
>вот именно
А динамический резалт куда пишется? Или внутри функции Result - это честный var, а на выходе становится const?
Amoeba (2008-08-09 15:48:00) [10]
> var TestT: Test;
> и
> function TForm1.Test: TTest;
Не смущает?
Palladin (2008-08-09 15:37:00) [11]
> Или переменная-результат вообще не создаётся никогда?
вот именно
Palladin (2008-08-09 15:37:00) [12]а как она еще должна интерпретироватся если она функция? ты бы еще написал test:='asas' и возмущался почему нельзя? var на входе ожидает явную переменную. хочешь передать по ссылке используй Const оно для этого специально и предназначено.
Дмитрий Белькевич (2008-08-09 15:35:00) [13]Или переменная-результат вообще не создаётся никогда?
С чем же мы тогда работаем внутри функции, как с Result'ом, и что тогда течет в памяти, если этот Result позже не разрушить (если он динамически создаётся в функции)?
Дмитрий Белькевич (2008-08-09 15:32:00) [14]Предполагалось, что Test вернёт значение - переменную, которая передастся по ссылке функции Test2. В Test2 переменная финализируется.
Почему в записи Test2(Test) Test интерпретируется как функция? Но не как её значение? При этом, если Test2 сделать без var - всё передастся без проблем.
Palladin (2008-08-09 15:25:00) [15]
> Дмитрий Белькевич © (09.08.08 15:20) [2]
var + F1
Дмитрий Белькевич (2008-08-09 15:20:00) [16]Почему функцию, но не возвращаемое ею значение?
sniknik (2008-08-09 15:05:00) [17]var требует переменную, ты подставляешь туда функцию... чего странного то?