用Fortran将参数传递给子程序

用Fortran将参数传递给子程序,fortran,fortran90,subroutine,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 te

我试图理解如何将一些带有值的变量从另一个子例程传递到一个子例程

我有密码:

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)

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

首先,发生此错误的原因:您没有在子例程
测试中显式声明任何变量,因此默认情况下,将应用
隐式
变量类型规则-以
[A-H,O-Z]
开头的变量被视为单精度实数(
REAL(4)
)余数(以
[I-N]
开头)是整数。在这种情况下,
test
的实际参数是
P
D
userInput
A
B
<代码>N
被视为整数。此外,这些都被视为标量,因为在
test
中没有提供尺寸信息

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

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


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

您应该完成子例程
测试
。目前,您还并没有在那个里声明参数的类型,所以使用了默认的类型规则。看起来你的编译器正在检查接口,发现它们不匹配。我对fortran非常陌生,我应该如何声明那里的参数类型?我真的不知道该怎么做。这可能有点太宽泛了,不能在这里回答,但是这个问题可能会有帮助。