Опытный
 
Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва
Репутация: нет Всего: 6
|
Почему в данном модуле не работает интерфейс обращения к процедурам с опциональными параметрами? Точнее, если вызывать их, используя введенные флаги, типа | Код | call WriteVector(ComplexVect, numb = NUM_YES)
|
то все работает, а вот если так | Код | call WriteVector(ComplexVect, numb = .true.)
|
то ошибка при компиляции файла, содержащего вызов. Не понимаю  | Код | module constants
implicit none;
real(8),parameter :: pi = 3.1415926535897932384626433832795; real(8),parameter :: P =0.3;
! частные значения вектора спинов real(8), dimension(1:6),parameter :: S_i_minus_i = (/ 1.0, 0.0, 0.0, -1.0, 0.0, 0.0/); real(8), dimension(1:6),parameter :: S_minus_i_i = (/-1.0, 0.0, 0.0, 1.0, 0.0, 0.0/);
! Форматные строки - префикс "fmt_" ! С нумерацией - приставка N ! Действительные character(*),parameter :: fmt_Real = "(1x,F15.7)" character(*),parameter :: fmt_NReal = "(1x,I8,4x,F15.7)"
! Комплексные character(*),parameter :: fmt_Complex = "(1x,'(',F15.7,';',F15.7,')')" character(*),parameter :: fmt_NComplex = "(1x,I8,4x,'(',F15.7,';',F15.7,')')"
! Флаг нумерации logical(4), parameter :: NUM_NO = .false., NUM_YES = .true.;
! Интерфейсы ! Родовое имя для WriteXXXXXXXVector
interface WriteVector module procedure WriteRealVector, WriteCmplxVector; end interface WriteVector;
contains ! Вывод собственного вектора ! V - вектор ! numbering - флаг нумерации ! caption - строка сообщения
! Действительный вектор subroutine WriteRealVector(V,unit, numb, caption) ! Вектор real(8), dimension(:), intent(in) :: V; ! Опциональные параметры ! Поток вывода integer(4), optional :: unit; ! Нумерация и заголовок logical(4), optional, intent(in) :: numb; character(len = *), optional, intent(in) :: caption; !------------------------------------------------------ ! Счетчик integer(4) :: k; ! Поток вывода integer(4) :: cout; ! Форматная строка character(len = len(fmt_NComplex)) :: fmt_str; !--------------------------------------------------------------- if(present(unit)) then cout = unit; else cout = 0; end if; if(present(caption)) then write(cout,*); write(cout,*) caption,':'; write(cout,*); end if;
do k = lbound(V, dim = 1),ubound(V, dim = 1) if( (present(numb)) .and. (numb == NUM_YES ) )then write(cout,fmt_NReal) k,V(k); else write(cout,fmt_Real) V(k); end if; end do; end subroutine WriteRealVector;
! Комплексный вектор subroutine WriteCmplxVector(V, unit, numb, caption) ! Вектор complex(8), dimension(:), intent(in) :: V; ! Опциональные параметры ! Опциональные параметры ! Поток вывода integer(4), optional :: unit; ! Нумерация и заголовок logical(4), optional, intent(in) :: numb; character(len = *), optional, intent(in) :: caption; !------------------------------------------------------ ! Счетчик integer(4) :: k; ! Поток вывода integer(4) :: cout; ! Форматная строка character(len = len(fmt_NComplex)) :: fmt_str; !--------------------------------------------------------------- if(present(unit)) then cout = unit; else cout = 0; end if; if(present(caption)) then write(cout,*); write(cout,*) caption,':'; write(cout,*); end if;
do k = lbound(V, dim = 1),ubound(V, dim = 1) if( (present(numb)) .and. (numb == NUM_YES) )then write(cout,fmt_NComplex) k,V(k); else write(cout,fmt_Complex) V(k); end if; end do; end subroutine WriteCmplxVector; end module constants;
|
Это сообщение отредактировал(а) popovda - 10.11.2006, 21:33
--------------------
С уважением, Попов Д.А.
|