2016-07-12 3 views
-2

は今、私はこの

program prova 
CHARACTER (LEN=4) :: mvalue 
common mvalue 
mvalue='01.0' 
call funzione(var1, var2,...) 
end 

subroutine funzione() 
common mvalue 
*(stuff with var1, var2, ...)* 
open(10,file="./prova_"//mvalue//"_.res") 
end 

のようなものを持っているファイル名に文字列を取り付け、コンパイラが返す

open(10,file="./prova_"//mvalue//"_.res")       
             1 
Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4) 

私が「暗黙のなし」命令を使用できるかどうか私は知りません実際のコードは多分それが他のものを混乱させるかもしれないから...もし私がもっと正確ではない場合は申し訳なく思っていますが、私はFORTRANには新しく、コードはちょっと拡張されています不完全に)。 私は日常的にmvalue変数を渡すことを好むだろうが、私は

program prova 
CHARACTER (LEN=4) :: mvalue 
mvalue="01.0" 
call func(mvalue) 
end 


subroutine func(mvalue) 
open(10,file="./prova_"//mvalue//"_.res") 
end 

を行うにしようとコメンターは、すでに指摘したように、2つの異なる二重引用符を使用していることが

open(10,file="./prova_"//mvalue//"_.res")       
          1 
Error: Operands of string concatenation operator at (1) are CHARACTER(1)/INTEGER(4) 

prova.f:4.16: 
call func(mvalue)             
Warning: Type mismatch in argument 'mvalue' at (1); passed CHARACTER(1) to INTEGER(4) 
+1

として宣言されています。 –

+0

''unknown''も無効です –

+0

もう一つの勧告: 'status = 'unknown''を使用する理由はありません。ちょうどそれを残す。または理由がある場合は、既知のステータス値を使用してください。 –

答えて

0

を返します。マーカーはコンパイル時にはパスしますが、実行時には失敗します。

file=仮引数は、文字列を期待し、それは非常に長いものを取得:./results/file_01.0_R00.res',status='unknownの全体を。しかし、そのファイルを開こうとすると失敗します。これは単に有効なファイル名ではありません。

は単純に両方のインスタンス(.res後とunknown前)に"'を交換すると、エラーが消える行う必要があります。

2

あなたのサブルーチン:

subroutine funzione() 
common mvalue 
*(stuff with var1, var2, ...)* 
open(10,file="./prova_"//mvalue//"_.res") 
end 

implicit noneが不足しています!例外なくすべてのスコープ単位で常に使用してください。

mvalueの型は宣言されていないため、暗黙的に整数です。

各スコープ単位で型を宣言する必要があります。 commonを使用して共有するだけでは不十分です。

Fortran 90の適切なことは、共通ブロックではなくモジュールを使用することです。どのプログラミング言語でも、一般的な方法、モジュールの使用方法、その他の方法を問わずグローバル変数を共有するのではなく、文字列を引数としてサブルーチンに渡すのが適切な方法です。あなたの新しい編集する


同じアドバイスはまだ有効である:あなたのサブルーチンがimplicit noneが欠落しています!例外なくすべてのスコープ単位で常に使用してください。

implicit noneを使用できない場合はにしてください!!!!!は、宣言されていない変数から来るエラーを診断するために用意してください。絶対に必要なのはです!

文字仮引数は、 ``や ` '「_R00.res'`は右を見ていない、あなたは`同じを使用する必要があります」 `character*(*) mvalue