Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1218377845
mefodiy
2008-08-10 18:17
2008.09.21
Количество записей в отфильтрованной ADOQuery


15-1217562468
Кактус
2008-08-01 07:47
2008.09.21
Ошибка выходит :(


15-1216939595
йцукен
2008-07-25 02:46
2008.09.21
Помогите реализовать алгоритм


15-1216755587
Petr V. Abramov
2008-07-22 23:39
2008.09.21
Где в Севастополе находится порт?


15-1217501373
Nic from the WORK
2008-07-31 14:49
2008.09.21
Выбор ноутбука. Часть 3





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский