Страница 1 из 1

работа с функциями, дальнее связывание или какой-то глюк...

Добавлено: 15 дек 2006, 22:52
gekakos
смысл такой: делаю прогу, есть модуль, в нем процедура:

Код: Выделить всё

type Func=function(x:real):real;
procedure SIMPSON(A,B,EPS:real; INTEG:Func; var I1:real);
основной модуль подключает этот
в основном модуле есть функция:

Код: Выделить всё

function FB(i:integer;x:real):real;

function INTEG(x:real):real;far;
begin
 INTEG:=U(i,x)*(F(x)-LU(0,x));
end;

var Int:real;
begin
 SIMPSON(A,B,EpsS,INTEG,Int);
 FB:=Int;
end;
короче в теле функции FB вызов SIMPSON с параметром INTEG! - компилятор этого не понимает и выдает ошибку, мол, функция INTEG неверно определена...

если я даже определю INTEG не локально, то все равно не понимает...((
примечание: функция INTEG должна быть определена в FB!
в чем моя ошибка???

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 01:53
Хыиуду
Может быть, функции U, F и Lu не определены? Или их определение стоит после определения Integ?

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 10:11
SergeyS
Это у тебя паскаль или делфи? Я попробовал твой код в делфи, все нормально...

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 10:21
SergeyS
извиняюсь, теперь увидел что это паскаль... видно глядел мимо :(
попробовал в паскале следующий код:

Код: Выделить всё

type Func = function(x:real):real;

procedure SIMPSON(A, B, EPS: real; INTEG: Func; var I1: Integer);
begin
end;

function INTEG(x: real): real; far;
begin
  INTEG := x;
end;

var
  i: Integer;
begin
  SIMPSON(0, 0, 0, INTEG, i);
end.
все работает

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 12:36
gekakos
SergeyS писал(а):извиняюсь, теперь увидел что это паскаль... видно глядел мимо :(
попробовал в паскале следующий код:

Код: Выделить всё

type Func = function(x:real):real;

procedure SIMPSON(A, B, EPS: real; INTEG: Func; var I1: Integer);
begin
end;

function INTEG(x: real): real; far;
begin
  INTEG := x;
end;

var
  i: Integer;
begin
  SIMPSON(0, 0, 0, INTEG, i);
end.
все работает
спасибо! Но может кто-нибудь объяснить почему не работает следующий код на паскале:

Код: Выделить всё

type Func = function(x:real):real;

procedure SIMPSON(A, B, EPS: real; INTEG: Func; var I1: Integer);
begin;
end;

function FB(i: integer): real;

 function INTEG(x: real): real; far;
 begin
  INTEG:= x*i;
 end;

begin
  SIMPSON(0, 0, 0, INTEG, i);
end;

begin

end.
заранее благодарю всех откликнувшихся.

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 13:16
Хыиуду
У меня такое чувство, что когда ты вызываешь дальнюю процедуру INTEG, ты из нее не можешь обратиться к переменной i, определенной в SIMPSON

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 13:34
gekakos
Хыиуду писал(а):У меня такое чувство, что когда ты вызываешь дальнюю процедуру INTEG, ты из нее не можешь обратиться к переменной i, определенной в SIMPSON
могу, проблема не в обращении к i, проблема в вызове INTEG! а из-за i и нужно, чтобы процедура INTEG была внутри FB, иначе пришлось бы делать i глобальной для всего модуля - а это дурной тон и некрасиво, когда счетчик глобален...

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 14:35
SergeyS
Похоже паскаль в принципе не допускает использование для локальных функций возможность передачи их как параметр.

А теперь посмотри, что ты хочешь добиться данным действием: ты хочешь передать локальную функцию как параметр с намерением использовать в теле этой функции некую переменную, которая является параметром её родительской процедуры. Уффф еле высказал.

А что такое параметр как функция? Это есть обыкновенный указатель на функцию, тип которой ты объявил выше. Что это нам значит? Это значит что как только ты передал указатель на эту функцию, то ты вызываешь некоторый код ассоциированный с данным указателем, который не обладает знанием о своей родительской процедуре! В итоге, даже если бы подобную штуку (передача в качестве указателя локальной функции) компилятор и пропустил, то на момент выполнения переменная i у тебя была бы не определена.

Мне кстати удалось обмануть компилятор :) , я передал указатель на эту функцию:

Код: Выделить всё

type
  Func = function ...
  PFunc = ^Func;

  Simpson(INTEG: PFunc);
  ...
После этого все откомпилировалось но при выполнении выскочила фатальная ошибка :(

Так что ищи другие пути, а глобальных переменных не бойся, не так уж это и плохо и следуй принципу KISS (keep it simple stupid) :)

Re: нужна помощь по Pascal! все очень запутано...

Добавлено: 16 дек 2006, 15:25
gekakos
спасибо! красиво видимо не получится сделать...