Форум: "Начинающим";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];
ВнизНепонятки с кодом Найти похожие ветки
← →
Дмитрий Белькевич © (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c