- Код: Выделить всё
- 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. Ну дебилизм же!
Помогите, люди добрые!!!







