Читайте также:
|
|
Так же как спецификация массивов встроенных типов данных, возможно включать спецификацию массивов как часть производных типов данных. Это облегчает группирование некоторых или многих экземпляров данных. Рассмотрим определение производного типа данных circle:
TYPE(circle) INTEGER:: radius REAL:: area END TYPE circleГде-нибудь в другом месте второй встроенный тип, называемый position, использован для запоминания координат центра окружности типа real; position имела два числа типа real в качестве компонент. Возможно заменить использование производного типа position массивом типа real:
TYPE(circle) REAL, DIMENSION(2):: pos INTEGER:: radius REAL:: area END TYPE circleЗдесь pos(1) есть x координата, соответственно pos(2) есть y координата. Массив можно использовать, когда число компонент довольно велико. На компоненты массива ссылаются точно так же, как на другие компоненты:
TYPE(circle):: first... first%pos(1)! элемент 1 из pos first%pos(1:)! весь массив (сечение)Так же как несколько (или много) экземпляров (шаблонов, образцов) встроенных типов данных могут быть сгруппированы вместе как единый массив, так же возможно сгруппировать вместе экземпляры (шаблоны, образцы) производных типов данных. Например:
TYPE(circle), DIMENSION(100):: all_circles... all_circles(1)%radius! радиус окружности 1 all_circles(51:100)%radius! радиус последней половины окружностей all_circles(1:100:2)%area! область каждой другой окружности all_circles(:)%pos(1)! x - координаты каждой окружности all_circles%pos! все координаты всех окружностей all_circles(10)%pos(:)! обе координаты 10-й окружности
Массив производного типа данных и/или компоненты массива имеют те же требования (то есть те же правила в выражениях и др.) и ограничения как другие массивы в Fortran 90. Например:
TYPE(circle), DIMENSION(100):: cir... cir(1:10) = cir(91:100)! соответствие сегментов производных типов cir(i)%pos = cir(i-1)%pos(:)! соответствие массивов типа real cir%pos(1:2) = cir(1:2)%pos! ошибка, cir=cir(1:2) не соответствуютНужно позаботиться, чтобы обеспечить, чтобы любая пометка секции массива была применена к правильной части выражения.
Инициализация массивов
Конструкторы
Конструкторы используются для инициализации одномерных массивов, которые требуют фиксированных значений к началу программы. Конструктор это список, заключенный между двумя символами слэш // и круглыми скобками. Общая форма такова:
array = (/ список /)где список может быть одним из следующих:
список значений назначенного типа
INTEGER:: a(6)=(/1,2,3,6,7,8/)
Выражения для переменной (s)
REAL:: b(2)=(/SIN(x),COS(x)/)
Выражение от массива (s)
INTEGER:: c(5)=(/0,a(1:3),4/)
Неявный цикл DO
REAL:: d(100)=(/REAL(i),i=1,100/)
Конструктор может быть использован во время объявления как показано выше или в отдельном операторе. Массивы ранга 2 или более не могут быть инициализированы с помощью простого конструктора, а комбинацией конструктора (ов) и функции RESHAPE().
Reshape
Функция RESHAPE() используется для инициализации и присваивания многомерных массивов (ранг выше 1). Ее можно использовать в операторе объявления или в отдельном операторе. Формат такой:
RESHAPE (список, shape [,PAD] [,ORDER])where список это одномерный массив или конструктор, содержащий данные и формирование одномерного массива или вектора или подпись вектора, содержащего новую форму данных. PAD - массив, содержащий данные для использования их в качестве простлойки в списке для требуемого формирования.. ORDER может быть использован для изменения порядка, в котором данные переформируются.
Размер массива определяет размеры нового массива. Элементы определяют протяженность каждой размерности. В следующем примере:
INTEGER, DIMENSION(3,2):: a
a=RESHAPE((/0,1,2,3,4,5/),(/3,2/))! положить значения в a
RESHAPE() генерирует массив ранга 2 с протяженностью 3 и 2 из списка значений в конструкторе. Поскольку этот массив подобен (соответствует) массиву a, использовано присваивание всего массива, дающее значение каждому элементу.. Аргумент ORDER не использован, значения из конструктора возвращены в порядке следования элементов в массиве, то есть a(1,1)=0, a(2,1)=1, a(3,1)=2, a(1,2)=3, и т д...
Дата добавления: 2015-11-14; просмотров: 71 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Логические выражения | | | Оператор и конструкция IF |