2009-04-18 14 views
6

私の新しいプロジェクトでは、ユーザーからの情報を格納するためにスクラッチファイルの代わりに配列を使用する必要があります。これを行うには、派生型も作成する必要があります。配列と派生型

しかし、私は配列が何で、どのような派生型であるか、それらの使い方、できること、その他の基本的な考え方を理解していません。 配列や派生した型に関する情報を誰かに教えてもらえますか?

私はそれらのためのコードを書いていますが、正しく書かれているかわかりません。 誰かが私のためにこれをチェックできるなら、私はそれを感謝します。ここで

は私のアレイと派生型である:

! derived type 
TYPE Bank 
    INTEGER :: acNumber, acChecks 
    REAL :: acBlance, acRate 
    CHARACTER :: acType*1, acLName*15, acFName*15 
END TYPE 

! array 
INTEGER, PARAMETER :: MaxRow, MaxColum = 7 
INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData 
+1

謝罪する必要はありません。あなたの英語は大丈夫です。人々が編集権を持っている理由の1つは、この分野での支援です。私の編集が助けてくれることを願っています。 – Eddie

答えて

6

あなたがFortranプログラマーであれば、おそらく10/15引数を受け入れるサブルーチンを見たことがあります。あなたがそれについて考えていると、それは狂っている(彼らはあまりにも多く、あなたはそれらを交換する危険を冒す)、あなたはすぐにいくつかの議論が常に一緒に旅行することをすぐに認識します。 これらを、全体として、独立したエンティティとしてではなく、すべてを包括する単一のエンティティの下にパックすることは理にかなっています。これにより、引数の数が大幅に削減され、適切な関連付けを見つける負担が軽減されます。この単一のエンティティがタイプです。

コードでは、銀行はそれらの情報の集合体であると言います。そのタイプの具体的な変数を宣言することができます。この変数は、単一の変数acNumber、acChecksなどを表し、それらにアクセスします。これを行うには、%記号を使用する必要があります。あなたの銀行の変数をb呼び出された場合ので、あなたは一例

b%acNumber = 5 

のために言うことができるあなたは別の棚を含む、クローゼットとしてBを想像することができます。あなたは閉じたまま移動し、すべての棚とそのコンテンツは一緒に移動します。

配列は、同じ型(整数、文字(len = 1024)、または銀行など)のエンティティのグループであり、数字のインデックスを使用してそれぞれにアクセスできるように順番に並べられます。

  • :1で、異なったFORTRANスタートで配列のインデックスを指定しない限り、あなたのコードのよう

    (他のすべての主要な言語では、最初のインデックスではなく、ゼロである)、それを忘れないでください、私はあなたを示唆しますそれは同じですが、あまり書く

    INTEGER :: AccountData(MaxRow,MaxColum) 
    

    として

    INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData 
    

    を書きます。 :との間には違いがあることにも注意してください。 2次元の配列である行列(あなたの場合)を定義する場合は、コンマを使用する必要があります。あなたが書いたものは間違っています。文字列の

  • 、それはあなたがこのケースで

    CHARACTER(LEN=1) :: acType 
    CHARACTER(LEN=15) :: acLName 
    CHARACTER(LEN=15) :: acFName 
    

    として

    CHARACTER :: acType*1, acLName*15, acFName*15 
    

    を書いた場合、あなたは(私も、間違っている可能性)以上の書き込みが、あなたの構文は廃止されました方が良いでしょう また、型に1行に1つのメンバ変数を書き込む方がよいことに注意してください。それは好みの問題ですが、メンバー変数ごとに1つの行を持つことによって、型のフルサイズを見ることを好みます。

  • MaxRowsとMaxColumnsについては、MAX_ROWSとMAX_COLUMNSとして記述します。伝統によって非常に一定であるパラメータやものは、すべての大文字のアンダースコアで区切られた名前で識別されます。


編集:ここでは、あなたのコメントにお答えするために、配列は、ちょうどによって識別される、同じ名前を持つ複数の変数、配列のようなものです

$ more foo.f90 
program test 
    integer :: myarray(10) 

    myarray = 0 ! equivalent to zeroing the single elements one by one 
    myarray(2) = 5 
    myarray(7) = 10 

    print *, myarray 

end program 
$ g95 foo.f90 -o foo 
$ ./foo 
0 5 0 0 0 0 10 0 0 0 

の使用例でありますインデックス。ベクトルや行列を表現するのに非常に便利です。 もちろん、定義済みの型(整数など)ではなく、定義した集約型の配列を作成できます。

+0

ご意見ありがとうございます。私は配列と派生型が何であるかを理解しましたが、配列で情報を格納することについてはまだ混乱しています。それはスクラッチファイルのようですか?これを行うにはWRITE文を使用する必要がありますか? –

+0

番号。これは、同じ変数型の複数のコピーに似ています。あなたは割り当てによってそれに書き込む。私は後で私の答えにもっと詳細なものを追加します。今私は急いでする必要があります:) –

+0

私はあなたの文章を修正したことに注意してくださいMaxRow、MaxColumn。あなたが書いたように、あなたは二次元配列を定義していません。その構文は他のことを意味します。 –

0

配列は、整数でインデックス付け、変数、同じタイプのすべての順序付きリストです。 Array in Wikipediaを参照してください。Fortran配列の索引付けでは、ディメンションごとに単一の索引ではなく、下限、上限、およびストライドからなる索引トリプレットを使用できるという点で、他のほとんどの低レベル言語よりも柔軟性があります。その場合、式の左辺値は、配列型の単一要素ではなくサブアレイです。

派生型は、ユーザーによって定義された複合型で、さまざまな種類の複数のコンポーネントで構成されます。他の言語では、これらは構造体、構​​造体型、またはレコード型として知られています。 Record in Wikipedia

また、派生型の配列を作成することもできます。また、1つ以上のコンポーネント自体が配列であるか、他の派生型である派生型を持つこともできます。それはあなた次第です!

コードを確認する最も簡単な方法は、コンパイルしようとすることです。それがコンパイラを通過することはもちろん、プログラムが期待どおりに動作することを保証するものではありませんが、確かに必要なステップです。

+0

あなたのコメントやリンクをありがとう! –

関連する問題