пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ


20. Язык программирования Fortran. Структуры, описание и пример использования. Ссылки и адресаты в Fortran. Списки и структуры со ссылками на себя. Целочисленные указатели. Примеры использования. Области видимости имен и меток, область общей памяти.

  Ссылка – это переменная, которая может быть связанна с другой переменной, называемой адресатом, так что при обращении к ссылке будет происходить обращение к адресату и наоборот. Ссылка может рассматриваться как псевдоним адресата. Если в переменную-адресат поместить значение 10, то и в переменной-адресате так же будет значение 10.

Если в переменную-адресат поместить значение 50, то и в переменной-ссылке так же будет значение 50.

  Для описания ссылки используется атрибут pointer (стрелка, указатель), например

Integer? Pointer :: p

Означает, что переменная p будет являться ссылкой на переменную типа integer.

  Переменная, на которую будет ссылаться ссылка, называется адресатом и должна иметь атрибут target (цель)

Integer, target :: a

  Для присвоения ссылки к адресату используется специальный оператор =>,

Program prog

Integer, pointer :: p

Integer, target :: a

a=100

p=>a ! прикрепили ссылку к адресату

  write(*,*) p

end

Результат : 100

Cследовательно ссылка и адресат стали содержать одно и то же значение 100.

Основная особенность ссылок состоит в том, что если изменить значение а, то значение р тоже изменится в отличие от следующей записи:

Program prog                            Program prog

Integer p                                               Integer, pointer :: p

Integer a                                    Integer, target :: a

a=100                                                   a=100

p=a                                                       p=>a

a=500                                                   write(*,*) p

  write(*,*) p                                         a=500

end                                                                   write(*,*) p

                                                 end

Результаты соответственно будут

1)100

2)100

   500

В процессе работы программы ссылку можно прикреплять к разным адресатам.

Program prog

Integer, pointer :: p

Integer, target :: a, b, c

  a=100; b=200; c=300

  p=>a

  p=p*2

  p=>b

  p=p/2

  p=>c

  p=p+100

  write(*,*) a, b, c

end

Результаты: 200 100 400

Память может отводиться пи использовании оператора allocate либо после прикрепления ссылки к размещённому адресату.

Program prog

Integer, pointer :: p(:)

Integer, allocatable, target :: w(:)

Allocate (w(3))

W=100

P=>w ! присоединили ссылку к динамическому массиву

Write (*,*) p

End

Функция associated(pt, addr) возвращает true  если ссылка pt привязана к адресату addr, в частности если две ссылки указывают на один адресат. 

Для разрыва связи используется оператор nullify(pt). После разрыва память выделенная адресату будет недоступной для её освобождения следует использовать оператор deallocate(addr)

Списки и структуры со ссылками на себя

  Ссылки позволяют организововать специальные динамические структуры – списки, стеки, деревья, очереди. Для описания элемента списка используется, например, следующий структурированный тип данных:

Type element

  Integer info

  type (element), pointer :: arrow

end type element

  Таким образом элемент определён рекурсивно. В нём присутствует информационное поле info и ссылочное поле arrow на переменную типа element.

  Пример. Создать односвязный список  и вывести содержание этого списка на экран. Пусть элементами списка будут выступать чмсла 100, 200 и т.д.

Program list

Type element

  Integer index

  Type (element), pointer :: arrow

End type element

Type (element), pointer :: phead, pt

Nullify(phead)

Do i=1, 5

  Allocate(pt)

  Pt=element(i*100, phead)

  Phead=>pt

End do

Pt=>phead  ! ссылка на голову

Do while (associated(pt))

  Write(*,”(a,i4)”) “Index…”,pt.index

  Pt=>pt.arrow

End do

Результаты:

Index…500

Index…400

Index…300

Index…200

Index…100

В программе используются две ссылки: phead ссылка на голову и pt – ссылка на текущий элемент списка. При помощи конструктора происходит инициализация элемента, в поле index заносится значение 100, поле arrow указывает на обнулённую голову phead. Затем в результате присваивания голова списка становится текущим элементом. Таким образом, в памяти формируется связанная структура: голова списка ссылается на соседний элемент, тот в свою очередь, на следующий и так до последнего элемента, который ссылается на обнулённую голову. Для вывода организуем цикл, который проверяет не прикрепляется ли ссылка к адресату с помощью associated.

Целочисленные указатели

Целочисленный указатель – это переменная типа integer, содержащая адрес некоторой переменной, называемой адресной переменной. Если ссылка – это переменная, которая ссылается на другую переменную, при этом имеет такой же тип, как и переменная-адресат, то целочисленный указатель это переменная, которая содержит адрес переменной.

  Для описания целочисленного указателя используется оператор pointer.

Например, указатель на вещественную переменную:

Real a

Pointer (p,a)

Здесь а выступает для хранения значения, p – для хранения адреса переменной. Другими словами, для описания целочисленного указателя используются базируемая переменная и указатель.

Пример указатель на символьную переменную.

Character c

Pointer(p,c)

Указатель на переменную типа student.

Type student

  Character(10) name

  Integer  year

End type student

Type (student) s

Pointer (p,s)

  Чтобы вычислить фдрес переменной, используется функция loc

Program prog

Integer pa

Pointer(p,pa)

Integer :: b=1000

  P=loc(b)

  Pa=500

  Write (*,*) b

  B=700

  Write (*,*) “addres =”,p,”value =”, pa !вывели адрес и значение

End

Результаты:

500

Address = 4403268       value = 700

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

 


10.06.2015; 08:27
хиты: 2573
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь