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

Также читать Требования к оформлению статей
Модераторы: volvo877, Romtek
  
> Абсолютные переменные
    А Б С О Л Ю Т Н Ы Е П Е Р Е М Е Н Н Ы Е

    Память для переменных, объявленных в разделе Var, выделяется при старте блока, в котором содержится данный раздел, в порядке объявления имен переменных. Местоположе-ние блока в пространстве оперативной памяти ЭВМ определяет операционная система. В то же время Турбо Паскаль предоставляет возможность программисту так описать переменные, чтобы им были назначены заранее заданные адреса. Такие переменные называются абсолют-ными; их описание после имени типа должно содержать так называемое абсолютное пред-ложение.
    Синтаксис абсолютного предложения:

    absolute + целое без знака + ':' + целое без знака
    или
    absolute + иденитификатор переменной

    Структура абсолютного предложения имеет два альтернативных варианта.
    В первом варианте производится задание абсолютного адреса в форме, принятой в опе-рационной системе MS DOS.

    Пример 1.
    ExpandedWrap disabled
      Type  ScreenChar = record
                Symbol : char;
                Attrib : byte;
            end;
            ScreenAr = array[1..25,1..80] of ScreenChar;
      Var  y : real absolute $A100:$0000;
           Screen : ScreenAr absolute $B800:$0000;

    Здесь переменным y и Screen назначаются конкретные адреса оперативной памяти. В частности, значение $B800:$0000 определяет фиксированный адрес видеопамяти.
    Примечание. В конструкции record .. end объединяются переменные различного типа (см.раздел FAQ "Записи").

    Во втором варианте для абсолютной переменной назначается адрес другой, ранее объ-явленной переменной.

    Пример 2 (аналогично примеру 2 статьи FAQ "Приведение типов").

    ExpandedWrap disabled
      Type  ByteAr = array[1..2] of byte;
      Var  W : word;
           Br : ByteAr absolute W;
      Begin
        Br[1]:=10; Br[2]:=20;
        Writeln(W,'   ',Br[1],'   ',Br[2]);
        W:=2500;
        Writeln(W,'   ',Br[1],'   ',Br[2]);


    В результате работы программы будет отпечатано:
    ExpandedWrap disabled
       
                    5130      10     20
                    2500    196       9

    Переменные W и Br адресуют одно и то же поле памяти. Другими словами, одно и то же поле памяти размером два байта имеет два имени: имя W и имя Br. Если в программе ис-пользуется имя W, то это поле можно обрабатывать как переменную типа word, для имени Br допустимые операции определяются именем типа ByteAr.
    При совмещении переменных с помощью директивы absolute не рекомендуется в раз-деле Var использовать описание типа вместо имени типа. Нарушение этого правила не ана-лизируется компилятором, но может привести к неправильной работе программы, вплоть до ее "зависания", особенно при использовании сопроцессора.

    Например, вместо описания
    ExpandedWrap disabled
      Var  A : record
                  x,y : real;
                  k,m,n : integer
               end;
          B : array[1..3] of real absolute A;

    следует применять описание

    ExpandedWrap disabled
      Type  RecType = record
               x,y : real;
               k,m,n : integer
            end;
            ArType = array[1..3] of real;
      Var  A : RecType;
           B : ArType absolute A;


    По мотивам лекций Назаренко В.И.
    Сообщение отредактировано: e-moe -
      P.S. from vot:
      Напомню, что использовать числовые адресные значения сегментов памяти считается дурным тоном, поскольку они актуальны только в REAL режиме. Стоит перейти в защищенный режим, и программа перестанет работать. Поэтому, вместо фактических системных адресов рекомендуется использовать специально предусмотренные для этого символические константы.
      Например, вместо $B800, $A000 следует использовать:
      SegB800, SegA000 и т.д.


      И еще: если упоминаете ФАК - делайте ссылку на конкретный URL !
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0413 ]   [ 17 queries used ]   [ Generated: 27.04.24, 00:13 GMT ]