Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Адрес функции


Автор: decoder 3.9.2004, 15:20
Тип, который должен содержать указатель на функцию с одним параметром. Попробовал сделать так:
Код

...
type
 PFunct1 = ^TFunct1;
 TFunct1 = function(p1: Real): Real; stdcall;

 TFunction = record
   ...
   Funct: PFunct1;
   ...
 end;
...
procedure ргос;
var
 f: TFunction;
begin
 ...
 {1}f.Funct := @Cos; // требует аргументы к косинусу
 {2}ShowMessage(FloatToStr(f.Funct^(90.0))); { когда ставлю вместо кос собственную функцию на строчке 1 возникает ЭксесВиолэйшэн }
 ...
end;
...

Может здесь, хоть 10% правильны?
ПАМАГИТЕ, ЛЮДИ ДОБРЫЕ!

Автор: Illusion Dolphin 3.9.2004, 15:31
Цитата
f.Funct := @Cos;

А разве Cos работает с целыми числами? Мне казалось, что с extended или real...

Автор: decoder 3.9.2004, 15:33
Ща попробую...
Добавлено @ 15:35
функция перевода Рил в Стринг?
Добавлено @ 15:41
Всё равно требует аргументы...

Автор: Illusion Dolphin 3.9.2004, 15:56
Код

type
Tf = function(x : real):real of object;

Код

function a(a : real):real;
begin
result:=cos(a);
end;

procedure ргос;
var f: Tf;
begin
@f:=@a;
showmessage(FloatToStr(f(2)));
end;

Так работает... напрямую адрес косинуса брать отказывается. видимо это встроенная функция (у неё нет описания, есть какой-то абстрактный _COS ), и, может, у неё нет адреса.

Автор: decoder 3.9.2004, 16:12
не, не пойдёт...
Должно быть поле в структуре. Кроме того, нужна произвольная функция.
Так что смотри первую строчку читаемого сообщения smile.gif

Автор: Illusion Dolphin 3.9.2004, 16:23
Цитата
Кроме того, нужна произвольная функция

Что имеется в виду? ты же всё равно будешь там писать или cos или sin, а не вводить с клавы в рунтайм...
В моём коде функция а имеет такие же параметры, как и cos, дублирует её. Если брать @a, то всё в норме, если @cos, то проблема... Я имею в виду, что, вероятно, адрес у этих функций вообще отсутствует (это встроенные в компилятор функции, если удерживать ctrl и кликнуть по тому же cos, то листинга не получишь 8( )
Цитата
Должно быть поле в структуре

f.Funct := @Cos;
замени на
f.Funct := @a;
где а - функция как у меня в коде...

Автор: decoder 3.9.2004, 16:43
Это не обязательно Sin || Cos - это любая функция, хоть встроенная, хоть нет, а то, что ты написал... Хочешь сказать, что надо переписать все функции как функция "a"(
FUNCTION nSin(p1: Real): Real;
begin
Result := Sin(p1);
end;
FUNCTION nCos(p1: Real): Real;
begin
Result := Cos(p1);
end;
...
FUNCTION nSomeFunction(p1: Real): Real;
begin
Result := SomeFunction(p1);
end;
). По-моему это глупо... Но если нет другого способа, то... 2Олл плиз найдите другой способ!

ЗЫ
Цитата(Illusion @ 3.9.2004, 16:23)
это встроенные в компилятор функции, если удерживать ctrl и кликнуть по тому же cos, то листинга не получишь
Знаю - не тупой mad.gif

Добавлено @ 16:49
Оффтоп
А чё у меня ошибки на странице вылазят? Можт сообщить кому надо?

Автор: decoder 3.9.2004, 17:12
Попробовал сделать, как ты, Illusion Dolphin, посоветовал:
(см. комментарии)
Код

...
type
TFunct1 = function(p1: Real): Real of Object; stdcall;

TFunction = record
  ...
  Funct: TFunct1;
  ...
end;
...
function nCos(p1: Real): Real;
begin
 Result := Cos(p1);
end;
procedure ргос;
var
f: TFunction;
begin
...
{1}@f.Funct := @a; // проходит нормально
{2}ShowMessage(FloatToStr(f.Funct(90.0))); { матерится ExternalException'ами }
...
end;
...

Автор: Illusion Dolphin 3.9.2004, 19:08
Цитата
{1}@f.Funct := @a; // проходит нормально
{2}ShowMessage(FloatToStr(f.Funct(90.0))); { матерится ExternalException'ами }

А у тебя f.Funct это уже указатель, надо
Код

f.Funct := @a;

Автор: decoder 3.9.2004, 20:27
Заработало! (с)Матроскин smile.gif
Эх, семь сообщений... wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)