最近、FORTRANについての勉強を始めたものですが
いまいち「COMMON」の意味が理解出来ません。

例えば下のようなプログラムで(簡単に書きすぎてすいません)

  (Aグループ)
      COMMON X
        X=10

  (Bグループ)
      COMMON Y

   (UEXTERNAL)
      COMMON X. Y。

    WRITE X 

   X=10と出力されるのでしょうか?

分る範囲でいいのでお願いします。

A 回答 (2件)

ずいぶん昔(30年ほど前)にやっただけなので浦島太郎ですが。



COMMONは複数のプログラム間でデータを共有する手法ですね。
COMMON宣言は順序だけが意味を持ちます。

Aグループ X
Bグループ Y
Cグループ X Y
と定義したとするとCグループのYは「ままこ」で
XaとYbとXcは同じエリアを指します。

ご質問どおり、write Xは X=10ですが、これはXだからではなく、1個目の変数だからと言う事です。

もし、Bグループで、Y=5をやれば、write Xは 5となります。

余談ですが、COMMONエリアはハイ・メモリーから逆順に取られていた記憶があります。今でもそうなんでしょうかね。
    • good
    • 0

無名共通領域の宣言ですから.多分お話のようになると思いますが.


無名共通領域の取り扱いで.変数名は土のように変えても良いのですが.領域の大きさを同じにする必要があったかと思います(機種依存性かも)。
つまり.暗黙の変数型を使用しているとして.A.B共に4バイト割り当てています。
しかし.最後のCOMMON文では8バイト割り当てています。すると.場合によっては変数の共食い(方言の可能性あり)でYの数値を操作した時にXの値も変化してしまうとかのおかしなことが発生する場合があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfortranでx=1としても0.9..が入る

fortranで以下のようなプログラムにてxに1.0^-6を代入し、
その中身を表示しました。
---------------------------------
program test

real(8) :: x = 1.0d-6

write(*,*) x
write(*,*) x * 1.0d6
write(*,*) int(x * 1.0d6)

end program test
---------------------------------

しかし、結果は以下のようになり、
0.999999999999999955^-6となってしまいます。
さらに、やっかいなことに10^6倍して
整数型に変換しても0と認識されてしまうのです。
----------------------------------
$ ./a.exe
9.99999999999999955E-007
1.00000000000000000
0
----------------------------------

変数の型も倍精度で宣言し、定数も倍精度(d付き)で
代入しているはずなのですが、なぜこのような現象が
起きるのでしょうか。
ご存知の方いましたら教えて頂けると助かります。

なお、コンパイルはgfortranで行っています。

fortranで以下のようなプログラムにてxに1.0^-6を代入し、
その中身を表示しました。
---------------------------------
program test

real(8) :: x = 1.0d-6

write(*,*) x
write(*,*) x * 1.0d6
write(*,*) int(x * 1.0d6)

end program test
---------------------------------

しかし、結果は以下のようになり、
0.999999999999999955^-6となってしまいます。
さらに、やっかいなことに10^6倍して
整数型に変換しても0と認識されてしまうのです。
----------------------------------
$ ./a.exe ...続きを読む

Aベストアンサー

fortranは使ったことがないのですが、これはプログラミング言語全般で一般的に見られる現象と思います。すなわち、小数の値に誤差が出る原因はなにか?ということですね。

小数は、コンピュータでは完全に正しく表現できません。誰でも思いつくのが循環小数の存在です。例えば、10 / 3は、0.33333……ですが、コンピュータでは適当な桁で終わってしまいます。0.33333という具合ですね。これに3をかけると0.99999で、1には戻りません(まぁ、最近の言語では循環小数を認識しちゃんと1に戻るものもありますが、考え方として、ということです)。この問題は、誰でも理解できることと思います。

この問題が、2進数でも起こります。すべての数値は、コンピュータ内部では2進数として処理されています。やっかいなのは、2進数と10進数では微妙にその性質が異なる点です。2進数では、1を10のn乗で割った値は循環小数になるのです。1 / 10は10進数では0.1で割り切れますが、2進数では循環小数になり割りきれません。先の10 / 3と同様、適当なところで切り捨てられ、不正確な値として保管されます。このため、1 / 10の値に10をかけても0.99999……となり、1には戻らないのです。

