【问题标题】:Passing parameters to a subroutine in Fortran将参数传递给 Fortran 中的子例程
【发布时间】:2017-02-06 02:38:41
【问题描述】:

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

我有代码:

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。就目前而言,您尚未在此处声明参数的类型,因此使用了默认类型规则。看起来您的编译器正在检查接口并发现它们不匹配。
  • 我对 fortran 很陌生,我将如何在那里声明参数的类型?我真的不知道该怎么做。
  • 这可能有点过于宽泛,无法在这里回答,但documentation 可能会有所帮助。

标签: fortran fortran90 subroutine


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多