質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

2回答

651閲覧

WRITE文,READ文の引数に数式は入るのかどうか

yashiyashiyashi

総合スコア2

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2022/12/17 07:25

質問

こちらでhttps://teratail.com/questions/qgzkpk01qg6bls#reply-paiao497p4yfhi
昨日も質問させていただいたのですが,
フォートランでバイナリファイルをテキストファイルに変換するプログラムを作っています.
バイナリファイルを出力するプログラムに

fortran

1write(unitflux) ix+jy*numxgrid+kz*numxgrid*numygrid, 21.e12*flux(3,ix,jy,kz,k,kp,nage)/areanorth(ix,jy,kz)/outstep

という部分があるため

fortran

1 program readflux4 2 3 character (len=150) :: outfile, fname 4 real,allocatable, dimension (:,:,:,:,:,:,:) :: flux 5 real,allocatable, dimension (:,:,:) :: areanorth 6 real,allocatable, dimension (:,:,:) :: areaeast 7 8 open (9, file='fluxlist') 910 read (9,'(a)',end=90) fname 10 11 open (10,file=trim(fname),form='unformatted',ACCESS='stream') 12 print*, 'reading ',trim(fname) 13 write (outfile,900) trim(fname) 14 900 format (a,'.dat') 15 16 open (20, file=trim(outfile) ) 17 read (10) 1.e12*flux(:,:,:,:,:,:,:)/areanorth(:,:,:)/outstep 18 write (20,901) 1.e12*flux(:,:,:,:,:,:,:)/areanorth(:,:,:)/outstep 19 901 format (f12.5) 20 21go to 10 2290 close (9) 23 24 end 25

というプログラムを作成してコンパイルしようとしました,がエラーが発生しています.
エラーが発生する原因はread文,write文の引数が数式であるからでしょうか?
それとも別の原因(配列の扱い方が悪いなど)が考えられますか?
何かヒントをいただけたら幸いです.よろしくお願いします.

発生している問題・エラーメッセージ

readflux7.f90:17:15: 17 | read (10) 1.e12*flux(:,:,:,:,:,:,:)/areanorth(:,:,:)/outstep | 1 Error: Expecting variable in READ statement at (1) readflux7.f90:18:27-56: 18 | write (20,901) 1.e12*flux(:,:,:,:,:,:,:)/areanorth(:,:,:)/outstep | 1 2 Error: Inconsistent ranks for operator at (1) and (2)

試したこと

・エラーの内容的にread文の引数が認識されていないことやdimensionの理解ができていないことによるものではないかと思いdimensionについて調べましたが,よくわかりませんでした.
・read文,write文の引数をread (10) 1.e12*flux(:,:,:,:,:,:,:)/areanorth(:,:,:)/outstepという配列・数式ではなく,read(10) flux のみにしたところコンパイルと実行はできました.
しかし,この数式の計算結果を出力したいため困っています.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

先の質問に回答しましたが、
READ文の意味がわかっていないとは思いませんでした。

READ文の引数に数式は入るのかどうか

READ文の意味を理解していれば自明です。

その状態で試行錯誤するよりも、プログラミングの入門書を読み返して、
READ文とWRITE文を理解してから、再開するのが良いと思います。急がば回れです。

投稿2022/12/17 11:49

編集2022/12/17 11:51
otn

総合スコア84835

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yashiyashiyashi

2022/12/17 12:40 編集

昨日も回答ありがとうございました.初歩的な質問ですみませんでした. 時間がなく焦っていた点があるので落ち着いて頑張ってみたいと思います.
otn

2022/12/17 13:27

先の回答を見直すと、ちゃんと「~~型の値」と「~~型の変数」を区別して書いてました。
guest

0

ベストアンサー

read 文には式はこれない。今のプログラムを見て冷静に考えれば、どの変数に入力データを読み込むのか決められないのが分かる。自分がコンピュータになったつもりで考えれば、当惑するはず。

write文の方は式は来れるが、その式がおかしいので叱られている。配列の次元が(rankが)整合していない。7次元のものを3次元で割れと言われても、どの成分がどれに対応するのか決まらない。これまた当惑。

たとえば、以下のような式なら問題ない。

fortran

11.e12*flux(3,:,:,:,k,kp,nage)/areanorth(:,:,:)/outstep

I/O は計算の本質ではないので軽視されがちだが、躓きポイントではあるので焦らず考えた方がいい。

投稿2022/12/17 11:38

curehoney

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yashiyashiyashi

2022/12/17 12:38

すごく腑に落ちましたありがとうございます. やはり配列の理解が足りていなかったです. 自分はかなり勉強不足だと自覚したので一から勉強します. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問