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

4. Массивы

write(*, *) d

! Вместо ожидаемого -2 имеем 15

end

 

subroutine testb(b)

 

integer b(*)

! Массив, перенимающий размер

b(6) = 15

! По адресу b(6) находится переменная d

end

 

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

4.10. Использование массивов

Фортран позволяет работать с массивами и сечениями массивов так же, как и с единичными объектами данных:

массивам и их сечениям можно присваивать значения;

массивы (сечения массивов) можно применять в качестве операндов в выражениях с арифметическими, логическими операциями и операциями отношения. Результат выражения, которое содержит массивы и/или сечения массивов, присваивается массиву (сечению). В результате присваивания получается массив (сечение), каждый элемент которого имеет значение, равное результату операций над соответствующими элементами операндов:

массив | сечение = выражение

массивы и сечения могут быть параметрами встроенных элементных функций (разд. 6.1), например SIN и SQRT. Элементные функции, получив массив (сечение) в качестве аргумента, выполняются последовательно для всех элементов массива (сечения).

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

Массивы (сечения) согласованы, если они имеют одинаковую форму. Так, согласованы массивы a(-1:6) и b(-1:6), массивы c(2:9) и b(-1:6). Всегда согласованы массив и скаляр.

Пример:

integer(2) a(5) /1, 2, 3, 4, 5/, a2(4, 7) /28*5/ integer(2) :: b(5) = (/ 1, 2, -2, 4, 3 /) integer(2) :: ic(5) = 1

character(1) d1(4) / 'a', 'c', 'e', 'g' / character(1) d2(4) / 'b', 'd', 'f', 'h' / character(4) d12(4)

real(4) c(2) /2.2, 2.2/, d(2) /2.2, 3.3/, cd*8(2)

137

! Вызов массивоподобной функции fap
! 3.0 5.0 7.0
! Результатом функции является массив ! a - перенимающий форму массив
! Формирование массива-результата
138

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

logical(1) g(3) / .true., .false., .true. /

 

 

 

 

 

logical(1) h(3) / 3*.false. /

 

 

 

 

 

 

ic = ic + 2 * (a - b) - 2

! Присваивание массива

 

 

write(*, *) ic

!

-1

-1

9

-1

3

a2(3, 1:5) = a2(3, 1:5) - a

! Согласованные массив и сечение

 

write(*, *) int(sqrt(real(a*b**2)))

!

1

2

3

8

6

write(*, *) exp(real(a/b))

!

2.718

2.718

3.68e-01

...

 

write(*, *) a**b

!

1

4

0

256

125

d12 = d1 // '5' // d2 // '5'

 

 

 

 

 

 

write(*, *) d12

! a5b5c5d5e5f5g5h5

 

 

 

write(*, *) mod(a, b)

!

0

0

1

0

2

write(*, *) sign(a, b)

!

1

2

-3

4

5

write(*, *) dim(a, b)

!

0

0

5

0

2

cd = dprod(c, d)

!

4.840

...

7.26

 

 

write(*, *) g .and. .not. h

!

T

F

T

 

 

end

 

 

 

 

 

 

4.11. Массив как результат функции

Массив также может быть и результатом функции. Интерфейс к такой функции должен быть задан явно. Если функция не является ссылкой, то границы массива должны быть описательными выражениями, которые вычисляются при входе в функцию.

Пример. Составить функцию, возвращающую массив из первых n положительных элементов передаваемого в нее массива.

real, allocatable :: ap(:)

real :: a(10) = (/ 1, -1, 2, -2, 3, -3, 4, -4, 5, -5 /) real :: b(10) = (/ 2, -1, 3, -2, 4, -3, 4, -4, 5, -5 /) integer n /3/

allocate(ap(n))

ap = fap(a, n) + fap(b, n) print '(1x, 10f5.1)', ap contains

function fap(a, n) integer :: n, k, i real :: fap(n)

real, dimension(:) :: a fap = 0

k = 0

do i = 1, size(a) if(a(i) > 0) then k = k + 1 fap(k) = a(i) if(k == n) exit end if

end do