Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.032 c
3-1079615388
Лысый
2004-03-18 16:09
2004.04.18
ADOConnection


4-1076421131
sherminator
2004-02-10 16:52
2004.04.18
окно без кнопок


1-1080539151
EvgeniyR
2004-03-29 09:45
2004.04.18
Handle


3-1079974397
Igoryok
2004-03-22 19:53
2004.04.18
Функция seek


1-1080729635
010101001010001010101001
2004-03-31 14:40
2004.04.18
ТЕКСТ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский