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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
gekakos
Сообщения: 4
Зарегистрирован: 15 дек 2006, 22:39

смысл такой: делаю прогу, есть модуль, в нем процедура:

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

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!
в чем моя ошибка???
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Может быть, функции U, F и Lu не определены? Или их определение стоит после определения Integ?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Это у тебя паскаль или делфи? Я попробовал твой код в делфи, все нормально...
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

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

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

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.
все работает
gekakos
Сообщения: 4
Зарегистрирован: 15 дек 2006, 22:39

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.
заранее благодарю всех откликнувшихся.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

У меня такое чувство, что когда ты вызываешь дальнюю процедуру INTEG, ты из нее не можешь обратиться к переменной i, определенной в SIMPSON
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
gekakos
Сообщения: 4
Зарегистрирован: 15 дек 2006, 22:39

Хыиуду писал(а):У меня такое чувство, что когда ты вызываешь дальнюю процедуру INTEG, ты из нее не можешь обратиться к переменной i, определенной в SIMPSON
могу, проблема не в обращении к i, проблема в вызове INTEG! а из-за i и нужно, чтобы процедура INTEG была внутри FB, иначе пришлось бы делать i глобальной для всего модуля - а это дурной тон и некрасиво, когда счетчик глобален...
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Похоже паскаль в принципе не допускает использование для локальных функций возможность передачи их как параметр.

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

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

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

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

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

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

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

спасибо! красиво видимо не получится сделать...
Ответить