LN2018
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору bearjrgm, спасибо. akaGM, я большие программы не пишу (хотя часто пишу по работе, расчетные вещи), geany мне в принципе достаточно, по крайней мере основные нужные мне вещи в нем есть - подсветка, компиляция, поиск и т.п. ****** Еще один вопрос, интресный на мой взгляд. Книга "Современный Fortran на практике", автор Арьен Маркус, издание 2015 года на русском языке. К книге приложены коды в виде файлов. Привожу один из них. Код, пример использования абстрактных типов, компилируется gfortran 4.9.2. Есть ли желание поразбираться что к чему? Интересно понять фортрановское ООП. Кто дружит с ООП, можно разобрать подробно? Код: ! abstract_point.f90 - ! Пример использования абстрактных типов ! Пример, принадлежащий «Современному фортрану на практике» Арьена Маркуса ! Эта работа лицензируется в соответствии с лицензией Creative Commons Attribution 3.0 Unported. ! Чтобы просмотреть копию этой лицензии, посетите страницу http://creativecommons.org/licenses/by/3.0/ ! или отправить письмо на адрес: ! Фото фонда., 444 Castro Street, Сюита 900, Вид горы, Калифорния, 94041, США. module abstract_points implicit none type, abstract :: abstract_point ! Нет координат, оставьте это для расширяющихся типов contains procedure(add_vector), deferred :: add end type abstract_point !Определите, как должен выглядеть именованный интерфейс «add_vector» abstract interface subroutine add_vector( point, vector ) import abstract_point class(abstract_point), intent(inout) :: point class(abstract_point), intent(in) :: vector end subroutine add_vector end interface end module abstract_points ! points2d -- ! Используйте модуль абстрактных точек для конкретного типа module points2d use abstract_points type, extends(abstract_point) :: point2d real :: x, y contains procedure :: add => add_vector_2d end type point2d contains subroutine add_vector_2d( point, vector ) class(point2d), intent(inout) :: point class(abstract_point), intent(in) :: vector select type (vector) class is (point2d) point % x = point % x + vector % x point % y = point % y + vector % y end select end subroutine add_vector_2d end module points2d ! test_points -- ! Использовать абстрактный тип program test_points use points2d class(abstract_point), pointer :: p type(point2d), target :: point type(point2d) :: vector point = point2d(1.0,2.0) vector = point2d(0.5,0.5) p => point call p % add( vector ) write(*,*) 'Resulting point:', point end program test_points | |