1 / 30

Лекция 9 ПРОИЗВОДНЫЕ ТИПЫ

Лекция 9 ПРОИЗВОДНЫЕ ТИПЫ. Производные типы, зачем ?. При сортировке используются перестановки элементов. Перестановка требует 3 операции присваивания . tmp = x(12) x(12) = x(15) x(15) = tmp Для перестановки двух частиц потребуется записать 21 (!) операции присваивания.

tobias
Download Presentation

Лекция 9 ПРОИЗВОДНЫЕ ТИПЫ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Лекция 9 ПРОИЗВОДНЫЕ ТИПЫ

  2. Производные типы, зачем ? При сортировке используются перестановки элементов. Перестановка требует 3 операции присваивания. tmp=x(12) x(12)=x(15) x(15)=tmp Для перестановки двух частиц потребуется записать 21(!) операции присваивания. ! данные N частиц real x(N) real y(N) real z(N) logical status(N) real temperature(N) real pressure(N) integer color(N)

  3. Производные типы, зачем ? Лучше объединить типы под одним "общим типом“. type particle real x ! координаты real y real z logical status real temperature! физические real pressure! параметры integer color! цвет end type particle type(particle) M(N), tmp ... tmp=M(12) ! 3 присваивания M(12)=M(15) M(15)=tmp поля

  4. Оператор type Объявляет новый тип данных, группируя под одним именем существующие типы. • typeимя • типы данных • contains • процедуры привязанные к типу • endtypeимя

  5. Доступ к полям Операция " . " или " % ". programprog typeNewType integer A real B character C logical D endtypeNewType type (NewType) PS PS.A = 35; PS.B = 3.14; PS.C = 'E'; PS.D = .FALSE. PS%A = 25; PS%B = 5.67; PS%C = 'Q'; PS%D = .TRUE. end Задание начальных значений для каждого поля лучше с использованием конструктора.

  6. Конструктор производного типа Конструктор – функция с именем производного типа. Параметры функции - поля производного типа. programprog typeNewType integer A real B character C logical D endtypeNewType type (NewType) :: PS0 = NewType(1, 0.32, 'Z', .FALSE.) type (NewType) PS1 type (NewType), allocatable :: PS2 PS1 = NewType(5, 3.5, 'Q', .TRUE.) allocate(PS2); PS2 = NewType(8, 1.2, 'F', .TRUE.) ! ИЛИallocate(PS2, source = NewType(8, 1.2, 'F', .TRUE.)) write(*,*) PS2 ! вывод значений всех полей end конструктор

  7. Иерархия типов type person character(128) fio integer age end type person type firm type (person) people(1000) character(128) name integer money end type firm type (firm) FM FM.money = 100000 ! доступ к полям FM.name = 'Siberia' FM.people(1).fio = 'Ivanov S.K.' FM.people(1).age = 35

  8. Расширение типа, extends Тип CHILDнаследует поля типа PARENT typePARENT! родитель integerA realB endtypePARENT type, extends(PARENT) :: CHILD! потомок characterC endtypeCHILD type (CHILD) pas1, pas2 pas1 = CHILD(PARENT(1,2.0),'A') pas2 = CHILD(1,2.0,'A')

  9. Оператор class Classобъявляет полиморфную переменную. Если полиморфная переменная не является формальным параметром процедуры, то используются атрибуты allocatableили pointer. class(имя производного типа), allocatable:: имя type PARENT integer A real B endtype PARENT type, extends (PARENT) :: CHILD ! наследуем тип PARENT character C endtype CHILD type (CHILD), allocatable :: CL1 class (CHILD), allocatable :: CL2 allocate(CL1, source = CHILD(1,3.0,'Q')) allocate(CL2, source = CHILD(1,3.0,'Q')) ПеременнаяCL2имеет больше возможностей.

  10. Оператор class Полиморфная переменная объявленная родительским типом может "принимать" все дочерние типы. programprog type PARENT integer A real B endtype PARENT type, extends (PARENT) :: CHILD_A character C endtype CHILD_A type, extends (PARENT) :: CHILD_B logical D endtype CHILD_B type, extends (CHILD_A) :: CHILD_CHILD_A complex E endtype CHILD_CHILD_A

  11. Оператор class CHILD_A CHILD_CHILD_A PARENT CHILD_B class (PARENT), pointer :: PAR type (PARENT), target :: P type (CHILD_A), target :: CA type (CHILD_B), target :: CB type (CHILD_CHILD_A), target :: CCA PAR => P ! стал родителем PAR => CA ! теперь потомок А PAR => CB ! изменился на потомка B PAR => CCA ! теперь потомок потомка А end

  12. Конструкция select type Как определить какой тип имеет полиморфная переменная ? Select typeпозволяет выполнить блок операторов в зависимости от динамического типа полиморфной переменной. • select type(переменная) • type is (имя типа) • class is(имя типа) • class default • endselect

  13. Оператор select type Схема выполнения Находится и выполняется блок type is Если не найден type is, то находится и выполняется class is. Если найдено соответствие нескольким блокам class is, то выбирается ближайший родитель. Если не найден ни один блок выбирается class default.

  14. Оператор select type CHILD_A CHILD_CHILD_A PARENT CHILD_B ... type (PARENT), target :: P type (CHILD_CHILD_A), target :: CCA PAR => CCA ! потомокпотомкаА select type (PAR) class is (PARENT) write (*,*) "PARENT" class is (CHILD_A) write(*,*) "CHILD"! выбираетсяближайшийродитель class default write(*,*) "default...." endselect end

  15. Оператор class(*) Неограниченно полиморфная переменная принимает любые типы type T1 integer index realval endtype T1 type T2 logical status character symbol character(10) name endtype T2 complex(16), target :: CMP type (T1), target :: PT1 type (T2), target :: PT2 class (*), pointer :: PAR ! неограниченно полиморфная PAR => PT1 ! сейчас типа T1 PAR => PT2 ! теперь типа T2 PAR => CMP ! затем комплексный тип

  16. Процедурные указатели procedure(proc), pointer :: p1 => null() Procedureописывает процедурный указатель, позволяет добавлять процедурыв созданный тип. • typeNewType • integer a • real b • contains • procedureproc1 • procedure :: proc2 => other_pr • endtypeNewType • ... • call A.proc1(a,b)

  17. Атрибуты pass и nopass Используются для процедур привязанных к производному типу по имени. passпозволяет получить доступ к переменной, посредством которой вызывалась процедура (по умолчанию). Вызывающая переменнаязаписывается в процедуре, первым параметром и должна быть объявлена оператором class. При вызове процедуры данный параметр опускается. nopassотменяет доступ к вызывающей переменной.

  18. Процедуры привязанные к типу module algebra type, public :: vector real x1, y1, x2, y2 contains procedure, public, pass :: length procedure, nopass :: info endtype vector CONTAINS subroutine info() write(*,*) "I'am VECTOR" end subroutine info integerfunction length(vc) ! атрибут pass class(vector) vc length = sqrt((vc.x1-vc.x2)**2 + (vc.y1-vc.y2)**2) end function length end modulealgebra

  19. Процедуры привязанные к типу programprog use algebra class (vector), allocatable :: VEC allocate(VEC, source = vector(0.0,0.0,3.0,4.0)) call VEC.info() write(*,*) VEC.length() ! формальный параметр отсутствует ! однако при описании объявлен deallocate(VEC) end

  20. Завершающие процедуры Оператор finalобъявляет процедуры (деструкторы), которые выполняются при удалении ранее размещенных в памяти элементов • typeNewType • ... • contains • final :: finish • endtypeNewType

  21. Атрибут private Используется для задания отдельных полей производных типов в модулях. Доступ к приватной части происходит при помощи public-процедур. moduleMyModule ... typeNewType integerA real, private :: B integer C real, private :: D endtypeNewType ... endmoduleMyModule

  22. Атрибут private(Пример) moduleMyModule typeNewType integer A real, private :: B contains procedure :: SetParamB endtypeNewType contains subroutineSetParamB(T,newvalue) class(NewType) T realnewvalue if (newvalue < 0) then write(*,*) "Error in parameter B, must be >=0" T.B = 0 else T.B = newvalue end if end subroutine end module

  23. Атрибут private(Пример) programprog useMyModule class(NewType), allocatable :: nw allocate(nw) nw.A = 1000 !nw.B = 4.5 ! ошибка доступа callnw.SetParamB(4.5) callnw.SetParamB(-9.4) ! некорректные данные end

  24. Перегрузка операций Набросок модуля арифметики длинных чисел. module long typeLongNumbe integer(1)val(length) ! цифры integer total ! количество endtypeLongNumber contains subroutineasgn(n,val) ! присваивание ! операторы end subroutineasgn functionplus(n1,n2) ! операция сложение и другие ! операторы end function plus subroutinePrintLong(n) ! вывод числа ! операторы end subroutinePrintLong end modulelong

  25. Перегрузка операций Набросок вызывающей программы programprog use long type (LongNumber) a, b, c, d callasgn(a,"2823892839283923837483485555555") callasgn(b,"92882746") callasgn(c,"2038493849300000") !---- хотим найти выражение ! d = a*(b+c)+c*(a+b)+b d = plus(plus(umn(a,plus(b,c)),umn(c,plus(a,b))),b) ! очень громоздкая запись ! осложнение если будет много операций callPrintLong(d) end

  26. Перегрузка операций Перегрузка операции присваивания interfaceassignment (=) moduleprocedureasgn! имя процедуры endinterface Перегрузка операции сложения, умножения и др. interfaceoperator (+) moduleprocedure plus! имя процедуры endinterface Замена имени процедуры на знак операции.

  27. Перегрузка операций Унарная операция - функция с одним входным параметром имеющего вид связи IN. Двуместная операция - функция с двумя параметрами имеющими вид связи IN. Нельзя изменять тип встроенной операции. (например '*' оформить как унарную). Процедура, задающая '=' должна быть подпрограммой с двумя параметрами. 1-й вид связи OUTили INOUT(левая часть), 2-й параметр IN(правая часть).

  28. Задаваемые операции • Вводятся аналогично • унарным и двуместным операциям. • Имя операции задаётся по общим правилам. • В выражениях операция ограничивается точками. • interfaceoperator(.PLUS.) • moduleprocedureplus • endinterface • ... • SUMMA = A.PLUS.B

  29. Приоритет операций • унарная перегруженная или • задаваемая операция • арифметические операции • символьная операция конкатенация • операции отношения • логические операции • задаваемая или перегруженная • бинарная операция

  30. * З а д а н и е * • Создать модуль для работы с длинными числами. Реализовать операции присваивания, сложения и вывода длинных целых чисел.

More Related