Реферат: Правила вычисления адресного выражения
Массивы
Массив – это набор элементов данных одного и того же типа, занимающих последовательные единицы памяти в некотором отрезке памяти. Каждый массив обладает следующими атрибутами:
1. Имя массива.
2. Тип массива.
3. Набор значений (элементов).
4. Число измерений.
5. Размер (протяженность) массива по каждому измерению.
6. Нижняя и верхняя границы массива по каждому измерению.
Массив объявляется в операторах описания типа, в операторах DIMENSION и COMMON. Общая форма описания массива имеет вид
имя_массива (L1:U1, L2:U2, …, L7:U7)
где Li и Ui – нижняя и верхняя границы i-го измерения. В Фортране 77 максимальное число измерений равно 7. Размер i-го измерения – Di = Ui– Li + 1. Размер n-мерного массива – общее число элементов в массиве – D1*D2*…*Dn.
Положение элемента массива в памяти определяется значением адресного выражения для этого элемента. Значение адресного выражения изменяется от 1 (первый элемент) до величины размера массива (последний элемент). Значение адресного выражения вычисляется по индексам элемента и параметрам размерностей массива. В качестве индексного выражения допускается любое правильно построенное целое выражение, не содержащее обращений к таким функциям, выполнение которых может повлиять на значения других индексных выражений в том же индексе. Число индексных выражений должно совпадать с числом измерений массива, указанным в его описателе. Каждое индексное выражение является индексом по соответствующему измерению, и его значение должно лежать в пределах границ массива по этому измерению.
^ Правила вычисления адресного выражения
n
Параметры размерностей массива
Размеры элементов
Индексы
Адресное выражение
1
(L1:U1)
D1 = U1– L1+ 1
(K1)
1+ ( K1– L1)
2
(L1:U1, L2:U2)
D1 = U1– L1+ 1
D2 = U2– L2+ 1
(K1, K2)
1+ ( K1– L1) +
+ ( K2– L2)*D1
3
(L1:U1, L2:U2, L3:U3)
D1 = U1– L1+ 1
D2 = U2– L2+ 1
D3 = U3– L3+ 1
(K1, K2, K3)
1+ ( K1– L1) +
+ ( K2– L2)*D1 +
+ ( K3– L3)*D1*D2 +
7
(L1:U1,…, L7:U7)
D1 = U1– L1+ 1
D2 = U2– L2+ 1
D3 = U3– L3+ 1
…
D7 = U7– L7+ 1
(K1,… , K7)
1+ ( K1– L1) +
+ ( K2– L2)*D1 +
+ ( K3– L3)*D1*D2 +
…
+ ( K7– L7)*D1*D2*D3*D4*D5*D6
Если нижняя граница какого-либо измерения опущена при описании, то по умолчанию она берется равной 1.
Доступ к элементу массива требует больше времени, чем доступ к простой переменной (так как требуется вычислять адресное выражение). Именно поэтому массивы целесообразно использовать только там, где это необходимо, при этом следует по возможности сводить к минимуму число измерений массива. Если один и тот же элемент массива используется в программе неоднократно, то обычно его значение запоминают в какой-нибудь простой переменной и каждый раз берут требуемое значение элемента массива из нее.
Память для массива отводится в той программной компоненте, в которой он декларируется, если только он не описан как формальный параметр этой подпрограммы; в последнем случае массив передается подпрограмме извне в качестве аргумента. Декларацию массива в программной компоненте, в которой для него фактически будет отведена память, будем называть декларацией фактического массива. Декларацию массива в подпрограмме, в которую он будет передан как параметр, будем называть декларацией формального массива. В декларации фактического массива число его измерений и размер по каждому измерению не могут быть переменными. В декларации формального массива размер массива по каждому измерению может быть как регулируемым, так и постоянным. При вычислении значения адресного выражения верхняя граница последнего измерения не используется. Именно поэтому ее можно (настоятельно рекомендуется) заменить звездочкой (*) в операторе описания формального массива.
Массивы Фортрана 77 располагаются в памяти, как говорят, «по столбцам». Это означает, что быстрее всего изменяется самый левый индекс.
Если в списке оператора READ (оператора PRINT) указано только имя массива, то значения элементов массива вводятся (выводятся) в том порядке, в каком элементы массива располагаются в памяти. Изменить порядок ввода-вывода элементов массива можно с помощью неявного цикла.
Указывая при обращении к подпрограмме (или подпрограмме-функции) имя фактического массива, мы тем самым передаем в подпрограмму адрес ячейки памяти, с которой начинается массив. При каждом обращении к элементу формального массива значение его адресного выражения вычисляется исходя из информации о размере массива. Адрес элемента фактического массива вычисляется по этому значению и начальному адресу фактического массива. Таким образом устанавливается соответствие между элементами формального и фактического массивов с одинаковыми значениями адресного выражения.
В Фортране 77 есть и другой способ передачи массивов в подпрограммы. Например, вместо имени массива в качестве фактического параметра можно использовать элемент массива. В этом случае начальным адресом массива будет адрес указанного элемента массива, и связь между формальным и фактическим массивами установится на основе этого адреса. Размер формального массива при этом не должен превышать числа оставшихся элементов фактического массива.
Например, в следующем наброске программы
Dimension A(100) Subroutine SUB(X,…)
……………………… Dimension X(*)
Call SUB(A(10),…) ………………………
……………………… end
end
фактическим аргументом при вызове подпрограммы SUB является не имя массива A, а имя элемента A(10). В подпрограмме используется формальный массив X, и связь между массивами X и A устанавливается следующим образом: X(1) соответствует A(10), X(2) соответствует A(11) и т.д. Очевидно, что X(91) соответствует A(100), и поскольку верхняя граница индекса массива X определена как (*), то X(91) – последний элемент формального массива.
Фортран 77 также допускает разные размерности у формальных и фактических массивов. Например, программа вида
Dimension A(5,10) Subroutine SUB(X,N,…)
……………………… Dimension X(*)
Call SUB(A,50,…) ………………………
……………………… end
end
устанавливает соответствие между X(1) и A(1,1), X(2) и A(2,1), … , X(K) и A(I,J), где
K=I+5*(J–1). В приведенной программе фактических массив A и формальный массив X имеют одинаковое число элементов; однако такое равенство не является обязательным требованием Фортрана 77. На самом деле массив X может иметь любой размер, не превышающий размер фактического массива или размер используемой подпрограммой части массива.
Пример
В качестве примера рассмотрим программу, которая вычисляет сумму всех элементов матрицы C, где C=A*B, A – (N,M)-матрица, B – (M,K)-матрица. Элементы матриц A и B располагаются построчно в текстовых файлах a.dat и b.dat соответственно. Известно, что
N*M + M*K<1000.
^ DIMENSION MEM(1000)
Open (1, file='a.dat')
read (1,*) n,m1
Open (2, file='b.dat')
read (1,*) m2,K
If(m1.ne.m2)
* stop ‘Матрицы перемножать нельзя’
m=m1
If((N+K)*m.GT.1000)
* stop ‘Не хватает памяти’
CALL READAB (MEM(1), MEM(n*m+1), n, m, k)
CALL UMN (MEM(1), MEM(n*m+1), n, m, k, rez)
Print *,'Результат:', rez
Stop
End
Subroutine ReadAB (A, B, n, m, k)
Dimension A(m,*), B(m,*)
Read (1,*) ((a(i,j), i=1,m), j=1,n)
Close (1)
Read (2,*) ((b(I,J), j=1,k), i=1,m)
Close (2)
Return
End
Subroutine umn (A, B, n, m, k, r)
DOUBLE PRECISIOn r8, rab8
Dimension A(m,*), B(m,*)
r8=0.d0
do 10 I=1,n
do 10 j=1,k
call scal (A(1,i), b(1,j), m, rab8)
10 r8=rab8+r8
r=r8
end
subroutine scal (x, y, n, rez8)
DOUBLE PRECISIOn rab8, rez8
dimension x(*), y(*)
rab8=0.d0
do 1 i=1,n
rab8=rab8+x(i)*y(i)
1 continue
rez8=rab8
end
Источники
1. Катцан Г. Язык Форотран 77: Пер. с англ. – М.: Мир,1982.
2. Программирование на Фортране 77: Пер. с англ./ Дж. Ашкрофт, Р. Элдридж, Р. Полсон, Г.Уилсон. – М.: Радио и связь, 1990.
еще рефераты
Еще работы по разное
Реферат по разное
Обработка больших научных массивов данных
17 Сентября 2013
Реферат по разное
Расширенный план лекционного курса по дисциплине «Методы контроля состояния окружающей среды» для бакалавров 4 года обучения. Введение
17 Сентября 2013
Реферат по разное
Подготовка научных кадров по физико-химической биологии и биотехнологии
17 Сентября 2013
Реферат по разное
Измерение температуры плавления графита и свойства жидкого углерода
17 Сентября 2013