Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизСоздание "процедурного типа" с параметром Найти похожие ветки
← →
Leon © (2004-04-01 19:59) [0]Неужели так делать нельзя:
function GenerateFunc(a: integer): Tfunc;
Выходит всякая ерунда вроде 4394723!!!
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;
Заранее спаибо.
← →
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;
где a(параметр) и x(переменная) изменяются непрерывно, но "a" задаётся при инициализации.
function ffff(x: real): real;
begin
result := a*x;
end;
← →
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.47 MB
Время: 0.033 c