Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

риложение3. Организация данных

операндами которой являются записи. Наличие такой возможности улучшает структуру и сокращает код программы.

Используя оператор INTERFACE ASSIGNMENT, можно задать присваивание, в котором компонентам переменной производного типа по определенным правилам присваивается результат выражения другого типа.

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

Для доступа к занимаемой переменными памяти, а также к свободной памяти ЭВМ в CVF и FPS используются целочисленные указатели.

Целочисленный указатель - это переменная, содержащая адрес некоторой ячейки памяти и связанная с некоторой переменной, называемой адресной переменной. Целочисленный указатель имеет 3 компонента: собственно указатель, связанную с ним адресную переменную и объектадресат, адрес которого содержит указатель. Объектом-адресатом может также быть и ячейка выделенной функцией MALLOC памяти. Задание указателя выполняется в два этапа. Первоначально указатель связывается с адресной переменной. Это выполняется посредством оператора POINTER, имеющего синтаксис

POINTER(pointer, varname) [(pointer, varname)]...

Пример:

real var

! p - указатель; var - адресная переменная

pointer(p, var)

Целочисленный указатель всегда имеет тип INTEGER(4) и не должен объявляться явно. Связываемая с ним адресная переменная (скалярная или массив) может быть любого типа.

Оператор POINTER должен располагаться в разделе объявлений программной единицы.

На втором этапе в указатель устанавливается адрес некоторого объекта или ячейки памяти. В первом случае это выполняется функцией LOC, во втором - MALLOC. Например:

real var(5), a(5) pointer(p, var) p = loc(a)

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

устанавливаемые в адресную переменную значения размещаются по хранящемуся в указателе адресу и, таким образом, передаются объекту-адресату;

данные, хранящиеся по содержащемуся в указателе адресу, передаются в связанную с ним адресную переменную.

Пример первого свойства адресной переменной:

93

О. В. Бартеньев. Современный ФОРТРАН

real(4) a(5) /5*0.0/, var(5), wa

pointer(p, var) (p2, wa)

! Объявим два указателя p и pa и свяжем первый

integer k

! с адресной переменной var, а второй - с wa

p = loc(a)

! Установим указатель p на начало массива a

var(2) = 0.5

! Устанавливает также и в a(2) значение 0.5

print '(10f5.1)', a

! .0 .5 .0 .0 .0

var = -1.3

! Все элементы массива a равны -1.3

print '(10f5.1)', a

!-1.3 -1.3 -1.3 -1.3 -1.3

p2 = loc(a)

! Установим указатель p2 на начало массива a

do k = 1, 5

! В a(k) устанавливается значение FLOAT(k)

wa = float(k)

p2 = p2 + 4

! Тип a - REAL(4), поэтому для перехода к следующему

end do

! элементу массива a выполним p2 = p2 + 4

print '(10f5.1)', a

! 1.0 2.0 3.0 4.0 5.0

end

 

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

character(20) :: st = '1#2#3#4#5#6#7#8#9#', ch*1

pointer(p, ch)

 

 

integer p0

! Установим в p0 адрес начала строки st

p0 = loc(st)

do p = p0, p0 + len_trim(st), 2

 

ch = 'b'

! Каждый символ строки занимает 1 байт, поэтому

end do

! используем шаг 2 для перемещения по нечетным символам

print *, st

! b#b#b#b#b#b#b#b#b#

end

 

 

Пример второго свойства адресной переменной:

real(4) a(5) /1.0, 2.0, 3.0, 4.0, 5.0/, wa

 

pointer(p, wa)

! В адресную переменную wa передается содержимое

integer p0

p0 = loc(a)

! области памяти, которую адресует указатель p

print '(10f5.1)', (wa, p = p0, p0 + 19, 4)

! 1.0 2.0 3.0 4.0 5.0

end

! Указатель p использован в качестве параметра цикла

Указатель может быть использован в качестве фактического параметра процедуры, в которой может быть изменено его значение. В общем случае целочисленный указатель может появляться везде, где могут использоваться целочисленные переменные. Следует только помнить, что указатель содержит адрес объекта, и следить за тем, чтобы после всех изменений значения указателя он адресовал нужный объект или элемент этого объекта. Попытка адресации защищенной области памяти приводит к ошибке выполнения.

Ограничения:

94