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

Passing parameters to a subroutine in Fortran

我正在尝试了解如何将一些带有值的变量从另一个子例程传递到一个子例程。

我有代码:

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)

我不确定如何消除此警告,更不用说子例程调用是否正确(语法方面)。任何帮助将不胜感激。

首先,为什么会出现这个错误:您没有在子例程 test 中显式声明任何变量,因此默认情况下,应用 IMPLICIT 变量类型规则 - 以 [=12= 开头的变量] 被视为 single-precision 实数 (REAL(4)),其余部分(从 [I-N] 开始)是整数。在这种情况下,test 的实际参数是 PDuserInputABN 被视为整数。此外,这些都被视为标量,因为 test 中没有提供维度信息。

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

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

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