#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_
передать его автоматически. Это невозможно.