2017-02-06 9 views
1

値付きの変数を別のサブルーチンからサブルーチンに渡す方法を理解しようとしています。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) 

をサブルーチン呼び出しが正しい(構文が賢明)。どんな助けでも大歓迎です。

+0

サブルーチン 'test'を完了する必要があります。あなたがそこに引数の型を宣言していないので、デフォルトの型付け規則が使用されます。あなたのコンパイラがインターフェイスをチェックしていて、それらが一致していないと感じるようです。 – francescalus

+0

私はかなりfortranに慣れていますが、私はそこで引数の種類をどのように宣言しますか?私は実際にそれを行う方法を実際に知りません。 – werrer

+0

これはおそらくここで答えるには少し広すぎますが、[documentation](http://stackoverflow.com/documentation/fortran/1106/procedures-functions-and-subroutines#t=20170206030408357924)が役立つかもしれません。 – francescalus

答えて

1

まず、このエラーが起こっている理由:あなたは明示的にデフォルトでそうサブルーチンtest内の任意の変数を宣言していない、IMPLICIT変数の型の規則が適用されている - [A-H,O-Z]で始まる変数は単精度実数として扱われます(REAL(4))と余り([I-N]で始まる)は整数です。この場合、testの実際の引数はP,D,userInput,AおよびBです。 Nは整数として扱われます。また、これらはすべて、testに次元情報がないため、スカラー量として扱われます。

サブルーチンでは、変数Pは、長さ1の文字列(1文字またはCHARACTER(1))の12行12列の配列として宣言されています。これは、タイプミスマッチエラーが発生する理由を説明します。

アドバイス:IMPLICIT文を読んで、コードをIMPLICIT NONEで開始してください。これにより、すべての変数を宣言する必要があります。このわずかな不便さは、コンパイラがタイプミスと名前空間の衝突を検出するのを可能にし、ベストプラクティスとみなされます。次の問題を解決することはできません(PD、およびNはスカラであると予想されるルーチンへの引数として渡される配列ですが、型の不一致エラーを取り除きます)。

ボーナスポイントについては、引数の宣言についてINTENT属性を調べてください。特定の引数が読み取り専用であるか、ルーチン内で値が設定されていることがわかっている場合は、INTENT(IN)またはINTENT(OUT)と宣言できます。これは、誤って読み込み専用変数を変更したり、変数を初期化する前に変数を読み込んだりすることを防ぐための追加の警告です。

関連する問題