Передать другой объявленный тип процедуре привязки Fortran

#class #fortran #intel-fortran

#класс #fortran #intel-fortran

Вопрос:

Учитывая следующий код

   type t1 
     integer :: dum 
  type(aop), alloctable  :: bc(:) 
  end type t1 

 type aop 
   procedure(A_INT), pass(t1), pointer :: ptr => null()
 end type aop 

 abstract interface 
    subroutine A_INT ( this ) 
            import t1
            class(t1) , intent(in) :: this 
    end subroutine 

 end interface 
  

Кто-нибудь может объяснить, почему это незаконно? По крайней мере, компилятор говорит

 error #8170: The passed-object dummy argument is missing from the procedure interface.   [A_INT]
            procedure(A_INT), pass(t1),
   -------------------^
  

ОБНОВЛЕНО

Когда я делаю это вместо

   type t1 
     integer :: dum 
  type(aop), alloctable  :: bc(:) 
  end type t1 

 type aop 
   procedure(A_INT), pass(this), pointer :: ptr => null()
 end type aop 

 abstract interface 
    subroutine A_INT ( this ) 
            import t1
            class(t1) , intent(in) :: this 
    end subroutine 

 end interface 
  

Я получаю следующую ошибку

 error #8262: For a type-bound procedure that has the PASS binding attribute, the first dummy argument must have the same declared type as the type being defined.   [THIS]
             subroutine A_INT(  this
  

я полагаю, это означает, что компилятор ожидает, что первый аргумент будет иметь aop тип? Разве невозможно иметь this значение t1 типа?

Ответ №1:

Вы используете, pass(t1) но там нет фиктивного аргумента t1 , есть только аргумент, this который имеет тип t1 .

С одним фиктивным аргументом я бы обычно вообще не использовал здесь никаких явных pass . Переданный фиктивный аргумент имеет смысл только тогда, когда он того же типа, что и тип, в котором определен указатель. В противном случае для аргументов других типов просто используйте nopass .

Комментарии:

1. Спасибо @Vladimir, это имеет смысл. Итак, высказывание pass(this) заставило бы компилятор подумать, что это this имеет тип aop , как мне изменить это, чтобы оно имело тип t1 . PS: На самом деле у меня гораздо больше фиктивных аргументов, поэтому я хотел иметь явный проход, чтобы уменьшить его.

2. О, теперь я понимаю, ваш дизайн выглядит действительно странно. Если у вас нет переданного фиктивного аргумента, вам нужно nopass . Но вы уверены, что вам на самом деле не нужно this иметь тип aop и обращаться к ptr аргументу внутри?

3. Итак, что мне нужно, так это сделать это, call t1_% bc(1)% ptr( ..... ) где t1_ есть ТИП t1 . Я хочу, чтобы этот вызов передавался t1_ автоматически, не включая его в аргументы в вызове

4. Я вижу, как я уже сказал, просто удалите проход полностью. Вам это не нужно.

5. Вы не можете t1_ передать его автоматически. Это невозможно.