我试图了解如何将一些带有值的变量传递给子程序,从另一个子程序传递。
我有代码:
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)
我不确定如何摆脱这个警告,更不用说子程序调用是否正确(语法方面)。任何帮助将不胜感激。
答案 0 :(得分:1)
首先,为什么会发生这种错误:您没有在子例程test
中明确声明任何变量,因此默认情况下,应用IMPLICIT
变量类型规则 - 以[A-H,O-Z]
开头的变量是被视为单精度实数(REAL(4)
),余数(以[I-N]
开头)是整数。在这种情况下,test
的真实参数是P
,D
,userInput
,A
和B
; N
被视为整数。这些都被视为标量,因为test
中没有提供维度信息。
在子例程sub
中,变量P
被声明为12×12长度为1的字符串数组(单个字符或CHARACTER(1)
)。这解释了为什么会出现类型不匹配错误。
建议:阅读IMPLICIT
声明并始终使用IMPLICIT NONE
开始使用代码。这会强制您声明所有变量。这种轻微的不便使编译器能够捕获拼写错误和命名空间冲突,并被认为是最佳实践。它不会解决您的下一个问题(P
,D
和N
是作为参数传递给期望它们是标量的例程但是它将摆脱它类型不匹配错误。
对于奖励积分,请查看参数声明的INTENT
属性。如果您知道某些参数是只读的或只在例程中设置其值,则可以将它们声明为INTENT(IN)
或INTENT(OUT)
。这可以防止在初始化之前意外更改只读变量或读取变量。