ページ 11

fortranのwrite文について

Posted: 2012年9月14日(金) 21:14
by 長い
WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),fx(I),fy(I),NAT(I),I=1,NP)
   600 format(I8,2E20.10,2F20.10,I5)
上のように書いたんですが、実行したら

   WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),fx(I),fy(I),NAT(I)
1
Error: Expected PARAMETER synbol in complex constant at (1)

のようなメッセージがでたので、出来る方は教えて直してくれませんか。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 21:42
by box
長い さんが書きました:WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),fx(I),fy(I),NAT(I),I=1,NP)
   600 format(I8,2E20.10,2F20.10,I5)
I を I8 で。
X(I), Y(I) を 2E20.10 で。
vvx(i), vvy(i) を 2F20.10 で。
fx(I) を I5 で。

fy(I), NAT(I) に関する書式指定はどうなるんでしょうか。

変数名の大文字と小文字の区別は、FORTRANではどうなっていたでしょうか。同一視するんでしたっけ?

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 21:47
by 長い
すみませんが
WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),MAT(I),I=1,NP)
    600 format(I8,2E20.10,2F20.10,2F15.10,I5)
このように書いても同じメッセージが出ました。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 22:07
by box
長い さんが書きました:すみませんが
WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),MAT(I),I=1,NP)
    600 format(I8,2E20.10,2F20.10,2F15.10,I5)
このように書いても同じメッセージが出ました。
えっと、そもそも、WRITE文のWやformat文のfを7カラム目以降に書いていて、
かつ、format文の番号600は1~5カラムに書く、ということはできているんですよね。
「そんなことは知っている!」ということでしたら、失礼いたしました。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 22:17
by 長い
7カラム目以降に書くなどのことはちゃんとしました。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 22:22
by box
長い さんが書きました: 上のように書いたんですが、実行したら

   WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),fx(I),fy(I),NAT(I)
1
Error: Expected PARAMETER synbol in complex constant at (1)
codeタグを使うなどの方法で、Error:の上の行の「1」という文字が
どの位置にあるかを正しく教えていただけますでしょうか。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 22:55
by 長い
    WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),fx(I),fy(I),NAT(I),I=1,NP)
c
       600 format(I8,2E20.10,2F20.10,2F15.10,I5)

上のように書いてありますが、  別のところに(1)は書いてありません。でもメッセージは

Error: Expected PARAMETER synbol in complex constant at (1)

ようです。よろしくお願いします。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 23:02
by box
長い さんが書きました: 1
Error: Expected PARAMETER synbol in complex constant at (1)

のようなメッセージがでたので、出来る方は教えて直してくれませんか。
このようなメッセージが出たんですよね。
Error:の行にある単独の「1」については、
たぶんコンパイラーが「ここにエラーがあるよ」と教えてくれているような気がするのです。
質問者さんが書かれていないことは承知しています。

そもそも、synbolのスペルからして正しくありませんので、ここは一つ、
コンパイラーが吐き出したエラーメッセージを、正確に、カラムをきれいにそろえて
書いていただく必要がありそうです。

codeタグの使い方はおわかりですか?

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 23:18
by 長い
 すみませんが、
 fortranは途中から勉強している所なんですから、codeタグの使い方あまり分かりませんね。
 よろしくお願いします。

Re: fortranのwrite文について

Posted: 2012年9月14日(金) 23:54
by box
このページの上の方に、コードの貼り付け方が書いてあります。
codeタグの使い方について書いてありますので、参照なさってください。
ちなみに、codeタグの使い方と、Fortran言語の経験の長短とは関係ありません。

Re: fortranのwrite文について

Posted: 2012年9月15日(土) 00:48
by へにっくす
長い さんが書きました: すみませんが、
 fortranは途中から勉強している所なんですから、codeタグの使い方あまり分かりませんね。
 よろしくお願いします。
