
- •22. Операторы ввода-вывода в Фортране, аналогия последовательного обмена с кассетным магнитофоном
- •23. Ответы на вопросы "Что", "Куда-откуда" в операторах обмена данными
- •25. Форматный вывод таблиц
- •Правило таблицы
- •26. Атрибуты и новая форма описания объектов в современном Фортране. Массивы в раннем фортран -77 и современном Фортране. Конформные массивы.
- •27. Секция и конструктор массива
- •Примеры манипуляций с секциями
- •28. Характеристики массива
- •29.Размещение массива в памяти компьютера
28. Характеристики массива
Одномерный, двумерный, трехмерный, любой многомерный массив описываются единообразно
одномерный массив real X(60) - это вектор из 60 однотипных элементов
двумерный массив real T(3,5) - это матрица однотипных элементов из 3 строк и 5 столбцов
трехмерный массив real Edr(4,3,2) - это система из 2 матриц, каждая по 4 строки и 3 столбца
В качестве индексов для выбора элементов массива вместо безликих математических обозначений i,j,k лучше использовать "говорящие" имена вроде str, stl, tbl
Характеристики и атрибуты массива.
Имя массива, как объекта.
Тип массива – одного из базовых типов integer, real, complex, logical, character или определяемого типа type(имя_типа).
Количество измерений или ранг массива – допускается от 1 до 7, причем по каждому измерению указывается пара целых чисел [нижняя:]верхняя границы индекса:
либо диапазон индекса как нижняя:верхняя границы индекса протяженность = верхняя – нижняя + 1 ; протяженность – это неотрицательное число, указывающее на количество возможных значений индекса по выбранному измерению;
либо только верхняя граница, с нижней границей по умолчанию равной 1; в этом случае верхняя граница - это протяженность, например, число строк или число столбцов матрицы.
Форма массива, по-английски Shape – целочисленный вектор, составленный из протяженностей в порядке следования измерений. Форма характеризует порядок размещения элементов в памяти компьютера. Массивы, одинаковые по форме, называют, конформными. Форма измеряется функцией shape(Array).
Число элементов – это произведение протяженностей по всем измерениям массива, измеряется функцией size(Array) size(Array)=product(shape(Array)).
Объем памяти, занимаемый массивом <объем_памяти > = < память на один элемент >* size(array) – ограничивается лишь объемом памяти компьютера.
Когда и как массив размещается в памяти компьютера – статический или динамический (allocatable); в процедуре, дополнительно – динамический автоматический, передаваемый по адресу.
Назначение (intent) массива как аргумента процедуры: intent(in) – входной аргумент, intent(out) – выходной аргумент, intent(inout) – входной-выходной аргумент.
Прочие атрибуты: public | private, pointer | target, parameter, save.
29.Размещение массива в памяти компьютера
Говоря о размещении массива в памяти, следует прояснить:
какой объем памяти требуется;
в каком порядке элементы массива хранятся в памяти;
когда массив размещают в памяти.
Какой объем памяти требуется?
Объем памяти, занимаемый массивом, определяется просто из-за того, что все элементы однотипны и занимают одинаковый объем памяти. <объем_памяти> = <память на один элемент>*size(array) Размер массива ограничивает лишь объем памяти компьютера.
В каком порядке элементы массива хранятся в памяти?
В большинстве случаев программист об этом может не задумываться. Однако, в ряде случаев при передаче массива целиком подразумевается именно этот порядок:
при подготовке данных для ввода;
при написании форматов вывода;
при задании начальных значений для элементов массива.
Порядок хранения стандартизован в Фортране: для одномерного массива – по возрастанию индекса, для матрицы – по столбцам, для многомерного массива – самый быстрый первый индекс, медленнее второй, наконец, последний – самый медленный, каждый из индексов пробегает все значения по возрастанию.
Пример. В каком порядке надо готовить данные?
Всего в трехмерном массиве P(1:2,1:2,1:2) 8 элементов. Его элементы располагаются в памяти, как указано выше, и порядок чтения разъясняется вторым оператором read. Именно в этом порядке и надо готовить данные. Так как read бесформатный, можно, не нарушая порядка следования, либо все числа перечислить в одной строке через пробел или запятую, либо – каждое число – в отдельной строке.
dimension P(1:2,1:2,1:2)
read(1,*) P ! читать весь массив – понимают как
read(1,*) P(1,1,1),P(2,1,1),P(1,2,1),P(2,2,1),P(1,1,2),P(2,1,2),P(1,2,2),P(2,2,2)
Предупреждение. Размещение массива в памяти стандартно и никак не зависит от порядка ввода.
Когда массив размещают в памяти?
Форма статического массива, (предыдущий пример), известна при компиляции – shape(P)=(/2,2,2/); массив размещается в памяти при запуске программы. Форма динамического массива не определена при компиляции, например,
Real,allocatable,Dimension(:,:) :: Matrix, Matr1, Matr2, X(:)
Известно лишь количество измерений массивов: два для Matrix и один для X. Запустив программу, сначала определяют протяженности, а затем динамически размещают массивы в памяти оператором
allocate( X(1:N), Matrix(1:M,1:N),&
Matr1(1:N ,1:M), Matr2(1:N,1:N) )
Освобождают память оператором
deallocate( X, Matrix, Matr1, Matr2 )
Массив как аргумент процедуры должен быть размещен в памяти до входа в процедуру; в нее передается его адрес, независимо от способа написания размерности:
Real,intent,Dimension(1:N)::Mas - в виде переменной N;
Real,intent(in),Dimension(1:10)::Mas - в виде константы 10;
Real,intent(in),Dimension(:)::Mas – без указания размерности;
Real,intent(in),Dimension(*)::Mas-массив, перенимает форму;
Dimension(1:N,1:M) – в виде массива с перераспределением памяти между строками и столбцами, например, 3*4=4*3=2*6=6*2=12.
В любом случае количество элементов можно узнать с помощью функции size(array), а для матрицы число строк – size(Matrix,dim=1), число столбцов – size(Matrix, dim=2).
Пример (массивы X, Y, P, Q конформны):
real,dimension(1:11):: X,Y ! массивы X,Y по 11 элементов
real,dimension(-5:5)::P,Q ! P,Q – по 11 элементов с номерами 5,..0,..5
Y=sin(X+0.5)/4 + 2.1; p= Y/2; Q=P-1