- Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, Unit1
{ you can add units after this };
var
A, B: Double;
R: Double;
procedure Run(var aA, aB: Double; var aR: Double);
var
F: Text;
fnc: TMyFunct;
// В этой функции не видны переменные aA и aB !
function Calc(aC: Double): Double; pascal;
begin
Result := (aA + aB) / aC;
end;
begin
aA := aA * 2.0;
aB := aB * 2.0;
fnc := @Calc; // Вот тут ругается компилятор.
//Calculate(TMyFunct(@Calc), aR);
Calculate(fnc, aR);
Assign(F, 'test.lst');
Rewrite(F);
WriteLn(F,'A=',aA:4:1,'; B=',aB:4:1,'; R=',aR:4:1);
Close(F);
end;
begin
A := 10.0;
B := 20.0;
R := 0.0;
Run(A, B, R);
end.
И еще кусочек
- Код: Выделить всё
unit Unit1;
{$mode objfpc}
interface
uses
Classes, SysUtils;
type
TMyFunct = function (C: Double): Double; pascal;
procedure Calculate(aFunc: TMyFunct; var aRes: Double);
implementation
procedure Calculate(aFunc: TMyFunct; var aRes: Double);
var
C: Double;
begin
C := 30.0;
aRes := aFunc(C);
end;
end.
Получаю несколько проблем.
1) При компиляции кода получаю ошибку:
- Код: Выделить всё
project1.lpr(29,12) Error: Incompatible types: got "<address of function(Double):Double is nested;Pascal>" expected "<procedure variable type of function(Double):Double;Pascal>"
ОБАНА!!!!
Это в строке fnc := @Calc;. Что тут не так? Мне не понятно.
Ну да ладно. Эту строку комментируем, строку Calculate(fnc, aR); комментируем, а строку //Calculate(TMyFunct(@Calc), aR); открываем.
2) В этом случае все компилируется, но при выполнении оказывается что в функции Calc переменные aA и aB не видны.
Подскажите что я делаю неправильно?
ЗЫ. На борту Windows XP и FPC 2.6.0
Добавлено спустя 19 часов 49 минут 6 секунд:
Почему требуется именно так?
Процедура Calculate реализует метод поиска оптимума функции.
Функция Calc вычисляет значение целевой функции в точке. Для вычисления целевой функции требуется еще куча данных (это те что оказались невидимыми aA и aB, .... их там прилично штук).
Ну вот я и разнес по разным модулям. Метод Calculate еще кой-где используется но с другой целевой функцией. Но не работает вся эта связка.
Сейчас у меня реализован "индусский говнокод". Во всех местах где требуется найти экстремум, а их что-то около 50, всунут код Calculate. Ну дебилизм же!
Помогите, люди добрые!!!