ハイパフォーマンスマークのcommentは、なぜコンパイラーが文句を言うのかを教えてくれます。
concat
の結果は、それ以外の場合はその型を宣言していないため暗黙的に型指定されています。 x // 'plus stuff'
は文字変数を連結する正しい方法ですが、(暗黙的に)実際の関数結果にその新しい文字オブジェクトを割り当てようとしています。
これは、「関数の結果を文字にするにはどうすればよいのですか?」という質問につながります。回答:あなたは他のあらゆる文字変数限り:
character(len=length) concat
[私はcharacter(len=...)
ではなくcharacter*...
を使用することに注意してください。私は正確に後で理由を説明しますが、フォームcharacter*4
は現在のFortranによれば時代遅れであり、最終的には完全に削除される可能性があることを指摘します。]
トリッキーな部分は何ですか?と宣言する必要がありますか?
私たちは事前に知っていない文字関数の結果の長さを宣言すると2つののアプローチがあります
- 自動文字オブジェクト。
- 遅延文字オブジェクトです。
この関数の場合、結果の長さは入力より10倍長いことがわかります。
character(len=LEN(x)+10) concat
これを行うには、character*(LEN(x)+10)
という形式を使用できません。より一般的な場合、遅延の長さで
:これらのフォームを使用
character(len=:), allocatable :: concat ! Deferred length, will be defined on allocation
後
concat = x//'plus stuff' ! Using automatic allocation on intrinsic assignment
関数concat
はメインプログラムに明示的インターフェースを有する要件を追加します。あなたは他の質問やリソースでそれについて多くを見つけるでしょう。明示的なインタフェースを提供することで、メインプログラムのconcat
も暗黙的に真の結果をもたらすという問題を取り除くことができます。ストレスに
:
program
implicit none
character(len=[something]) concat
print *, concat('hell')
end program
は形の「コンパイル時に、長さ不明」の結果を持つconcat
では動作しません。理想的には、関数は内部関数またはモジュールからアクセスされる関数になります。想定長関数の結果:
第三あります。これについて知りたがっている人なら誰でもseparate questionと読むことができます。誰もがこれが存在しないふりをするべきです。 Fortran標準の作者のように。
あなたは関数 'concat'の型を宣言しておらず、Fortranが正しく機能していて、' real'関数であると判断するために良い古い*暗黙の型定義*を使用しました。変数を返す。任意の合理的なFortranのリファレンス、およびSOのqとasのホストは、暗黙の型定義の仕組みを説明し、悪いことを説明します。それを超えると、 'プログラム'が関数のインターフェースにアクセスできることを保証していないので、プログラムは 'concat'が本当に価値のあるものだとも考えています。 Fortranで 'contains 'と' module'の使用についてさらに研究してください。 –
**常に**暗黙的には使用しないでください。それはあなたの人生をずっと簡単にします。 –