Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонятки с кодом [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 требует переменную, ты подставляешь туда функцию... чего странного то?


Наверх

Титульная страница Поиск, карта сайта Написать письмо