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
4

2 に答える 2

6

あなたがFortranプログラマーなら、おそらく10/15引数を受け入れるサブルーチンを見たことがあるでしょう。あなたがそれについて考えるならば、それは正気ではなく(それらは多すぎる、あなたはそれらを交換するリスクを冒します)、そしてあなたはすぐにいくつかの議論が常に一緒に伝わることに気づきます。独立したエンティティとしてではなく、全体としてすべてを運ぶ単一のエンティティの下にそれらをパックすることは理にかなっています。これにより、引数の数が大幅に減り、適切な関連付けを見つける負担だけが与えられます。この単一のエンティティがタイプです。

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

b%acNumber = 5

bは、さまざまな棚を含むクローゼットとして想像できます。閉じたものを移動すると、すべての棚とその内容が一緒に移動します。

配列は、同じタイプ(整数、Character(len = 1024)、またはBankなど)のエンティティのグループであり、次々に存在するため、数値インデックスを使用して各エンティティにアクセスできます。別に指定されていない限り、Fortranの配列インデックスは1から始まることに注意してください(他のすべての主要言語では、最初のインデックスは代わりにゼロです)

あなたのコードに関しては、私はあなたに次のことを提案します:

  • 書きます

     INTEGER, DIMENSION(MaxRow:MaxColum) :: AccountData 
    

    なので

     INTEGER :: AccountData(MaxRow,MaxColum)
    

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

  • 文字列については、

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

    なので

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

    この場合、さらに記述しますが、構文は非推奨になります(ただし、間違っている可能性があります)。また、型の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

配列は、インデックスで識別される同じ名前の複数の変数のようなものです。ベクトルまたは行列を表現するのに非常に便利です。もちろん、事前定義された型(整数など)の代わりに、定義した集約型の配列を実行することもできます。

于 2009-04-19T20:22:10.710 に答える
0

配列は変数の順序付けられたリストであり、すべて同じ型で、整数でインデックス付けされています。ウィキペディアの配列を参照してください 。 Fortran では、配列のインデックス付けは、他のほとんどの低レベル言語よりも柔軟であり、次元ごとに 1 つのインデックスではなく、下限、上限、およびストライドで構成されるインデックス トリプレットを使用できることに注意してください。その場合、式の左辺値は、配列型の単一要素ではなく部分配列です。

派生型は、ユーザーによって定義された複合型であり、異なる型の複数のコンポーネントで構成されます。他の一部の言語では、これらは構造体、構​​造体型、またはレコード型として知られています。ウィキペディアの記録を参照

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

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

于 2009-04-19T19:18:29.223 に答える