この現象が、ご質問のケースでも内部で起こっているのだと思います。

fortranは使ったことがないのですが、これはプログラミング言語全般で一般的に見られる現象と思います。すなわち、小数の値に誤差が出る原因はなにか?ということですね。

小数は、コンピュータでは完全に正しく表現できません。誰でも思いつくのが循環小数の存在です。例えば、10 / 3は、0.33333……ですが、コンピュータでは適当な桁で終わってしまいます。0.33333という具合ですね。これに3をかけると0.99999で、1には戻りません(まぁ、最近の言語では循環小数を認識しちゃんと1に戻るものもありますが、考...続きを読む

QFortran90/Fortran95→Fortran77

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい)

Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです

前置きが長くなりましたが、エラーが出る文は以下のところです
open(8,file='freq_ex13.dat',action='write',status='replace')
ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコン...続きを読む

Aベストアンサー

action='write'を削除してみては?
8番にREADを使わなければいいだけの話です。
http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Fortranはコンパイラ毎に独自の拡張が相当されてますから、移植する際にはどの拡張が使えるのか把握する必要があります。
使えない場合はコンパイルエラーが返ってくるのですぐにわかりますけど。
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFort/fvp11/fvp00079.htm

参考URL:http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

QFORTRANのCOMMON文

COMMON文について教えてください。
本を見ると
R(2,2)という配列を共有したいとき
R(2,2)を主プログラムで定義しているとき
主プログラムとR(2,2)を使うサブルーチンの
両方でCOMMON文を書く必要がある。
というような内容でした。
そこで配列を宣言して両方にCOMMON文を書くとエラーが出ます。そこで配列宣言を消去するとエラーがなくなります。COMMON文を使うときは配列(変数)を宣言する必要はないのですか?(暗黙の型宣言は使わない場合を考えています。)
またCOMMON文では変数の型宣言をするとエラーが出るし暗黙の型宣言に従って使うと変数には意味を付けて使っているので都合が悪いときもあります。
倍精度で変数を使いたい時とかにも困りますし。
COMMON文で自由な型で変数を使うにはどうしたらいいのでしょうか?
教えてください。お願いします。

Aベストアンサー

> double precision W1
R1の間違いじゃないですか?
これだとメインとサブでR1がdoubleとrealになるのでコモンブロックのサイズが合わないと警告が出てくると思いますけど。


迷ったときには規格を、ということでFORTRAN 77 Full Language(ANSI X3J3/90.4)を見てみました。
下記は原文にインデックスをつけて見やすくしたものです。
http://www.fortran.com/fortran/F77_std/rjcnf-8.html#sh-8.3.1

原文はこちら。
http://www.fortran.com/fortran/F77_std/f77_std.html

commonにはvariable names、array names、array declaratorsが使えると書いているようなので、
integer r(5)
common /a/ r
は特に問題なく使えるような気がします。
全部を読んだわけではないので、どこかに但し書きがあるかもしれませんが。


一応compaqのサイト(多分fortranの日本語ドキュメントはここが一番充実している)
http://www1.jpn.hp.com/products/software/development/dvf/docs/vf-html/az/az03_26.htm
も見てみましたが、ここでも、
integer r(5)
common /a/ r
のような感じでかかれていましたね。
ここのドキュメント(Compaq Visual Fortran用)がそのまますべてのコンパイラに当てはめられるわけでもないですけど。



#3さんの(スペル忘却)の部分はEQUIVALENCEのことですかね?
http://www1.jpn.hp.com/products/software/development/dvf/docs/vf-html/Lr/lr05_07.htm




参考になりそうなURLを載せておきます。

マニュアル類
http://www.fortran.com/fortran/F77_std/rjcnf.html
http://www1.jpn.hp.com/products/software/development/dvf/docs/index.html
http://www.imit.chiba-u.ac.jp/services/ed_rsch/sr8000/manual/6a303313/html/m0240001.htm


