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

Вниз

Создание "процедурного типа" с параметром   Найти похожие ветки 

 
Leon ©   (2004-04-01 19:59) [0]

Неужели так делать нельзя:
function GenerateFunc(a: integer): Tfunc;
var r: real;
 function ffff(x: real):real;STDCALL;
 begin
   result := a;
 end;
begin
 result := @ffff;
end;

procedure TForm1.Button1Click(Sender: TObject);
var func : Tfunc;
begin
 func := GenerateFunc(10);
 caption := FloatToStr(func(5));
end;
Выходит всякая ерунда вроде 4394723!!!
Заранее спаибо.


 
Vuk ©   (2004-04-01 20:11) [1]

Проблема в том, что Вы пытаетесь использовать вложенную процедуру. Она нормально работает только в контексте той процедуры, в которую она вложена, т.к. у них общий стек.


 
Юрий Зотов ©   (2004-04-01 20:18) [2]

1. Вынесите внутреннюю функцию наружу.
2. Проверьте, есть ли stdcall в декларации TFunc. Если нет - нарушены соглашения о вызове. И зачем оно нужно - непонятно.
3. Вот рабочий код.

type
 TFunc = function(I: integer): integer;

function F1(I: integer): integer;
begin
 Result := 1
end;

function F2(I: integer): integer;
begin
 Result := 2
end;

function GetFunc(I: integer): TFunc;
begin
 if I = 1 then Result := F1 else Result := F2
end;

procedure TForm1.AnyButtonClick(Sender: TObject);
var
 F: TFunc;
begin
 if Sender = Button1 then F := GetFunc(1) else F := GetFunc(2);
 Caption := IntToStr(F(0))
end;


 
Leon ©   (2004-04-02 17:31) [3]

[2].2: stdcall - это я умничал, а вообще-то пытался и без него.
[2].3: a если параметр пробегает 1000 значений, то нужно делать 1000 функций?  :)
Спасибо, попробую вынести.
Я имел в виду что-то вроде:
TFunc = function(X: real):real;

function ffff(x: real): real;
begin
 result := a*x;
end;
где a(параметр) и x(переменная) изменяются непрерывно, но "a" задаётся при инициализации.


 
Vuk ©   (2004-04-02 17:33) [4]

Не понял... Вы себе как процедурные переменные представляете?


 
Digitman ©   (2004-04-02 17:39) [5]


> Leon


функцию "сгенерировать" нельзя (если не рассматривать программное построение позиционно-независимого машкода в ран-тайм) - это прерогатива и прямая задача компилятора ..

это что касаемо подозрительного имени ф-ции GenerateFunc

строчка

result := @ffff;

в дан.случае всегда будет возвращать в вызывающую п/программу ОДНО И ТО ЖЕ значение, равное адресу точки входа в ф-цию ffff(), это значение расчитал компилятор на этапе построения исп.кода твоей программы, и это значение неизменно на всем протяжении работы твоей программы


 
Leon ©   (2004-04-02 19:04) [6]

>Vuk Представляю как адрес.

И так нельзя ?

TFunc = function(X: real):real;
...............
var a: real;
.................
function ffff(x: real): real;
begin
result := a*x;
end;
..............


 
Vuk ©   (2004-04-02 19:11) [7]

to Leon:
>Представляю как адрес.
Тогда как понимать
> но "a" задаётся при инициализации.
Инициализации чего?

>И так нельзя ?
Можно.


 
Юрий Зотов ©   (2004-04-03 13:20) [8]

> Leon ©   (02.04.04 19:04) [6]
> Представляю как адрес.

Именно. И причем не просто адрес, а именно адрес функции. Поэтому принимать ЛЮБОЕ значение он не может, а может принимать значение адреса одной из функций, которая УЖЕ есть в программе и адрес которой вычислен на этапе компиляции и сборки (о перемещаемом коде для простоты умолчим).

Стало быть, если Вы хотите иметь 1000 адресов, то в программе должно существовать 1000 функций. Либо Вам придется генерить машинный код функции динамически и выполнять его, например, в стеке (причем генерить придется именно с учетом перемещаемости кода). Задачка, скажем прямо, далеко не для первого класса. Во всяком случае, без крайней необходимости я бы за такое не взялся, а поискал более простое решение.


 
Leon ©   (2004-04-03 14:04) [9]

Всем спасибо, именно так я и поступлю.



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
1-1080434014
Dimedroll
2004-03-28 04:33
2004.04.18
-= Можно ли все Error ловить своей проги посредством WinAPI =-


4-1076877060
Axon
2004-02-15 23:31
2004.04.18
!!! OpenProceess !!!


9-1061582462
Sden
2003-08-23 00:01
2004.04.18
Проблема в DelphiX c TDirectDrawSurface


9-1066175102
Кен
2003-10-15 03:45
2004.04.18
GLScene Как визуально добавить TGLODEDummy ? Почему то немогу


4-1076853515
Rival
2004-02-15 16:58
2004.04.18
Чатота экрана