我想根据参数的类型值调用子例程。我尝试了以下方法,但是我收到了错误。
parameter, integer:: kind=4
integer(kind):: variable
if (kind==8) then
call routine_kind8(variable)
elseif(kind==4) then
call routine_kind4(variable)
endif
我收到以下错误:
call routine_kind8(variable)
1
Error: Type mismatch in argument 'variable' at (1); passed INTEGER(4) to INTEGER(8)
如何防止这种情况发生?
可以定义子例程routine_kind8
定义如下:
subroutine routine_kind8(variable)
implicit none
integer(8), intent(in):: variable
call api_write_data_to_file(variable)
end subroutine routine
其中api_write_data_to_file
是来自api的函数,它可以接受任何类型的类型。但是,我无法在参数列表中动态定义种类类型。因此,我必须根据变量的类型调用此例程的不同版本。
我可以或者更确切地说,不想直接致电api_write_data_to_file
。相反,我想在routine_kind8
答案 0 :(得分:5)
如果您使用的是相当新的编译器,则可以查看无限多态以实现目标。然后,您甚至可以将不同类型传递给同一子例程:
jQuery(document).on("click", "a#samplelink", function(e){
e.preventDefault(); // To prevent redirection from link
$("div.content input").val("Sample Preset Content"); // Setting value of input
})
您可以使用module test_mod
contains
subroutine print_type( input )
class(*),intent(in) :: input
select type(input)
type is (integer(kind=4))
print *, "Got an integer of kind 4"
type is (integer(kind=8))
print *, "Got an integer of kind 8"
type is (real)
print *, "Got a real number"
type is (complex)
print *, "Got a complex number"
end select
end subroutine
end module
program test
use test_mod
call print_type( 1_4 )
call print_type( 1_8 )
call print_type( 1. )
call print_type( (1.,1.) )
end program
语句进一步确定如何继续以及要调用的其他子例程。或者,完全跳过select case
语句并直接将所有内容传递给select case
。
或者,您可以以相同的方式为api_write_data_to_file
创建interface
块:
api_write_data_to_file()
然后,您不需要包装器来调用 interface api_write_data_to_file
subroutine api_write_data_to_file(variable)
class(*),intent(in) :: variable
end subroutine
end interface
。
答案 1 :(得分:0)
具有常量表达式条件的if
构造与条件编译不同。死代码消除也不适用于确保只处理其中一个块。
这意味着,当你有声明integer(kind=4) variable
时,你仍然有一句话说
call routine_kind8(variable)
期待integer(kind=8)
参数。
例如,您可以将条件编译与预处理器一起使用,但更好的方法可能是使用通用分辨率:
parameter, integer:: kind=4
integer(kind):: variable
call routine(variable)
在创建routine_kind4
和routine_kind8
的地方,有类似
interface routine
procedure routine_kind4 ! Defined at some point
procedure routine_kind8
end interface