FORTRANのスキル全然関係ないよ。
このページの上の方にある、赤い四角で囲ったところに、
※コードを貼り付ける場合は[code][/code] で囲って下さい。詳しくはこちら
とあるのが見えないのでしょうか?

まあとりあえず、掲示したソースを[code=fortran][/code]で囲むと、以下のようになります。

コード:

c--------1---------2---------3---------4---------5---------6---------7---------8
      WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),MAT(I),I=1,NP)
600   format(I8,2E20.10,2F20.10,2F15.10,I5)
WRITE行の最後から2番目で l=1 とあるけどこれは?
許されている書き方か?

Re: fortranのwrite文について

Posted: 2012年9月15日(土) 14:38
by hoge
長い さんが書きました:7カラム目以降に書くなどのことはちゃんとしました。
ということは、固定書式でプログラム書いているんですね
固定書式の場合、普通は72カラムまでしかプログラムを書けなかったと思うけど
WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),MAT(I),I=1,NP)
が72カラムまでに収まらないけど、いいの?

Re: fortranのwrite文について

Posted: 2012年9月16日(日) 01:15
by かずま
Linux (Ubuntu 10.04) に gfortran をインストールして試してみました。

コード:

      integer I, NP, NAT(3)
      real X(3), Y(3), vvx(3), vvy(3), Fsurfx(3), Fsurfy(3)
      NP = 3
      do 10 I = 1, NP
        X(I)       = I + 2
        Y(I)       = I + 3
        vvx(I)     = I + 4
        vvy(I)     = I + 5
        Fsurfx(I)  = I + 6
        Fsurfy(I)  = I + 7
10      NAT(I)     = I + 8
c--------1---------2---------3---------4---------5---------6---------7---------8
      WRITE(26,600)
     *   (I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),NAT(I),I=1,NP)
600   format(I8,2E20.10,2F20.10,2F15.10,I5)
      end
実行結果

コード:

       1    0.3000000000E+01    0.4000000000E+01        5.0000000000        6.0000000000   7.0000000000   8.0000000000    9
       2    0.4000000000E+01    0.5000000000E+01        6.0000000000        7.0000000000   8.0000000000   9.0000000000   10
       3    0.5000000000E+01    0.6000000000E+01        7.0000000000        8.0000000000   9.0000000000  10.0000000000   11
なお、write文を次のように 1行で書くと、次のようなコンパイルエラーになりました。

コード:

c--------1---------2---------3---------4---------5---------6---------7---------8
      WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),NAT(I),I=1,NP)

コード:

kazuma@ubuntu-vm:~/tmp$ gfortran a4.f
a4.f:13.21:

      WRITE(26,600)(I,X(I),Y(I),vvx(i),vvy(i),Fsurfx(I),Fsurfy(I),NAT(I)
                     1
Error: Expected PARAMETER symbol in complex constant at (1)

Re: fortranのwrite文について

Posted: 2012年9月20日(木) 00:51
by かずま
hoge さんの指摘で疑問が解決したはずなのに、どうして
最初の質問者は何の反応もしないのでしょうか?

私は、エラーメッセージが疑問だったのでちょっと調べてみました。

まず、73カラム以降の ,I=1,NP) が無視されなければ、これは、(xxx,I=1,NP) と
いう「DO型並び」となり、「xxx」が NP回繰り返されるはずでした。

しかし、それがないので「(xxx」は、単なる出力並びとなります。
問題は最初の「(」です。出力並びは、変数だけでなく定数でも式でもよいので
「(」は式の始まりと解釈されるのでしょう。
ところが、「(I,」まで来たところで、式が破綻します。

Fortran の式では、数値が来るところに「(定数,定数)」が来ると、
それは複素数定数だと解釈します。
定数は、数字以外に PARAMETER宣言されたシンボルでも構わないので、コンパイラは
「(I,」 の「,」で破綻しないように、「I」は PARAMETERシンボルであることを要求して、
「Error: Expected PARAMETER symbol in complex constant at (1)」とメッセージを
出しているのだろうと推察されます。