将参数传递给Fortran中的子例程

时间:2017-02-06 02:38:41

标签: fortran fortran90 subroutine

我试图了解如何将一些带有值的变量传递给子程序,从另一个子程序传递。

我有代码:

program pg
call sub()
end

subroutine sub()
character :: P(12,12)
character :: D(20), N(26), userInput
integer :: A,B

A = 5
B = 2
userInput = "hello"
call test(P,D,N,userInput,A,B)

end subroutine

subroutine test(P,D,N,userInput,A,B)

end subroutine test

但是这给了我一个警告:

Warning: Type mismatch in argument 'p' at (1); passed CHARACTER(1) to REAL(4)

我不确定如何摆脱这个警告,更不用说子程序调用是否正确(语法方面)。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,为什么会发生这种错误:您没有在子例程test中明确声明任何变量,因此默认情况下,应用IMPLICIT变量类型规则 - 以[A-H,O-Z]开头的变量是被视为单精度实数(REAL(4)),余数(以[I-N]开头)是整数。在这种情况下,test的真实参数是PDuserInputAB; N被视为整数。这些都被视为标量,因为test中没有提供维度信息。

在子例程sub中,变量P被声明为12×12长度为1的字符串数组(单个字符或CHARACTER(1))。这解释了为什么会出现类型不匹配错误。

建议:阅读IMPLICIT声明并始终使用IMPLICIT NONE开始使用代码。这会强制您声明所有变量。这种轻微的不便使编译器能够捕获拼写错误和命名空间冲突,并被认为是最佳实践。它不会解决您的下一个问题(PDN是作为参数传递给期望它们是标量的例程但是它将摆脱它类型不匹配错误。

对于奖励积分,请查看参数声明的INTENT属性。如果您知道某些参数是只读的或只在例程中设置其值,则可以将它们声明为INTENT(IN)INTENT(OUT)。这可以防止在初始化之前意外更改只读变量或读取变量。