• ベストアンサー

配列の定義

Fortranです。下のようなことがしたいのですが、うまく行きません。どうしたらよいのでしょうか? どなたか教えてください。お願いします。m(_ _)m ******************* h.f *************** integer i call keisu(i) complex*16 h(i,3) ******************** keisu.f ************ integer i i=5 ********************

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>そのiをkeisu.fで一括で変えられるようにしたいです。 ちょっとそれに合うかどうかわかりませんが、 1.配列の大きさが実行時にしか定まらないのかどうか  もしそうならfortran90で新設された配列の動的割付機能(ALLOCATE,DEALLOCATE)を使うしかないです。keisu.fを見るとどうもそうでもなくコンパイル時に決められるようですね。コンパイル時に決めていいなら、fortran77からあるPARAMETER文を使って定数を定義すればその定数で配列宣言できます。 2.サブルーチンへの配列サイズの引き渡し方  整合配列という機能があるので、サブルーチン側では配列宣言にサイズをすべて書かなくてもOKです。ただし大きさは呼び出し側プログラムで決める必要があるので、サブルーチンであるkeisu.f内で決めるのは無理です。 例:  integer HSIZE  parameter (HSIZE=10)  complex*16 h(HSIZE,3)  ...  call sub(h,HSIZE)  ...  end  subroutine sub(h,n)  integer n  complex*16 h(n,3) …または h(n,*) と最後の添え字だけは無指定(*)にできます。  ...  end fortran90なら形状引継ぎ配列という機能も使えます。 または、単に修正箇所を1箇所にしたいということだけなら、fortran77のinclude行、fortran90のモジュールを使う方法もあります。 前者ならkeisu.fを  integer i  parameter (i=5)  complex*16 h(i,3) にして、各プログラムに、include "keisu.f" を書く。 長年fortranを使ってないので細かいミスはあるかもしれません。マニュアルや下記ページ等を参考に。

参考URL:
http://www.ip.media.kyoto-u.ac.jp/htomita/sec0.html,http://www.uopmu.ees.osakafu-u.ac.jp/~yabu/soft/fortran.html
hugy
質問者

お礼

fortran77使っています。バリバリの初心者です。 単純に直すところを一箇所にしたいだけですが、なんか奥が深そうです。 色々いじってみましたが、時間との兼ね合いで、全てのsubroutineの中にparameterを書くことにしました。(本当はincludeを使いたいところだが、これは次の課題としておきます。) どうもありがとうございました。とても参考になりました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

「下のようなことがしたい」と書かれてますが、プログラムの体をなしていないので、何がしたいのかわかりません。 とりあえずおかしいところは、 h.f ・complexという宣言文が実行文callより後にある。 ・complexでの配列宣言の添字で変数iを使っている ・end文が無い keisu.f ・subroutine keisu(i) というサブルーチン宣言文が無い ・end文が無い

hugy
質問者

補足

質問見てくれてありがとうございます。 1) プログラム全部書くと長くなりますので、endは省略してあります。 2) h(i,3)がいくつものsubroutineで宣言されています。そのiをkeisu.fで一括で変えられるようにしたいです。 *complexという宣言文が実行文callより後にある* *complexでの配列宣言の添字で変数iを使っている* この2点をクリアできる方法を探しています。

すると、全ての回答が全文表示されます。

関連するQ&A