2017-03-14 18 views
2

Fortranの関数に文字列の長さの入力を想定します。私は関数が任意の長さの文字列(私も '天国'という単語を使用する予定)を取り込み、それに文字列 'plus stuff'を連結できるようにしたいと思います。私は、Visual Studio 2012でこれを実行して現在は、私は次のような単純なルーチンを書いています

、I取得するには、次のエラー:

Error 1 error #6303: The assignment operation or the binary expression operation is invalid for the data types of the two operands. D:\aboufira\Desktop\TEMP\Visual Studio\test\logicalfunction\scratch.f90 9

このエラーは、次の行を次のとおりです。

concat = x // 'plus stuff' 

は、それは私には明らかではない理由2つのオペランドは互換性がありません。私はそれらを両方ともストリングに設定しました。彼らはなぜつなぎませんか?

+1

あなたは関数 'concat'の型を宣言しておらず、Fortranが正しく機能していて、' real'関数であると判断するために良い古い*暗黙の型定義*を使用しました。変数を返す。任意の合理的なFortranのリファレンス、およびSOのqとasのホストは、暗黙の型定義の仕組みを説明し、悪いことを説明します。それを超えると、 'プログラム'が関数のインターフェースにアクセスできることを保証していないので、プログラムは 'concat'が本当に価値のあるものだとも考えています。 Fortranで 'contains 'と' module'の使用についてさらに研究してください。 –

+0

**常に**暗黙的には使用しないでください。それはあなたの人生をずっと簡単にします。 –

答えて

3

ハイパフォーマンスマークの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標準の作者のように。

+0

ここに答えが書いてもらえませんでした。 –

関連する問題