Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

Непонятки с кодом   Найти похожие ветки 

 
Дмитрий Белькевич ©   (2008-08-09 14:57) [0]

Делаю так:


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.

Странное поведение на мой взгляд. Почему так происходит?
Как сделать по-другому объяснять не нужно.


 
sniknik ©   (2008-08-09 15:05) [1]

var требует переменную, ты подставляешь туда функцию... чего странного то?


 
Дмитрий Белькевич ©   (2008-08-09 15:20) [2]

Почему функцию, но не возвращаемое ею значение?


 
Palladin ©   (2008-08-09 15:25) [3]


> Дмитрий Белькевич ©   (09.08.08 15:20) [2]

var + F1


 
Дмитрий Белькевич ©   (2008-08-09 15:32) [4]

Предполагалось, что Test вернёт значение - переменную, которая передастся по ссылке функции Test2. В Test2 переменная финализируется.

Почему в записи Test2(Test) Test интерпретируется как функция? Но не как её значение? При этом, если Test2 сделать без var - всё передастся без проблем.


 
Дмитрий Белькевич ©   (2008-08-09 15:35) [5]

Или переменная-результат вообще не создаётся никогда?
С чем же мы тогда работаем внутри функции, как с Result"ом, и что тогда течет в памяти, если этот Result позже не разрушить (если он динамически создаётся в функции)?


 
Palladin ©   (2008-08-09 15:37) [6]

а как она еще должна интерпретироватся если она функция? ты бы еще написал test:="asas" и возмущался почему нельзя? var на входе ожидает явную переменную. хочешь передать по ссылке используй Const оно для этого специально и предназначено.


 
Palladin ©   (2008-08-09 15:37) [7]


> Или переменная-результат вообще не создаётся никогда?

вот именно


 
Amoeba ©   (2008-08-09 15:48) [8]


> var TestT: Test;
> и
> function TForm1.Test: TTest;

Не смущает?


 
Дмитрий Белькевич ©   (2008-08-09 21: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?


 
{RASkov} ©   (2008-08-09 21:04) [10]

> [9] Дмитрий Белькевич ©   (09.08.08 21:00)

Еще раз взгляни на [6], а именно, как ты себе представляешь такое:

function F(N: Integer): Integer;
begin
 Result:=N*2;
end;

F:=10; !? А смысл?

А вар параметр и подразумевает изменение фактического параметра....


 
Amoeba ©   (2008-08-09 21:55) [11]


> Дмитрий Белькевич ©   (09.08.08 21:00) [9]
>
> > var TestT: Test;
> > и
> > function TForm1.Test: TTest;
>
> Неправильно написано, так верно:
>
> > var Test: TTest;
> > и
> > function TForm1.Test: TTest;

Ну, описАлся, добавив "Т". А речь шла об одинаковых именах переменной и метода (выделил жирным).


 
Дмитрий Белькевич ©   (2008-08-09 22:03) [12]

Спасибо. Вопросов больше не имею.


 
{RASkov} ©   (2008-08-09 22:58) [13]

> [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;


 
Amoeba ©   (2008-08-09 23:45) [14]


> Ну с именами хоть и бардак, но не "противозаконно"... вроде
> :)

Уверен, что компилятор в состоянии разгрести сей бардак?

> Type of actual and formal var parameters must be identiacal.

И что бы это еще могло означать?


 
Дмитрий Белькевич ©   (2008-08-10 00:11) [15]

>И что бы это еще могло означать?

Вот, собственно, главный вопрос ;) Немного неочевидно, конечно.


 
Palladin ©   (2008-08-10 02:20) [16]


> А динамический резалт куда пишется?

именно туда и пишется, в регистры или, если регистров не хватает, в стек. а теперь угадай как передается параметр с префиксом var. в принципе угадывать нечего, достаточно сходить по F1.


 
{RASkov} ©   (2008-08-10 10:18) [17]

И что бы это еще могло означать?

Ну может быть то и значит, что результат функции и var параметр - не совместим :)
Но данный Error точно с именами не связан...



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

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

Наверх




Память: 0.51 MB
Время: 0.012 c
2-1218464716
ChaosAD
2008-08-11 18:25
2008.09.21
Переход на другой компонет при достужении конечной длины Edit a


2-1218515832
Wood
2008-08-12 08:37
2008.09.21
OnClick для TButton


2-1218013388
irina_gr
2008-08-06 13:03
2008.09.21
QReport


15-1217578343
Vlad Oshin
2008-08-01 12:12
2008.09.21
интересную задачку нашел


15-1217147572
Пётр_Ф
2008-07-27 12:32
2008.09.21
Как вывести всем в сети ярлык на рабочий стол?