このコードが予期しない動作をすることがわかりました
module testmodule
integer, parameter :: LCHARS = 50
contains
subroutine init()
call foobar("foobar")
end subroutine
subroutine foobar(s)
character(len=*), intent(in) :: s
call bar(s)
end subroutine
subroutine bar(str)
character(len=LCHARS), intent(in) :: str
print *, str
end subroutine
end module
program foo
use testmodule
call init()
end program
このコードは、コンパイラに依存するガベージを出力します。
問題は、文字列引数を使用してルーチンをジャンプしているという事実でありlen=*
、文字列引数に指定された長さのルーチンに渡されます。
フードの下で正確に何が起こっているのですか? また、この動作は標準のどこに記述されていますか? 文字ルーチンの引数の長さを指定しないようにする必要がありますか?