ソースコード(サンプル)
http://www.ccl.net/cca/software/SOURCES/FORTRAN/allen-tildesley-book/index.shtml
http://ion.le.ac.uk/cutlass/merge/merge.f.html
http://www.physics.carleton.ca/courses/75.502/slides/projects/1996/joanne/node1.html
http://spallation.physics.sc.edu/~blanpied/research/chase/source.htm

> double precision W1
R1の間違いじゃないですか?
これだとメインとサブでR1がdoubleとrealになるのでコモンブロックのサイズが合わないと警告が出てくると思いますけど。


迷ったときには規格を、ということでFORTRAN 77 Full Language(ANSI X3J3/90.4)を見てみました。
下記は原文にインデックスをつけて見やすくしたものです。
http://www.fortran.com/fortran/F77_std/rjcnf-8.html#sh-8.3.1

原文はこちら。
http://www.fortran.com/fortran/F77_std/f77_std.html

commonにはvariable names、...続きを読む

Qfortranのwrite文コメント有無で処理結果が変わる

初めまして。インテルfortranを使っているのですが、ソースのwrite文をコメントにするだけで処理結果が変わってしまうという現象に遭遇しています。
環境は以下です。
OS:Fedora Core 6
コンパイラ:インテルfortran 10.0.023

具体的には、下記のソースで45行目の

ccc write(*,*) ians,sn

write(*,*) ians,sn

とするだけで、コンパイルは正常にできるのですが処理結果が変わってしまうのです。
      
43 j4=ians+ifix(wind_p*samp)
44 if(j4.gt.nnn) j4=nnn
45 ccc write(*,*) ians,sn
46 cc write(*,*) 'pick plib ',stnw(kst),ians,sn
47 if(sn.lt.aic_pmin_repic.or.ians.lt.1) go to 5
48 jjans=jj1+ians

原因が全くわからず困り果てております。
解決方法や原因の心あたりがありましたら、是非教えてください。

初めまして。インテルfortranを使っているのですが、ソースのwrite文をコメントにするだけで処理結果が変わってしまうという現象に遭遇しています。
環境は以下です。
OS:Fedora Core 6
コンパイラ:インテルfortran 10.0.023

具体的には、下記のソースで45行目の

ccc write(*,*) ians,sn

write(*,*) ians,sn

とするだけで、コンパイルは正常にできるのですが処理結果が変わってしまうのです。
      
43 j4=ians+ifix(wind_p*samp)
44 if(j4.gt.nn...続きを読む

Aベストアンサー

この文面だけで回答できるほど超能力のある人はそうそういないと思いますが....
出てくる変数や関数, そして「どのように変わったのか」くらいは書けませんか?

QgdbでFortranの名前つきcommonブロック内の変数の表示

いまどきFortranなんてカテゴリーさえもないのですが、よろしくお願いします。

去年の暮れからLinuxを使って、Fortranで計算をしています。
質問は、Fortranの名前つきcommonブロック内のの配列変数をgbdを使ってデバッグしている時にprintコマンドで表示したいのですが、やり方がわかりません。

write文を使うというデバッグ方法には戻りたくないので、gdbで解決したいのですが、いかがなものでしょう?

Aベストアンサー

もしお使いのコンパイラが g77 であれば、ことは簡単にはいかない
ようですが、方法が無いわけではなさそう。

http://www.la.utexas.edu/lab/software/devtool/gnu/g77/g77_554.html
http://www.fuw.edu.pl/~pliszka/hints/c++f77.html


でも、コンパイラに次第で簡単に行く場合もあるらしいです。
例えば Solaris で動くらしい Fortran90 コンパイラ NAGWare f90 Compiler では、

http://www.nag.com/doc/inun/nc21/solng_un.txt

という具合に、割と普通にいけるらしい。

参考URL:http://www.fuw.edu.pl/~pliszka/hints/c++f77.html


このカテゴリの人気Q&Aランキング

おすすめ情報