Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Не работает интерфейс. 
V
    Опции темы
popovda
Дата 9.11.2006, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Почему в данном модуле не работает интерфейс обращения к процедурам с опциональными параметрами? Точнее, если вызывать их, используя введенные флаги, типа

Код

call WriteVector(ComplexVect, numb = NUM_YES)

то все работает, а вот если так
Код

call WriteVector(ComplexVect, numb = .true.)

то ошибка при компиляции файла, содержащего вызов. Не понимаюsmile
Код

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


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
Иванофф
Дата 17.11.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 8.9.2006

Репутация: нет
Всего: нет



Может тип .true. по умолчанию не logical(4)


PM MAIL   Вверх
popovda
Дата 17.11.2006, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 290
Регистрация: 9.6.2006
Где: Москва

Репутация: нет
Всего: 6



Неа. Как выяснилось, фича не в этом. Логично было использовать сразу тип, совместимый с logical(1) и logical(2). НО! Сейчас с тем же компилятором этот интерфейс работает совершенно нормально, т.е.
Код

call WriteVector(Complex8Vector, numb = .true.)

и константы, которые пришлось вводить, уже не использую. Подозреваю глюк компилятора.

Это сообщение отредактировал(а) popovda - 17.11.2006, 22:41


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.