Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 22:01   #1
Pasana
Новичок
Джуниор
 
Регистрация: 05.11.2013
Сообщений: 1
По умолчанию Нужна помощь! Передача в процедуру функции как па.раметра

Здравствуйте! Помогите, пожалуйста. Условие в изображении 7-6. Ниже код. Выдает ошибку 122 : Invalid variable reference. Подскажите, где и что пропустила?


Код:
program lab7p6;
type func=function (var x: real; var k: integer): real;

{$F+}

function power(x: real; k: integer): real; far;
var z: real;
begin
     if k=0 then power:=x
     else
         begin
         z:=x*x*x*x;
         power:=z*power(x, k-1);
         end;
end;

function fac(y: real): real; far;
begin
     if y=0 then fac:=1
     else
         begin
         fac:=y*fac(y-1);
         end;
end;


function dodatok (var x: real; var k: integer):real; near;
var a,d,b,c: real;
begin
     if (k mod 2)=0 then a:=1
     else a:=-1;
     d:=2*k+1;
     b:=power(x,k);
     c:=fac(2*k);
     dodatok:=a*b/c/d;
end;
{$F-}

procedure sum (var x,e: real; var d: func);
var s: real;
var k: integer;
begin
     k:=0;
     repeat
     writeln(d(x,k):2:10);
     s:=s+d(x,k);
     k:=k+1;
     writeln(s:5:5);
     writeln(k);
     writeln;
     until(abs(s)<e);
end;


var p,a,b,c,d,y,z,s,x,e: real;
    k,e1,e2: integer;

begin
if paramcount=2 then
   begin
   val(paramstr(1), x, e1);
   val(paramstr(2), e, e2);
   if (e1+e2)>0 then
      begin
      writeln('Error. Wrong data.');
      halt(0);
      end;
   if x=0 then
      begin
      writeln('Error. Division by zero.');
      halt(0);
      end;
   if (e>1) or (e<0) then
      begin
      writeln('Input another e (0<e<1).');
      halt(0);
      end;
   sum(x, e, dodatok);
   writeln('S=',s:5:5);
   end
else writeln('Error. Input x and e.');
end.
Изображения
Тип файла: jpg 7-6.jpg (36.2 Кб, 112 просмотров)

Последний раз редактировалось Stilet; 05.11.2013 в 22:22.
Pasana вне форума Ответить с цитированием
Старый 06.11.2013, 00:31   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Собралось на ideone.com:
Код:
program lab7p6;
type func=function (var x: real; var k: integer): real;

{$F+}

function power(x: real; k: integer): real; far;
var z: real;
begin
     if k=0 then power:=x
     else
         begin
         z:=x*x*x*x;
         power:=z*power(x, k-1);
         end;
end;

function fac(y: real): real; far;
begin
     if y=0 then fac:=1
     else
         begin
         fac:=y*fac(y-1);
         end;
end;


function dodatok (var x: real; var k: integer):real; near;
var a,d,b,c: real;
begin
     if (k mod 2)=0 then a:=1
     else a:=-1;
     d:=2*k+1;
     b:=power(x,k);
     c:=fac(2*k);
     dodatok:=a*b/c/d;
end;
{$F-}

procedure sum (var x,e: real; d: func);
var s: real;
var k: integer;
begin
     k:=0;
     repeat
     writeln(d(x,k):2:10);
     s:=s+d(x,k);
     k:=k+1;
     writeln(s:5:5);
     writeln(k);
     writeln;
     until(abs(s)<e);
end;


var p,a,b,c,d,y,z,s,x,e: real;
    k,e1,e2: integer;

begin
if paramcount=2 then
   begin
   val(paramstr(1), x, e1);
   val(paramstr(2), e, e2);
   if (e1+e2)>0 then
      begin
      writeln('Error. Wrong data.');
      halt(0);
      end;
   if x=0 then
      begin
      writeln('Error. Division by zero.');
      halt(0);
      end;
   if (e>1) or (e<0) then
      begin
      writeln('Input another e (0<e<1).');
      halt(0);
      end;
   sum(x, e, @dodatok);
   writeln('S=',s:5:5);
   end
else writeln('Error. Input x and e.');
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 06.11.2013 в 00:35.
BDA вне форума Ответить с цитированием
Старый 06.11.2013, 08:17   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Согласно документации паскаля, подпрограммы передаваемые по ссылке, должны быть объявлены как far , у Вас же:
Код:
sum(x, e, dodatok);
и 
function dodatok (var x: real; var k: integer):real; near;
Хотя у Вас и проставлена директива {$F+} , которая делает все подпрограммы far, думаю, при явном указании near имеет приоритет.

Решение по идее простое - заменить near на far или вообще убрать их, компиль сам разрулит, или будет подчиняться {$F+} , если Вы её применяете.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь с задачей с графиком функции Sting95 Помощь студентам 1 19.10.2013 11:21
Передача функции другой функции как аргумента C # stopanko C# (си шарп) 2 20.11.2011 13:13
C++ Функции! Нужна помощь! Faceless001 Помощь студентам 2 29.05.2009 16:51
Нужна помощь с передачей даных в процедуру programer_tang Общие вопросы Delphi 5 28.08.2008 10:14