fortran调用子程序,取决于种类值错误

时间:2015-11-18 13:22:30

标签: fortran

我想根据参数的类型值调用子例程。我尝试了以下方法,但是我收到了错误。

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

中调用它

2 个答案:

答案 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_kind4routine_kind8的地方,有类似

的内容
interface routine
  procedure routine_kind4    ! Defined at some point
  procedure routine_kind8
end interface