На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила ЧаВо (FAQ) разделов Паскаля
В этом разделе разрешено создавать только темы, в которых описано РЕШЕНИЕ какой-либо общей проблемы, или описание какого-либо аспекта языка Паскаль.
Обсуждение уже созданных тем разрешено, но только конструктивное, например указание на ошибку или уточнение имеющегося текста.

Также читать Требования к оформлению статей
Модераторы: volvo877, Romtek
  
> Процедурные и функциональные типы , и переменные
    Процедурные и функциональные типы и переменные.


    Если в программе требуется несколько раз определить интеграл для различных функций, то в этом случае вычисление интеграла выполняют в виде подпрограммы, а при обращении к ней указывают имя конкретной функции f(x). Тогда имя функции играет роль параметра, следовательно, если имеются функциональные параметры, то должны быть также функциональные типы, переменные и константы.

    Описание процедурного (функционального) типа имеет вид заголовка процедуры (функции), но без имени процедуры (функции).
    ExpandedWrap disabled
      Type
          ProcType1 = procedure;
          ProcType2 = procedure(a: real);
          ProcType3 = procedure(Var x: real; m,n: byte);
          FuncType1 = function: real;
          FuncType2 = function(x: real): real;
      Var    P1,P2 : ProcType3;
          F1,F2 : FuncType2;

    Имена переменных в описании типа процедур и функций играет чисто иллюстративную роль.

    Процедурные и функциональные константы – это имена конкретных процедур и функций.
    ExpandedWrap disabled
      Begin
          Proc1(y,m,k);
          P1:=Proc1;    { процедурной переменной P1 присваивается процедурная константа Proc1 }
          P1(y,m,k)
      End;

    Обращение Proc1(y,m,k) тождественно P1(y,m,k).
    Процедурная или функциональная переменная это указатель, который определяет адрес точки входа конкретной процедуры или функции, следовательно, процедурные (функциональные) переменные занимают 4 байта памяти.

    Присваивание процедурной (функциональной) переменной конкретного значения определяется общими правилами, т.е. ей можно присвоить значение другой процедурной (функциональной) переменной или значение процедурной (функциональной) константы того же типа.

    Адреса в программе могут быть полными и короткими, в частности локальные переменные всегда имеют краткий адрес. Краткий адрес – это одно смещение (без сегмента) т.е. 2 байта. Использование кратких адресов существенно экономит память программы.

    Процедурные константы так же могут иметь полный или краткий адрес. Те процедуры, имена которых в интерфейсной части (Interface в модулях) – всегда имеют полный адрес, а части реализации (Implementation в модулях) могут иметь как полный, так и краткий адрес. Внутренние (вложенные) процедуры всегда имеют краткий адрес. Если процедурной (функциональной) переменной присваивается значение процедурной (функциональной) константы, то такая константа должна иметь полный адрес.


    При использовании конкретных процедур в качестве процедурных констант должны выполняться следующие требования:
    1. Процедура (функция) должна компилироваться с директивой {F+}, которая обеспечивает генерацию полного адреса или сразу после ее заголовка должна идти стандартная директива FAR;.
      ExpandedWrap disabled
        {$F+}
        Function F1: real;
        Begin
            ...
        End;
        {$F-}

      или
      ExpandedWrap disabled
        Function F1: real; far;
        Begin
            ...
        End;
    2. Это не должна быть внутренняя процедура (функция) т.е. она не должна быть вложенной.
    3. Это не должны быть процедуры и функции объекта. (спасибо ZenIA)
    4. Если это стандартная процедура (функция), то для нее должна быть выполнена процедурная оболочка.

    Стандартными считаются процедуры и функции, которые не требуют программной реализации (например, процедуры и функции модуля system).
    Некоторые стандартные процедуры могут иметь аргументы разного типа, а так же переменное количество аргументов. Например, sin(x) – вещественный или целый тип, write – произвольное количество аргументов разного типа.
    Процедурная (функциональная) оболочка обеспечивает единственность аргументов в процедуре (функции).
    ExpandedWrap disabled
      Function SinReal(const x: real): real;
      Begin
          SinReal:=sin(const x)
      End; { SinReal }
       
      Procedure WriteLnStr(const s: string);
      Begin
          WriteLn(const s)
      End; { WriteLnStr }

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

    Текст составлен по мотивам лекций по Turbo Pascal Назаренко В.И.
    Прикреплённый файлПрикреплённый файлintegr.zip (1 Кбайт, скачиваний: 334)
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0234 ]   [ 16 queries used ]   [ Generated: 27.04.24, 03:53 GMT ]