[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 01/23 11:34 / Filesize : 200 KB / Number-of Response : 550
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれFORTRAN(超初心者用)その3



1 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:55:26 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
pc8.2ch.net/test/read.cgi/tech/1138063703/

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/

36 名前:デフォルトの名無しさん [2007/12/13(木) 11:46:32 ]
*** main program ***
program ex1
implicit real*8(a-h,o-z)
dimension x1(1000000),x2(1000000),y1(1000000),y2(1000000)
dimension z1(1000000),z2(1000000),a1(1000000),a2(1000000)
open(10,file='jegm.txt')
open(11,file='ans.dat')
open(12,file='iti.dat')
open(13,file='ans1.dat')
open(14,file='ans2.dat')
do 30 k=1,144
read(12,*) a1(k),a2(k)
write(13,606) a1(k),a2(k)
606 format(2f16.4)
do 40 i=1,85509
read(10,*) x1(i),y1(i),x2(i),y2(i),z1(i),z2(i)
write(14,605) z1(i),z2(i)
605 format(f4.1,5x,f3.1)
if(a1(k).gt.x1(i).and.a1(k).le.x2(i).and.a2(k).gt.y1(i).and.a2(k).
1le.y2(i)) write(11,610) z1(i),z2(i)
610 format(f4.1,5x,f3.1)
40 continue
30 continue
stop
end


37 名前:29、30 mailto:sage [2007/12/14(金) 00:33:31 ]
>>34
externalが必要だったんですか。

家に環境がないので明日試してみます。


どうもありがとうございました。

38 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 02:00:05 ]
>>37
EXTERNALでもいいが、F90式で行くなら、INTERFACEを書くほうがベター。


39 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 03:56:51 ]
>>38
たしかにそうですね。手抜きを教えてすみませんでした
>>37
パソコンがあればgfortranでちょっとしたテストコードは
試せますよ。Linux,Win始めいろんなOS用のバイナリがある
gcc.gnu.org/wiki/GFortran

40 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 00:25:07 ]
>>36
外側のループを1回終えた時点でjegm.txtのデータを全て読み終えてる。

41 名前:デフォルトの名無しさん [2007/12/19(水) 00:15:39 ]
最近、一番町とかをアメリカ人の男連れがぶらぶらしているが、
米軍の演習でもやっているのか?


42 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:16:28 ]
誤爆したwwwwすまんこwww

ABEND


43 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:36:56 ]
FORTRANの入門書はどこの本屋で売っていますか?w

44 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:38:42 ]
>>43
紀伊国屋や丸善クラスの大型書店 または アマゾン



45 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 11:20:29 ]
人からもらった下のようなプログラムなのですが

program main
implicit none
integer :: dim, hoge
hoge = 1
dim = 1
call sub(hoge, dim)
end program main

subroutine sub(hoge, dim)
implicit none
integer :: dim
integer :: hoge(dim)
print *,"hoge = ", hoge(1)
end subroutine

Intel fortran コンパイラ 10.0でデフォルト設定でコンパイルすると下記のビルドエラーが出ます.

Error: If the actual argument is scalar, the corresponding dummy argument shall be scalar unless the actual argument is an element of an array that is not an assumed-shape or pointer array, or a substring of such an element. [HOGE]

プログラム作成者はCompaq Visual Fortran 6.6でコンパイルして動いたそうなのですが・・・
コンパイルオプション等の指定で解決できると思うのですが,
何かアドバイス頂けませんでしょうか?

46 名前:デフォルトの名無しさん [2007/12/20(木) 12:31:45 ]
>>45
Fortran90的にはエラーだから素直に書き直せw
FORTRAN77的にはありだが。


47 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 12:38:35 ]
>>46
もともとは77で書いてあったコードなんですよね.
説明用のサンプルをいつものくせで90で書いてしまいました.

コードの量が膨大なものでできればそのまま使いたいんですよー
ちなみに再コンパイルするのはCore2Duo用の最適化のためです.
どうか方法教えて頂けませんでしょうか?

48 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 00:58:27 ]
>>47
元コードがF77なら話は通る。
>>45でCVFで通ったと書いてあったが、通るわけないので勘違いだと思っていた。

解決法は簡単で、サブルーチンと呼び出しルーチンを別ファイルにして、分割コンパイルされるように
すればいい。多分、元は別ファイルになっていたのをまとめたりしているのでは?

F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
無いのでエラーは出ないはず。

同一ファイル内に書いてあると、コンパイラが親切にも引数の整合性チェックなどをしてくれる。


49 名前:48 mailto:sage [2007/12/21(金) 01:00:28 ]
ちょっと訂正

>F90ならMODファイルで引数の型や次元などをチェックするが、F77ならリンク時のチェックは何も
>無いのでエラーは出ないはず。

F77なら"分割コンパイル時や”リンク時の引数チェックは何もしないので


50 名前:デフォルトの名無しさん [2007/12/21(金) 09:48:30 ]
F77を使用しています。
データから、2列目の数値のみをメインプログラムに入力したいんですが、
方法がわかりません。
例えば、下のようなデータの2列目のみを取り出すにはどうすればいいんでしょうか。

1.0 2.0 3.0
4.0 5.0 6.0

do 10 i=1,2
read(1,*) x(i),y(i),z(i)
10 continue
とするのは1列目も取り出してるので反則なんです…
read(1,*) (y((i+1)/3),i=2,5,3)
としてもうまくいきません。
超初歩かもしれませんがほんとわからないです。アドバイスお願いします。

51 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 13:59:25 ]
read(1,*)
read(1,*) x(i),y(i),z(i)


52 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:12:39 ]
>>48
ありがとうございました.
解決しました.

53 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 16:55:41 ]
一般的かわからないけど自分はダミー変数作って読み飛ばしてる

do i = 1, 2
read(1,*) xdum, y(i), zdum
enddo


>>51
それって1「行」目を読み飛ばしてるのでは・・

54 名前:50 mailto:sage [2007/12/21(金) 21:29:14 ]
レスありがとうございます。
>>51
「列」方向(縦方向)のデータを取り出す方法なんですが…
>>53
ダミー…考えはしたんですが、いいのかどうか迷ってました。
書いていただいて自信が持てました。ありがとうございます。





55 名前:デフォルトの名無しさん [2007/12/21(金) 22:23:51 ]
F77を使用しています。
出力した値をエクセルに貼り付けたいと思っているのですが、出力方法がコマンドプロンプトに表示する方法しかわからず困っています。
出力した値をメモ帳などに保存する方法はないのでしょうか?


56 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 22:40:56 ]
>>55
WRITE文の出力先をファイルに変更する。

手っ取り早くやりたかったら、リダイレクトで
hoge.exe > output.txt

57 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 23:01:08 ]
>>56
できました!ありがとうございます。

58 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:38:50 ]
常微分方程式y´+y=e^(-x)を
関数 Function f(x,y)
   F=
Return
end

であらわすにはどうしたらいいのでしょうか? 77です。

59 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:11:36 ]
このスレだとPGIコンパイラ使ってる人いそうなのでお聞きします。
ホームを表す~ですが、Intelコンパイラだと解釈してくれますが、PGIだとしてくれませんよね。
何気に不便なのですが、何か方法ないでしょうか?

60 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:33:45 ]
getenv('HOME')

61 名前:59 mailto:sage [2007/12/27(木) 23:25:35 ]
>>60
HOMEには当然ホームの値が入ってますよ(これはコンパイラに拠らないと思いますが)

62 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 02:58:13 ]
fortran90の練習で自分でライブラリを作ってみようとしているのですが、
interface文での総称指定がどうもうまく行きません。
あまりmodule文やinterface文がよくわかっていないのが原因と思っていろいろ調べてるのですが
行き詰ってしまい、ここで質問させてください。
以下のソースだと、コンパイルする段階で
main.o: In function `MAIN__':
main.o(.text+0x11a): undefined reference to `check_vector_int_'
main.o(.text+0x12c): undefined reference to `check_vector_double_'
main.o(.data+0xa0): undefined reference to `check_vector_double_'
main.o(.data+0xa4): undefined reference to `check_vector_int_'
という表示が出てa.outは出てきません

63 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:02:14 ]
module inte !interfaceで総称指定
interface check_vector
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
end subroutine check_vector_double
end interface check_vector
end module inte
module check !引数ベクトルにintとdoubleがある
private
public :: check_vector_int,check_vector_double
contains
subroutine check_vector_int(x)
integer,intent(IN) :: x(:)
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_int
subroutine check_vector_double(x)
double precision,intent(IN) :: x(:)
integer :: i
write(*,*) (x(i),i=1,size(x))
end subroutine check_vector_double
end module check
program main !主プログラム
use inte
use check
integer :: a(5)
double precision :: b(5)
data a/1,2,3,4,5/b/5.0d0,4.0d0,3.0d0,2.0d0,1.0d0/
call check_vector(a); call check_vector(b)
end program main

64 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:09:07 ]
うわ 2chだとタブ文字使えないんですね
ごめんなさい



65 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 13:13:51 ]
全角空白を使うのがお約束みたいね
コピペしたあと再編集が必要なのがめんどいけど

66 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 13:25:10 ]
>>62
module inteの部分を

module inte
use check
implicit none
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
end module inte

として module check よりも後ろに持って行く。
(checkモジュールができるよりも後にコンパイルされるようにする)

または、module checkの先頭部分を以下の様にする。

module check
implicit none
private
public :: check_vector
interface check_vector
module procedure check_vector_int, check_vector_double
end interface check_vector
contains
・・・


67 名前:62 mailto:sage [2008/01/03(木) 16:05:13 ]
>66
ありがとうございます! どちらの方法でもできました!
管理のしやすさなら、後者の方法で書きためて行った方がよさそうですね。
分野毎にmoduleで分けて、1module1ファイルで。

これで大体わかったので、色々と役に立ちそうなものを書いていけます。
ありがとうございました。

68 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 11:55:29 ]
プログラムを実行させてみると
Segmentation fault (core dumped)
というエラーが出て止まってしまいます。
そこで原因を探ろうと
write(*,*)'OK'
見たいなのを打ち込んでいたら、不思議なことにプログラムが最後まで進みました。
変数の値を変更することもしないはずなのになぜおこるのでしょうか?
そしてSegmentation faultが出る原因はどのようにしたらよいのでしょうか?

69 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 19:49:08 ]
不正なメモリにアクセスしにいったときに関係ないデバッグ文で動くようになったりするよ。

宣言文、引数の整合性など、幅広く探すこと。

落ちた場所だけ見ても解決しないことが多いよ。

70 名前:68 mailto:sage [2008/01/08(火) 01:05:36 ]
な、なるほど。ありがとうございました。色々洗ってみることにします。

71 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 14:04:11 ]
教えてください。

FORTRANからC(C++)の関数を呼ぼうとしていますが、文字列の受け渡しがうまくいきません。
開発環境はVisualFortranです。

FORTRAN側のソースコード
---
subroutine hogefor(str1,str2,isw)
!DEC$ ATTRIBUTES C :: hogec
character str1*(*)
!DEC$ ATTRIBUTES VALUE :: str1
character str2*(*)
!DEC$ ATTRIBUTES REFERENCE :: str2
!DEC$ ATTRIBUTES REFERENCE :: isw
call hogec(str1,str2,isw)
return
end

-----------------
C側のソースコード
void hogec(char str1[],char str2[],int isw)
{
  ...
}
-----------------
xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_03_05.htm
このサイトを参考にしましたが、
第1引数と第2引数の文字列の取得ができません。
なにがまちがっているのでしょう。。。
すみません。だれかおしえてください。

72 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:31:13 ]
すみません。まちがえました。
>!DEC$ ATTRIBUTES VALUE :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
です。

だれかおしえてください。。。。

73 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:02:34 ]
INTERFACE文を書いて、仮引数を定義しましょう

74 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 13:46:06 ]
program main
interface
subroutine hogec(str1, str2, isw)
!DEC$ ATTRIBUTES C, ALIAS: '_hogec' :: hogec
character(len=*) :: str1
!DEC$ ATTRIBUTES REFERENCE :: str1
character(len=*) :: str2
!DEC$ ATTRIBUTES REFERENCE :: str2
integer :: isw
end subroutine hogec
end interface
character(len=10) :: s1, s2
s1 = "Hello"C
s2 = "World!"C
call hogec(s1, s2, 123)
end program main




75 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:30:53 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1=0.12

76 名前:デフォルトの名無しさん [2008/01/17(木) 14:32:18 ]
write文に関して質問なんですが
write(15,*)'r1=',r(n)
みたいな文章を書いたとき
r1= 0.12
のように=と数値の間に半角スペースが一つ入ってしまいます。これをなくすことはできないんでしょうか?


途中で投稿してしまいました。すみません。

77 名前:デフォルトの名無しさん [2008/01/18(金) 00:58:57 ]
>>76
FORMATを使え!


78 名前:76 mailto:sage [2008/01/19(土) 00:29:52 ]
な、なるほど。ありがとうございます。色々みてみます。

79 名前:デフォルトの名無しさん [2008/01/20(日) 20:22:50 ]
出力しようとすると、ハンドルされてない例外が発生しました。
ってでるんだけどどうすればいいでしょうか?

80 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:52:10 ]
>>79
エラーメッセージを貼ってくれ。


81 名前:デフォルトの名無しさん [2008/01/20(日) 20:56:09 ]
>>80
コンパイルにエラーはないんですが、出力しようとすると、新しい画面がでてきて、
ハンドル・・・とでるんです。

82 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:47:51 ]
その「新しい画面」の内容を何とか工夫して伝えないと
伝わらないぞ

83 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:09:44 ]
>>81
それがランタイムエラーだっちゅーの。

エラーメッセージは省略せず一字一句表示された通り書け。
使ってるOSとコンパイラの種類もな。

84 名前:デフォルトの名無しさん [2008/01/22(火) 07:41:38 ]
開発環境 :Conpaq Visual Fortran 6
言語Ver :Fortran77+Fortran90(混在状態)
OS :Windows 2000

の上記の開発環境があります。

質問はプログラムを走らせたとき、途中の過程がどこまで行われたか知りたいと考えています。
上記のソフトでFortranを実行したときコマンドプロントが出るのですが、ここに計算課程を表示させたいです。

現在のプログラム内では結果の出力にWRITE文を使用し、OPEN文で出力装置を宣言させています。
私はOPEN文の出力装置の宣言をコマンドプロントに変えることで実行できると考えています。
しかし、出力装置の宣言にコマンドプロントを宣言する方法がわかりません、どなたかご教授お願いいたします。

ちなみに現在は以下のように使用しています。

:
OPEN (5,FIEL = 'OUTPUT.dat')
:
WIRTE (6,*) Func1, Func2,
:

どなたかお願いいたします。



85 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:38:50 ]
>>84
すでに標準出力をデフォの6番に割る振っているのだから、この上5番までも割り振ることは出来ない。
ただ、UNIXとかだとerr出力を割り振ったりできるのでCVFで絶対出来ないとは言わない。
マニュアル読めば出来るかもしれない。

しかし、ここは素直にコピーを作って、それのWRITE(5 をWRITE(6,に置換すれ。
目的はそれで達成できる。
オリジナルをいじると元に戻せなくなるので注意w


86 名前:デフォルトの名無しさん [2008/01/23(水) 14:48:20 ]
>85氏
返答どうもありがとうございました。
指示通り、プログラムのコピーを作成し、マニュアルを探って検証した結果うまくいきました。

方法はすごく単純で、以下のように書き換えるだけでした。

:
OPEN (5,FIEL = 'OUTPUT.dat')
OPEN (6,FILE = 'CON')
:
WIRTE (6,*) Func1, Func2,
:

と書き加えたところ、コマンドプロントへ結果が出力されました。

ご教授ありがとうございます!

87 名前:デフォルトの名無しさん [2008/01/23(水) 15:45:53 ]
f77をしようしています。

2つの整数の約数と、最大公約数と最小公倍数を求めるという
プログラムを書いてもらえませんか?

88 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:48 ]
>>87
最大公約数 最小公倍数 fortran でググレ

89 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:51:56 ]
>>87
素直に宿題で出ました。困ってます
と書いたら、誰か書くかも。

90 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 00:00:34 ]
宿題は自分でやれ

91 名前:88 mailto:sage [2008/01/27(日) 14:55:01 ]
>>87
最大公約数 最小公倍数 fortran でググったのか?
検索結果の一番上に出てくるが。

92 名前:デフォルトの名無しさん [2008/01/28(月) 17:49:50 ]
自分も宿題なんですけど質問します
数値積分で、n個の台形の総和で近似する場合のプログラムなんですけど、
繰り返し文使いますよね?
DOからCONTINUEの間に、面積の総和をSWA、何番目かの台形の面積をSとして
SWA=SWA+S
って書き込みました
SWA=0.0みたいにSWAを初期化する言葉は必要ですか?
家のパソコンではプログラミングできないので教えてください

93 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:38:46 ]
FORTRAN の仕様としては初期化は必要ないが、
中には 0 初期化してくれないコンパイラもあるので
初期化しておいた方が無難。

94 名前:88 mailto:sage [2008/01/28(月) 21:45:51 ]
>>93
むしろ、subroutine 化したときの暗黙save属性の方が怖くない?
オレは A = A + B 型の処理があれば、
脊髄反射でA = 0d0 を加える癖にしている。



95 名前:92 mailto:sage [2008/01/28(月) 22:19:21 ]
レスどうもです
初期化したほうが良さそうですね
失礼します

96 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:37:58 ]
fortranのプログラムを書くソフトは何を使えばいいのでしょうか?
講義では秀丸をつかってたのですが有料で買えません。
代わりのソフトウェアは何をつかえばいいのでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:49 ]
>>96
汎用フリーエディターなら、TeraPad
www5f.biglobe.ne.jp/~t-susumu/
をよく聞くね。

CPad for Salford FTN77
www.vector.co.jp/soft/win95/prog/se153699.html
なんてどう?

98 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:30:49 ]
>>93
FORTRANの規格では初期値は不定じゃなかったけ?
IBM育ちなので、方言なのかもしれんが。
おすえて。


99 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:53:37 ]
>>97
ありがとうございました。
下のリンクのほうつかってみます。




100 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:57:34 ]
fortran77をダウンロードしセットアップして再起動したのですが、
すべてのプログラムのsalford software というところには
デバッッカー(?)と説明文みたいなものだけでfortran77本体らしきものが
ありません。
何か問題があるのでしょうか?

101 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:55:24 ]
>>100
Cpadを使え

102 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:59:59 ]
本に載っていたコード何ですが文番号やらgotoがいっぱいついていてややこしいので
文番号などを使わない形に書き換えようとしています。
自分でやってみたのですが一部分からないところがあったのでみていただきたいと思います。

103 名前:102 mailto:sage [2008/01/29(火) 16:01:49 ]
    do 90 lz=lun,lup
      do 80 lx=llf,lrg

      if (j.le.0) goto 80
      if (j.eq.i) goto 80
      do 11 jj=1,10
        if (je(i,jj).eq.j) then
         jk=jj
         goto 70
        end if
 11 continue
      do 12 jj=1,10
       if (je(i,jj).eq.0) then

        goto 70
       end if
 12 continue
 70   xj=x0(j)



104 名前:102 mailto:sage [2008/01/29(火) 16:02:19 ]
     if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
      if (i.gt.j) then

        do 555 jj=1,10
        if (je(j,jj).eq.i) then
          j0=jj
          goto 554
        endif
555 continue
554 call actf(i,j,jk,as,ac,gap)

       endif
      else
 85 en(i,jk)=0.d0

   endif
 80 continue
 90 continue




105 名前:102 mailto:sage [2008/01/29(火) 16:10:06 ]
以上が本のコードです。
条件文以外は削除しております。

doループの80,90やgoto80などは何とか分かったのですが
goto70や、goto554がどうなってるのかがさっぱりで・・・
申し訳ないですがアドバイスお願いします。


先ほどの投稿では書き忘れてましたが
最後の方にある文番号85に関しては無視していただいて結構です。
探して見たところどこにもgoto85はなかったので
本のコードにゴミが残っていたと思われます。

106 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:36:49 ]
>>105
f90 を使っていいかどうかと、使用コンパイラーを書こう。
f77 では、cycle exit が(標準では)使えない。

107 名前:105 mailto:sage [2008/01/29(火) 17:57:47 ]
失礼致しました。
一応はFortran77なのですが
コンパイラはg77なのでcycle,exitなどは使えたと思います。

108 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:44:49 ]
85は放置、70はjeを探しているだけなので合併で大丈夫なはず、
554のexit はif構文に無関係

    do lz=lun,lup
     do lx=llf,lrg
      略
      if (j.le.0) cycle
      if (j.eq.i) cycle
      do jj=1,10
       if (je(i,jj).eq.j) then
        jk=jj
        exit
       end if
       if (je(i,jj).eq.0) then
        略
        exit
       end if
      end do
      xj=x0(j)
      略


109 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 18:45:10 ]
      if (gap.lt.dsqrt((ri+rj)*(ri+rj))) then
       if (i.gt.j) then
        略
        do jj=1,10
         if (je(j,jj).eq.i) then
          j0=jj
          exit
         endif
        end do
        call actf(i,j,jk,as,ac,gap)
        略
       endif
      else
       85 en(i,jk)=0.d0
       略
      endif
     end do
    end do


110 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 11:06:40 ]
>>108
11と12のdoループは、
 je=jとje=0の両方が真になることがあれば,合併不可
 常に、少なくとも一方は「10回全て偽」になれば、合併可

111 名前:105 mailto:sage [2008/01/30(水) 16:06:53 ]
返事が遅くなって申し訳ないです。
みなさまレスありがとうございます。
11,12ループの所だけを省略せずに抜き出してみました。
     do 11 jj=1,10
        if (je(i,jj).eq.j) then
         jk=jj
         goto 70
        end if
 11 continue
      do 12 jj=1,10
       if (je(i,jj).eq.0) then
        jk=jj
        je(i,jj)=j
        goto 70
       end if
 12 continue
 70   xj=x0(j)

je=jとje=0の両方が真になるかどうかなんですが
これをみるかぎり、やってることは両方jk=jjを代入してるだけなんで
      do jj=1,10
       if (je(i,jj).eq.0) then
        je(i,jj)=j
       end if
       if (je(i,jj).eq.j) then
        jk=jj
        exit
       end if
      end do
     xj=x0(j)
にしてもいいのかな、と思ったのですが。どうでしょうか?

112 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:26:11 ]
>>111
111のプログラムは間違い。
je(i,7)=j je(i,3)=0 それ以外は偽、のとき、
jkに何が入るべきか、考えてごらん。

je の取りうる値がわからないので、
この部分だけでは判断できない。
多分、合併はダメ。

113 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:24:44 ]
すみません、fortranのプログラムで助けて欲しいのですが

open(50,file='test.txt')
do i=1,ii
read(30,4000)dummy3,(a(i,j),j=1,jj)
write(50,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)
pause

というプログラムの144F8.2について
144を変数として扱いたいのですがどのようにすればよいでしょうか・・・
line=144としたとき
format(A7,'line//F8.2')
format(A7,'line'//F8.2)
などではダメでした。整数だと144F8.2の状態だと問題なく走ります。
お助け下さい



114 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:36:34 ]
すみません、もっと簡略化して以下でお願いします

do i=1,ii
read(40,4000)dummy3,(a(i,j),j=1,jj)
enddo
4000 format(A7,144F8.2)



115 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:11:48 ]
>>113
>>4 内部ファイルを参考にする。
Intel 系コンパイラなら、書式に<>が使える。
number = 144
4000 format(A7,<number>F8.2)

116 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:06:06 ]
俺の方法は
character(len=50):: fmt
integer:: line
write(fmt,*) "A7,", line, "F8.2"
do i = 1, ii
read(40,fmt) dummy3,(a(i,j),j=1,jj)
enddo
てやると思う。

数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。




117 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:45:46 ]
しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw
これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。

漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。
他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw

改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。
文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw


118 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:36:12 ]
良くも悪くも数値計算用言語ですから、
数値を上手く取り扱う方法に目がいって
その辺の所は教科書書く人も勉強する人も興味ない。

119 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:25:45 ]
>>115
>>116
無事にいけました☆本当にありがとうございました!

120 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:55:37 ]
>>118
読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。

まぁ、
1.フォーマット文が文字列や文字変数で与えられる。
2.内部ファイルによって、文字列⇔数値変換が出来る。
という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。



121 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:23:33 ]
執筆者予備軍としての一言

 ・VB やJAVA のようにさまざまな発刊企画があれば、
  上級者向け書籍が作れるが、Fortran では無理。

 ・初心者向け書籍では、内容を厳選するよう要請される。
  頁数を少なく、文字数を少なく、挿し絵を充実、などなど。
  common や内部ファイルは真っ先に削除対象となる。

122 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:27:04 ]
COMMON文の説明なんて要らないから
純粋なFortran95の解説書出してよー
F2003でもいいけど

123 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:55:12 ]
COMMON 文は F77 では必要悪だが
F95 だとバグを産む素でしかない。

124 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:44 ]
>>121
コラムとか付録のサンプルとかで、何とか突っ込んでくれ。




125 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:53:35 ]
動的の説明を書かないにせよ
character(len=20):: fmt
fmt = 'A5,2X,I10'
100 format(fmt)
って例が載っているだけでも、
あーこんな使い方できるんだ〜
って思えるよなあ。

126 名前:118 mailto:sage [2008/02/04(月) 01:00:23 ]
>>120
質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、
より実用的、応用的なプログラムを組んでる人だと思うんだよね。
Fortranは数値計算とセットでやる事が多いだろうから
優秀な大学じゃないと内部ファイルまでやれないよ。
無理してそこまでやっちゃったら、大切な部分が疎かになったり
数%しか単位取れませんでしたとか言う事態になっちまう。

127 名前:デフォルトの名無しさん [2008/02/04(月) 16:50:31 ]
symbol A is not an array

こんなエラーが出るんですが何がいけないんでしょう?

128 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:59:12 ]
シンボルAは配列ではありません

129 名前:デフォルトの名無しさん [2008/02/04(月) 19:58:45 ]
Statement function statement cannot occur here

invalid forward reference to label 117

>>128ありがとうございます
ちなみにこれはどうすればいいんでしょう?

130 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:17:37 ]
>Statement function statement cannot occur here
文関数はここに存在することが出来ません

実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。
配列や関数の引用の書き方が間違っている可能性もある。

>invalid forward reference to label 117
ラベル117の無効な前方参照

文番号117が参照されているが見つからない。


どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので
エラーメッセージは自分でよく読むように習慣づけよう。

131 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:17:27 ]
>>129
>>130氏を補足しよう。

>Statement function statement cannot occur here
これは未宣言の配列を用いるとよく出てくるメッセージだ。
配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。

FORTRAN77では文関数なるものが導入された。
これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか
大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。

実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。
すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので)
上のようなエラーメッセージが現れることになる。



f(i) = 5 * i + 1

これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、
DIMENSION f(10)
i = 1
f(i) = 5 * i + 1
....
のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。


この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、
FORTRAN77初心者を惑わす罠になっている。
これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw


132 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:36:18 ]
>こんなエラーが出るんですが何がいけないんでしょう?

俺なら「おまえの頭」っていうところだけどな


133 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:07:31 ]
>>132
うっせー おまえこそ すっこんでろ!w

ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!

134 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:24:45 ]
FORTRANってなんですか?
アプリケーションを作れたりするプログラミング言語なんですか?



135 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:59:57 ]
科学研究をするログラミング言語です

136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:48:50 ]
Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか?
WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・

137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:42:45 ]
Linuxでやるしかないかな。

だけど、コーディングをLinuxでやる必要はないので、
そんなに大変じゃないと思う。

コンパイルオプションをLinux版に変えるだけで
頑張ってMakefile書くくらいで終わりっしょ。


特にVisual Studio + Intel fortran
から
Intel fortran Linux
に行くだけなら
つまづくこともかなり少ないと思われ。


138 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:16 ]
gcc をクロスコンパイル用にコンパイルしてしまえば
別に Windows 上でも Linux 用のバイナリを作ることはできるが、
Visual Studio 上となると・・・。
自分で makefile 書けば一応いけるのか?
まあ、一番の問題はデバッグが大変ってことか。

139 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:58:55 ]
./a.out


140 名前:136 mailto:sage [2008/02/08(金) 00:16:57 ]
>>137
ということはWindowsとLinux両方買わないといけない、ってことですよね?
コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・

>>138
gccはGNUなだけにその辺偉いのですが、速度が・・・
数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。

141 名前:136 mailto:sage [2008/02/08(金) 00:21:06 ]
今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合
出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?

142 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:52:57 ]
>>140
学術目的ならLinux版は無期限ライセンス版が落とせる。

>>141
普通のEXEバイナリを吐く。



143 名前:136 mailto:sage [2008/02/08(金) 10:07:16 ]
>>142
>学術目的ならLinux版は無期限ライセンス版が落とせる。
↓ですね。
ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm
コンパイラ以外も可とは、気前いいですね。
ただ、いくつかはPage Not Foundになってたりしますが・・・

>普通のEXEバイナリを吐く。
そうですよね、安心しました。
そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ

どうもありがとうございました。勉強になりました。

144 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:45:07 ]
VisualStudioがあるのにIntel C++コンパイラ必要?
Intelのほうが速いから?



145 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:58:28 ]
>>144
FORTRANと組み合わせるならIntelC++の方が楽。
BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。
またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。
無論C++でWin32API叩いたりするならMSの方が有利だろう。

146 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:56:22 ]
>>145
なるほど
thxです

147 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:58:08 ]
かなりどうでも良いことなんですが、
vimで.f90のソースを書いていると、
勝手にインデントをスペースに置き換えられるんですよね。
まあnoexpandtabすればタブ文字で書けるんですが、
syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。
これもsyntaxファイルを改変すれば変えられるのでしょうけど。

fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?

148 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:12:21 ]
常識
1行72文字とか132文字とか制限があるのに
何文字にカウントされるか分からないタブ文字を使うなんて
プラットフォーム依存性を無駄に招いているとしか思えない

149 名前:147 mailto:sage [2008/02/11(月) 20:42:23 ]
>148
なるほど。文字数の制限があるからですね。
fortran90から入ったので、
ほとんど文字制限を気にした事が無かったから気づきませんでした。
ありがとうございました。

150 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:25:04 ]
>>148
> 常識
> 1行72文字とか132文字とか制限があるのに

f90 は自由形式だからその制限は無いはず。
f77 は制限アリ。

151 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:50:24 ]
>>150
文法書をもう一度読め。
Fortran90は132カラムだ。

Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。

それにしてもインデントでタブが入るエディターは本当にむかつく。


152 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:55:05 ]
行頭のスペースを勝手にタブ文字に変えられると「タブ形式」と間違えられちゃうよー

153 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:05:18 ]
少なくとも Intel Fortran は1行の文字制限はないよ。
他のコンパイラも大概独自で対応しているんじゃないかな。

154 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:37:30 ]
NagのFortran Builder という開発環境を使ってる方いましたら、どんなものか教えてくれますか?
ttp://www.nag-j.co.jp/FortranBuilder.htm
他社A他社Bってどこでしょうかね?



155 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:19:44 ]
>>153
まぁFortranの規格はISOが決めているから。
各ベンダーの拡張は拡張として。

Intelは確かに原則制限無し、7200文字のようだ。
>Free Source Form
>In free source form, statements are not limited to specific positions on a source line.
>In Fortran 95/90, a free form source line can contain from 0 to 132 characters.
>Intel Fortran allows the line to be of any length.

>Fortran source line length
> fixed form: 72 (or 132 if /extend_source is in effect) characters;
>free form: 7200 characters


156 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:54:10 ]
目が悪くて文字解像度をあげられず、
エディターの一行表示上限が94文字しかないオレ様にしてみれば、
132文字も7200文字も無限と同じ。

157 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:17:43 ]
makedepf90、Windowsでビルドできないかなぁ。
みなさんオブジェクトの依存関係とか、どうやって調べてますか?

基本的に1ファイルに1個モジュールで書いてるから
use文を抽出さえすれば簡単にできそうか

158 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:40:42 ]
うほっ!
前スレに自己出力プログラムが出ていたが、俺も作ってみた。
IntelFortranで確認した。
一応F90の規約にのっとっている。以前上げられていた奴より分かりやすいのではと思うが如何?
ここでCHR(39)は『'』。

CHARACTER(LEN=68)::f
f='("CHARACTER(LEN=68)::f"/"f=",3a/"PRINT f,CHAR(39),f,CHAR(39)"/"END")'
PRINT f,CHAR(39),f,CHAR(39)
END



159 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:52:02 ]
Vistaで使えるフリーのfortran90コンパイラってありますか?

160 名前:デフォルトの名無しさん [2008/02/13(水) 17:24:29 ]
どうやってもこのエラーが消えないけどどうしたらいいんだろう?

assignment between arrays of differing rank

161 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:38:11 ]
>>159
Vista + Cygwin + gfortran or g95

162 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:50:54 ]
>>159
Silverfrost の FTN95 かな。Vistaで動くかは知らんがw
ttp://www.silverfrost.com/11/ftn95/overview.asp

>>160
配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。


163 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:44:10 ]
FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように
使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ
で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい)
のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、
a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って
書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m
program test
implicit none
integer,parameter::m = 1
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou)::data(m)
call dataset(data,m)
write(*,*) data(1)%a(1)
write(*,*) data(1)%l(1)
end program
subroutine dataset(data,m,n)
implicit none
integer,intent(in)::m,n
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou),intent(out)::data(m)
data(1)%a(1) = 3.0d+00
data(1)%l(1) = 2
return
end

164 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:23:42 ]
>>163
記憶が正しければ、それはFortran95以前では出来ない。
TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。
Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな?
ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して
あとは残りのルーチンでそれをUSEすればよいと思う。

MODULE m_type
IMPLICIT NONE
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(out)::data_(m)
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
(以下略  (ここではm_typeをカスケードに呼んだが



165 名前:デフォルトの名無しさん [2008/02/17(日) 11:02:41 ]
スレチと思うけど質問させてください。
計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって
何て言う名前ですか?フリーウェアですか?

166 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:10:40 ]
>>165
それはジョブ管理システムというものだ。
ググレばなんか出てくるだろう。

普通はメーカー毎・OS毎に独自のものがある。
LinuxとかだとLSFというのが主流の気がする。
UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。


167 名前:165 [2008/02/17(日) 14:40:22 ]
>>166

ググって色々調べてみたところ「Generic NQS」ってのが
フリーみたいですね。
自宅で数値計算をして遊んでみようと思いまして(;^_^A
どうも返答有り難うございました。

168 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:25:42 ]
Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。
プロトタイプができているので、興味がある人は見てみてください。
ttp://d.hatena.ne.jp/fortran66/

やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、
普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。

変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。
大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと
思っています。




169 名前:163 mailto:sage [2008/02/17(日) 23:44:38 ]
>>164 さん
丁寧なご回答どうもありがとうございます!! 返信が遅くなり
申し訳ございません。今、intel fortran compiler 10.1 で
メイン部分を下記にして動くことを確認できました。
Fortran2003で導入される機能ということで驚いています。

program test
use m_subs
implicit none
integer,parameter::m = 1
type(kouzou)::data_(m)
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
end program


170 名前:163 mailto:sage [2008/02/17(日) 23:45:55 ]
実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の
サイズ n を下記のように入力データのようなものから動的に取得して
構造体の確保を実現させようと考えておりました。
下記のようなプログラムの構造体バージョンが目標でした。
下記の配列バージョンだと確保した配列全部をサブルーチンの
引数でひきずっていかなければならないと思うのですが構造体で
定義しておけば配列をパックにした構造体 1 つを引数で渡せると
考えました。
164 さんに教えて頂いたプログラムの MODULE m_type での
構造体の中の要素のサイズ n は、動的(データで決定)ではなく
parameter 文で静的にコンパイル時に確定させなければ
ならないんですよね?
長々と書いてしまって申し訳ありません。m(_ _)m

171 名前:163 mailto:sage [2008/02/17(日) 23:46:47 ]
program test
implicit none
integer::m,n
read(5,*) m,n
call test2(m,n)
end program
!
subroutine test2(m,n)
implicit none
integer,intent(in)::m,n
real(8),allocatable::a(:,:)
integer,allocatable::l(:,:)
allocate(a(n,m),l(n,m))
call dataset(a,l,n,m)
write(*,*) a(1,1)
write(*,*) l(1,1)
deallocate(a,l)
return
end
!
subroutine dataset(a,l,n,m)
implicit none
integer,intent(in)::m,n
real(8),intent(out)::a(n,m)
integer,intent(out)::l(n,m)
a(1,1) = 3.0d+00
l(1,1) = 2
return
end

172 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:32:34 ]
>>170 そういうことなら、以下のように出来る。
MODULE m_type
IMPLICIT NONE
type kouzou
real(8), POINTER::a(:)
integer, POINTER::l(:)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
implicit none
integer,parameter::m = 1
INTEGER :: n = 2
type(kouzou)::data_(m)
ALLOCATE(data_(1)%a(n), data_(1)%l(n))
call dataset(data_,m)
(以下略
ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。

173 名前:163 mailto:sage [2008/02/18(月) 14:44:48 ]
>>172 さん、本当に感謝です!! 上手くいきました。
ありがとうございます!! m(_ _)m
下記にすることで動的に確保できました。
上手い方法があるもんですね...
ただ、指摘された以下の場所は、私が試したところでは、inout で
なくても OK でした。
type(kouzou),intent(out)::data_(m)
あと、解放ですが deallocate(data_) 一発で OK?

program test
use m_subs
implicit none
type(kouzou),allocatable::data_(:)
integer::i,j,m,n
read(*,*) m,n
allocate(data_(m))
do j = 1,m
do i = 1,n
allocate(data_(j)%a(i),data_(j)%l(i))
end do
end do
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
deallocate(data_)
end program

174 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:43 ]
>>173
多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。
Fortran2003で可能になる機能だが実装されている。

>あと、解放ですが deallocate(data_) 一発で OK?
多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。
少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ




175 名前:163 mailto:sage [2008/02/19(火) 00:01:59 ]
>>174
構造体とポインタの使い方が分かって非常にためになりました。
ありがとうございます。色々と変えてみて試してみます。m(_ _)m


176 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:37:08 ]
単精度をコンパイルオプション一発で倍精度にすることってできますか?

177 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:59:45 ]
>>176
> 単精度をコンパイルオプション一発で倍精度にすることってできますか?

コンパイラは何?

178 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:01:57 ]
>>176
一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。

IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々
容易い道ではない。


179 名前:490 mailto:sage [2008/02/27(水) 02:25:14 ]
ちょっとずれた質問かもしれませんが、
皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか?
わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが...
最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。
Cだとcscopeとか便利なツールがあるみたいなんですが...

180 名前:デフォルトの名無しさん [2008/02/27(水) 13:43:03 ]
>>176
intel fortran だと、 -r8 で一発、
fujitsu だと -RR8 かなにか、でまぁとにかく一発。
念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、
適当に1000回くらいiterateする短いコードを
最初から倍精度で書いたやつと、
単精度で書いたコードをオプションつけてコンパイルして計算したら、
計算の結果はbinary で一致した。
ほかのコンパイラでも似たようなもんだろう。


181 名前:176 mailto:sage [2008/02/28(木) 20:15:57 ]
>>178
Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。
autodblはHPやIBMのコンパイラでの名前みたいですね。

>>180
さすがにロードモジュールはバイナリ一致じゃないですよね。
わざわざ調べて頂いてありがとうございました。

182 名前:180 mailto:sage [2008/02/29(金) 13:13:23 ]
>>181

べっ、別にあんたのためになんたらかんたら。

昔作ったのをもっかいコンパイル&実行してみただけ。
intel fortranはまめにバージョンを上げてくれてありがたいんだけど、
時々挙動が変わるからね。以前やったときはできあがった実行ファイルも
同一になったよ。バージョンによっては実行ファイル作成時の日時が
格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても
同一でない実行ファイルが出来ることがあったけど。
今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。


183 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:24:30 ]
>>182
うわ、ツンドラだツンドラだ

184 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:19:56 ]
>全く同じファイルを全く同じオプションでコンパイルしても
>同一でない実行ファイルが出来ることがあったけど。
「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ

IntelFortranは今10.1だっけ?




185 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:27:05 ]
Windowsの実行形式ファイルのヘッダには作成日時が入る箇所があるので、
IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば
同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。

ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html

まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で
同じ内容かどうかは判断できると思うが。

186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:48 ]
Debian+gfortranでやっています。
勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。

program test
implicit none
real y
y=hoge(3.0)
stop
end

real function hoge(x)
real x
hoge=2.0
return
end

コンパイルするとy=hoge(3.0)のところで、
Function 'hoge' at (1) has no IMPLICIT type
といわれます。どのように対処すればよいのでしょうか。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:51 ]
>>186
IMPLICIT NONEなのに関数hoge()の宣言がないから。
対処法としては
・関数hoge()を主プログラムtestの内部手続きにする。
・testの中にhoge()のINTERFACE宣言を書く。
・hoge()を含むMODULEを作る。
など。

188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:47:26 ]
real hogeをtestで宣言するかimplicit noneを削れ


189 名前:デフォルトの名無しさん [2008/03/07(金) 00:40:07 ]
ここって、Linux環境でのFortranのインストールの仕方って
質問していいんでしょうか?

Linuxの方でも場違いな気がいたしまして。。

190 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:18:17 ]
>>189
GCC入ってないのか?

191 名前:デフォルトの名無しさん [2008/03/07(金) 14:40:22 ]
えっと、説明不足ですみません。
ここで質問してもいいかわかりませんが、とりあえず
Intel Fortran を Ubuntuにインストールしようとしたのですが、

まず、Ubuntuにデフォルトで開発環境が入っていないとか
libstdc++.so.5が
libstdc++5 だという話は解決したのですが、

コンパイラ、デバッガのインストールが終わって
Please Enter to Continue

Enter
を押しても、反応がなく、ただ改行する所で止まってます。

いろいろ調べて、Ubuntuのコミュニティで同様の投稿があったのですが、
なんだかよくわからず。(英語のページだからというのもありますが。。)

Intelが発表している内容は、
ifort とかのファイルにある
"/bin/sh"を"/bin/bash"に書き換えろとか書いてあるんですが、
すでに書き換わっていたりして。

もうお手上げです。。。

助けて下さい。。よろしくお願いします。

192 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:53:48 ]
>>191
> インストールしようとした

どうやって?

例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、
展開して出来たl_fc_p_10.1.011_ia32に移動して、
install.shを実行したということ?
ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま
インストール出来るのだろうか。

私はalienでdebに変換してインストールした。

193 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:28:14 ]
HPUX上の fortran90 にて

プログラムコードに”program main”と書かないと実行時に
/usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'.
って表示されるんですが、”program main”を省略出来ないのは何故でしょうか?

何か環境変数で設定すればよきに計らってくれるのでしょうか?

194 名前:デフォルトの名無しさん [2008/03/07(金) 20:25:15 ]
>>192
仰るとおり、install.shからです。

intelのインストーラが起動すると、
ubuntuではg++が入ってないと出来ないとは書いてましたが、
debとかrpmという言葉は出てきませんでした。

宜しければ、どうやってインストールされたか
詳しく教えていただくと有難いです。。



195 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:57:43 ]
>>194
私はDebianは使っているけど、Ubuntuは使ったことがない。
以下はDebian使いの私のインストール方法なので、Ubuntuに
そのまま適用出来るかどうかは知らない。また、あくまで私のやり方なので、
もっと楽なやり方があれば指摘して欲しい。

$ tar zxf l_fc_p_10.1.013_ia32.tar.gz
$ cd l_fc_p_10.1.013_ia32/data
$ fakeroot -u alien intel-ifort101013-10.1.013-1.i386.rpm
$ fakeroot -u alien intel-iidb101013-10.1.013-1.i386.rpm
$ su
# dpkg -i intel-ifort101013_10.1.013-2_i386.deb
# dpkg -i intel-iidb101013_10.1.013-2_i386.deb
# cd /opt/intel/fc/10.1.013/bin
ifort, ifortvars.csh, ifortvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/fc/10.1.013に置換する。
私の場合、viで開き、
:%s/<INSTALLDIR>/\/opt\/intel\/fc\/10.1.013/g
を実行した。
# cd /opt/intel/idb/10.1.013/bin
idbvars.csh, idbvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/idb/10.1.013に置換する。
ログイン時に上の*vars.shか*vars.cshファイルを読みこむように、
シェルの設定ファイルを変更する。私の場合はbashを使っているので、
~/.bashrcに
. /opt/intel/fc/10.1.013/bin/ifortvars.sh
. /opt/intel/idb/10.1.013/bin/idbvars.sh
を追加した。


196 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:03:43 ]
>>193
考えにくいな。もっと詳しく。
最小例で。


197 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:28:57 ]
>>195 さん
ありがとうございます。
実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。
195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。

僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、
その対処法がなくストップしてしまいました。

つまり、<INSTALLDIR>の置換操作が出来なかったところです。

あと、ログイン時に読み込むファイルの設定の仕方がとか、
そういったファイルの場所がわからなくて、困っていました。

やはり普通に実行しては無理っぽいんですね。
ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。


どうやら、問題はLinuxの操作の知識不足にあるようですから。。。


198 名前:192,195 mailto:sage [2008/03/08(土) 02:08:25 ]
>>197
さようなら。


199 名前:デフォルトの名無しさん [2008/03/08(土) 11:49:08 ]
サブルーチンsabuで計算結果をディスプレイに一行出力するのですが、
open文の後ではその出力がなぜかNANになってしまいます。


program main
implicit real*8 (a-h,o-z)

call sabu(1.0, 2.0)
call sabu(1.0, 2.0)
open(unit=24, file='gomi.txt', status='unknown')
call subu(1.0, 2.0)
call sabu(1.0, 2.0)
close(24)

stop
end


のように呼ぶと、必ずopen文の次から全てNANになります。
sabuの引数を変えたり、open文の装置識別子やファイル名を変えてみてもダメでした。
また、open文前後のsabuをcallする回数を変えてもダメでした。

sabu中では何個かのサブルーチンをcallしていて、その中でopen文は合計1行だけあります。
その装置番号は2で、装置識別子が重複しているわけでは無いようです。


原因は何でしょうか?宜しくお願いします。
cygwinでg77を使っています。
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

200 名前:デフォルトの名無しさん [2008/03/08(土) 11:59:22 ]
今の時代FORTRAN使うメリットってあるんですか?

201 名前:デフォルトの名無しさん [2008/03/08(土) 12:29:51 ]
TSS

202 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 12:35:40 ]
>>199

sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる?

sabu() の中身が分からないので何とも…。

203 名前:199 mailto:sage [2008/03/08(土) 14:30:47 ]
>>202
レス有難うございます。
sabu()中で、

open(2,file='input.dat',status='old')

に続いて、read()した後close()があり、

write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'

とwriteで挟んでみたところ正しく表示されるので、
close文は実行されているのだと思います。

204 名前:199 mailto:sage [2008/03/08(土) 14:31:49 ]
担当の先生によるとsabu以下は公開してだめだそうで、
一部を以下に写してみます(中略が要領を得ないときはご指摘ください)
cccccccccccccccccccccccccccccccccccccccc
subroutine sabu (xvalue,zvalue)
implicit real*8 (a-h,o-z)
< 中略(commonとdimension) >

open(2,file='input.dat',status='old')
< 中略(doとcontinueに挟まれてread) >
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
call sub1
<中略(ifとdoに挟まれて変数へ代入)>
call sub2(x,eps)
write(*,2000)(df(i),i=1,10)
2000 format(10e15.3)

return
end



205 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:49:47 ]
よくわかりませんが、
mainとsabuでそれぞれにopen文があるので多重openになっていませんか?

206 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 23:50:39 ]
>>204
情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が
あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。


207 名前:199 mailto:sage [2008/03/09(日) 11:51:38 ]
>>205
レス有難うございます。
今writeでデバッグした限りですが、同じファイルを2回openはしてないように見えます。

流れとしては、メインprogramから、
open(unit=24, file='gomi.txt', status='unknown')

サブルーチンをcall

open(2,file='input.dat',status='old')

close(2)

サブルーチンからreturn

close(24)
となっています。


>>206
レス有難うございます。
アドバイスの通りg77で'-fno-automatic'を付けてみたらNANが無くなりました!

www-jlc.kek.jp/~fujiik/mklinux/memo/g77/porting3-j.html
>-fno-automatic: を指定すると、変数を static にアロケート します。
>これは、全てのルーチンに SAVE を付けるのと同値です。

大変感謝です。2週間これで詰まってました。
sabu含むすべてのサブルーチンでSAVEはありませんでした。

208 名前:206 mailto:sage [2008/03/09(日) 16:16:07 ]
>>207
解決おめ。
少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、
サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。

FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが
出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、
FORTRAN66では未定義かな?

しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、
かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。

Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、
毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に
非数値的なビット列(NaN)のごみが入っていたりする。

昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。
メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。

というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw


NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので
推論した。


209 名前:デフォルトの名無しさん [2008/03/10(月) 21:14:08 ]
初めまして。超初心者なんで宜しくお願いします。
使っている環境はF90 g++ debian です。

以下 ソースです
program dotp4
implicit none
real(8), allocatable :: u(:), v(:) !allocatable属性を付けて割り付け配列を宣言
integer :: n
write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
read (*,*) n
allocate (u(n), v(n)) !nを用いて配列の割り付けを行う
write(*,'(a\)') 'input u(1 : n)'
read(*,*) u(1 : n) !配列uの要素の値を読みとる
write(*,'(a\)') 'input v(1 : n)'
read(*,*) v(1 : n) !配列vの要素の値を読みとる
write(*,*) 'dp = ' , dot_product(u,v) !内積の計算
deallocate (u ,v)
end program dotp4

エラーは (col. 23) remark: LOOP WAS VECTORIZED.
です。
DO 文でベクトルを使うと大抵この文がでて来ます。

どうぞ宜しくお願いします (ちなみにallocateが赤くなりません)

210 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:22:28 ]
>>209

> write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)

ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。

211 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:50:00 ]
>>209
>エラーは (col. 23) remark: LOOP WAS VECTORIZED.
>です。

これはエラーじゃない。リマークであって、警告ですらない。

単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。
つまりSSEを用いた最適化をしたという事を教えてくれている。

初心者なら、気にしなくてよい。


212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 08:32:04 ]
>>211

そのリマークってオプションなしのコンパイルでも出るんでしょうか?

213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:48:37 ]
>>212
処理系によって違うのでマニュアルを読んでもらうのが一番確実。
たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、
オプションを指定しないと何も言わない。

一般的に言えば、error, warning, info ( ここでは remark ) のような、
おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進 
にあたるメッセージをデフォールトで言う。

うざいならオプションで抑止できるのが普通。
まぁコンパイラのオプションの説明嫁。



214 名前:デフォルトの名無しさん [2008/03/11(火) 15:47:45 ]
>>210
>>211
ありがとうございます。
ちゃんと実行できました!
remarkはエラーでは無いんですね。把握しました。
精進します



215 名前:デフォルトの名無しさん [2008/03/13(木) 03:18:38 ]
教えて下さい。
0の二乗が正しく計算できません。
なぜでしょうか?
MacOSXでもg95で同じような計算結果になります。

プログラム hoge.f95
program hoge
write(*,*) 0**2, 0.e0**2, 0.d0**2
end program hoge

以下、コマンド
> g95 hoge.f90

> a.exe
1 1. 1.
> g95 -v
Using built-in specs.
Target:
Configured with: /src/G95/gcc-4.1.2/configure --prefix=/mingw
--enable-languages=c --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as
--host=i386-pc-mingw32 --enable-threads --disable-nls
--disable-win32-registry --enable-sjlj-exceptions --enable-libgcj
--without-x
Thread model: win32
gcc version 4.1.2 (g95 0.91!) Feb 7 2008

環境
Windows XP Professional Service Pack 2

216 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:25:15 ]
>>215

> MacOSXでもg95で同じような計算結果になります。

MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。

217 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:11:50 ]
>>215
おまい、質問が下手だなw
うまい質問をするとうまい答えが返ってくるし、まずい質問をするとまずい答えしか返ってこないぞよ。

とにかくそれだけでは答えようが無い。

218 名前:215 [2008/03/17(月) 02:47:25 ]
>>216
マカーの友人もTigerだそうです。
コンパイラのバージョンを教えてください。

>>217
他にどういった情報が必要でしょうか?
分かりにくいということですか?
この問題を解決したいので教えてください。

この「0の巾乗が計算出来ない」という問題はあまり有名ではないのでしょうか?
a=0.のときに
a**2が計算できないのは致命的なバグなような気もします。

周りのg95ユーザに聞いても解決しませんでした。
(やはり、他のシステムでも0の巾乗は計算出来ていません。)
ちなみに私は普段はgfortranをvine上で使っていますが、このような結果にはなりませんでした。

219 名前:216 mailto:sage [2008/03/17(月) 05:38:14 ]
>>218
同じソースを g77 でコンパイルしても正しい結果が出た。ln -s hoge.f95 hoge.f で偽装(?)した。

% ./a.out
0 0. 0.

gfortran は試してない。fink でやったら簡単だけど、意義を感じない。
因みに g95 と gfortran のどっちが良さげ?>識者の皆様


> MacOSXでもg95で同じような計算結果になります。
はヲマイがやったんぢゃないのか?自分で確認したことと、他人に聞いた事は切り分けてクレ。


% g95 --version
G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)
Copyright (C) 2002-2005 Free Software Foundation, Inc.

----------

% g77 --version
GNU Fortran (GCC) 3.4.4
Copyright (C) 2004 Free Software Foundation, Inc.

220 名前:215 [2008/03/17(月) 14:13:34 ]
>>216
ありがとうございます。
わかりにくくて申し訳ありません。
MacOSXは友人がやりました。

g95(windows),gfortran(vine),ifort(ubuntu)は私がまわしました。
(ifortでも同じプログラムを回してみました。)
gfortran,ifortは正しい結果が得られます。
g95だけ正しく計算できません。
バージョンの問題でしょうか?
友人にバージョンを聞いてみます。

221 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:57:57 ]
>>220
The G95 project にバイナリが色々置いてあったので試してみたら

Stable Version (G95 (GCC 4.0.3 (g95 0.90!) Jul 27 2006)) だと
0 0. 0.

になったが、
Current Snapshot (G95 (GCC 4.0.3 (g95 0.91!) Feb 27 2008)) だと
1 1. 1.

になった。

-S オプションでアセンプリ出力を見てみると
いきなり定数の 1 を書き込んでいるようなので
コンパイラのバグだろうな。

まあ、Snapshot なんでバグの1つや2つ有るだろう。
Stable Version の方を使うかバグ報告出して直してもらえ。


>>219
ちょっと前まではg95の方が安定してたような気がする。
でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
こちらの方が一般的になるのだろうな。
#それにたしかg95の方はまだOpenMPに対応してなかったはず。

222 名前:216 mailto:sage [2008/03/18(火) 17:47:26 ]
> >>219
> ちょっと前まではg95の方が安定してたような気がする。
> でも最近はGCC4に対応してgfortranが標準で付いてくるLinuxが増えたので
> こちらの方が一般的になるのだろうな。
> #それにたしかg95の方はまだOpenMPに対応してなかったはず。

有り難うございます。確かに最近導入したLinuxはほぼ gfortran が付いていますね。
g95 は付いて無いですが。私は並列はしないので、OpenMP は対応していなくても
良いのですが、周りから聞かれたら gfortran の方を勧めることにします。

223 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 21:13:10 ]
Windowsで使う分にはg95も手軽でいいんだがな。

224 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 14:46:06 ]
>>222
できるよ。
以上。
はい、次。



225 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 21:02:15 ]
ん?

226 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 00:26:18 ]
$OMP imifu

227 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 01:48:45 ]
本当に初心者なのですが失礼します
分関数定義文について勉強してるんですが、
プログラムが読めても、作れないくらいのレベルです

文関数定義分を使って、関数f(x)=x^2+x+1を  
0≦x≦1の区間について、0,1ごとにxを変化させた場合の
結果を出力するプログラムを作りたいのですが、
わかる方いましたらお願いします

228 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 13:49:39 ]
>>227
ドイツとかフランスで教育を受けた人?小数点がそっち風なんですけど
FTN77で作動確認、間違ってたりナンセンスでも許してね。
      DO 10 I=0,10,1
      X=0.1*I
      Y=F(X)
   10 WRITE (6,20) X,Y
      STOP
   20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
      END
C
      FUNCTION F(X)
      F=X**2+X+1
      RETURN
      END

229 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 21:00:37 ]
志村ー、文関数!文関数!

230 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 22:13:38 ]
文関数はobsoleteで、今は使えてもいずれ使えなくなる筈。

231 名前:志村228 mailto:sage [2008/04/01(火) 22:26:01 ]
間違えちまっただ〜
      F(X)=X**2+X+1
      DO 10 I=0,10,1
      X=0.1*I
      Y=F(X)
   10 WRITE (6,20) X,Y
      STOP
   20 FORMAT(1H ,' X = ',F4.1,2X,'Y = ',F6.3)
      END

232 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 23:00:00 ]
>>230
心配すんな!
obsolete指定されても大概のコンパイラは機能を残すから。
今までもそうだったし、これからもそうだろうw

Fortranは、地層が積み重なった言語で面白い。直交性の悪さが自然言語っぽいw


233 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 00:01:34 ]
Fortran95の廃止事項もほとんどの処理系で残ってるからなぁ

234 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 01:03:12 ]
とは言え初心者に廃止事項を進めるわけにもいかんだろ
お行儀の良いコーディングした方がバグは減るだろうし



235 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 13:09:47 ]
FORTRAN77で書かれたサブルーチンプログラム(sub.for)を
fortran90のメインプログラムmain.f90で呼び出して使うにはどうすれば良いのでしょうか。
コンパイラはg95/cygwinを使ってます

236 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:17:15 ]
テスト

237 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:34:30 ]
>>235
g95 main.f90 sub.for

ぢゃだめなん?(めんどくさいので、確認はしてない)

238 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:00:33 ]
>>237
レスありがとうございまs
私も並べてコンパイルすれば良いと思ってたんですけど駄目でした。
main.f90の中にuse文を作れば良いのでしょうか?

239 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:16:59 ]
>>238
1.EXTERNAL文で外部関数であると表明する。
2.INTERFACE BLOCKでINTERFACEをちゃんと書く。
3.MODULEの中に置いて、USE文で引用する。

1から3の順で面倒くさいが、F90的にはこのましく行儀よくなる。

240 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:06:08 ]
>>239
すみません、折角頂いたアドバイスを理解しきれていないのですが
sub.forの中身をfortran90で書き直して、モジュール化するということですか?
77のままでは無理でしょうか?粘着に質問してしまい恐縮でs

241 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:47:43 ]
>>240
1.
PROGRAM f90
IMPLICIT NONE....
EXTERNAL f77noName....
....
CALL f77noName...
...

2.
PROGRAM f90
IMPLICIT NONE
INTERFACE
SUBROUTINE f77... 云々
END INTERFACE

MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko

PROGRAM homosexual
USE unko
IMPLICIT NONE

CALL f77(....)

END


242 名前:241 mailto:sage [2008/04/10(木) 00:49:04 ]
すまん 行Overで肝心の3番を消してしまった。
スレ汚しご容赦。

3.
MODULE unko
CONTAINS
subroutine f77(....)
.....
end
END MODULE unko

PROGRAM homosexual
USE unko
IMPLICIT NONE

CALL f77(....)

END


243 名前:240 mailto:sage [2008/04/10(木) 09:32:50 ]
おお!うまくいきそうです!
ご教授どうもありがとうございます!!

244 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:16:37 ]
質問です。read文で数字の羅列とコメントで構成されたテキストファイルから値を読み取ろうとしています。

OPEN (3,FILE='a.dat',STATUS='OLD')
.....
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
READ(3,*)
READ(3,*) FTMP
READ(3,*)
......
という感じです。読み込むファイルの方はテキストで
.....
FNUM=
1.5E16
DTM=
0.5E-6
FTMP=
303.
......
というようになっています。ところが、他の値と同じように読み込んでいるのに

FNUM=
1.5E16
DTM=
0.5E-6

のところだけうまく読み込めず、値が0になってしまいます。何度も確認しましたが、ちゃんとその場所を読んでいるはずですし、
別の場所で代入していたりはしません。しょうがないので、テキストの末尾に読み込めなかった値をダブって記入し、
そこから読み込むとうまく読めました。ひとまずこれで問題はないのですが、原因が思い当たらずあまりにも気持ち悪いので、
思い当たる原因があれば教えていただけないでしょうか?よろしくお願いします。



245 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:01:04 ]
>>244
これだけでは情報が足りない。
もう少しkwsk


246 名前:244 mailto:sage [2008/04/14(月) 18:09:41 ]
えーと、すみません。普段数式の部分しかいじってないものでFORTRAN自体の
知識があまりないのでどのあたりが必要な情報なのかいまいち分からないのですが、
とりあえず計算用のコードで、パラメータの設定をソースコードと分離したくて

SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....

FNUM=1.5E16
DTM=0.5E-6
....

のような記述を

SUBROUTINE PARAMETER
COMMON /COMP / FNUM,DTM....

OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
....

と、以下のようなtxtファイル

FNUM=
1.5E16
DTM=
0.5E-6
....

の組み合わせで行うようにしたいのです。で、問題は前レスに書いたようなことなのですが、他に必要な情報ありますでしょうか?

247 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:07:47 ]
245ではないが、やってみた。

$ cat test0415.f90
PROGRAM TEST0415
OPEN (3,FILE='a.dat',STATUS='OLD')
READ(3,*)
READ(3,*) FNUM
READ(3,*)
READ(3,*) DTM
CLOSE(3)
WRITE(*,*) FNUM
WRITE(*,*) DTM
PROGRAM TEST0415

$ cat a.dat
FNUM=
1.5E16
DTM=
0.5E-6
$ gfortran --version
GNU Fortran (Debian 4.3.0-3) 4.3.1 20080401 (prerelease)
Copyright (C) 2008 Free Software Foundation, Inc.

$ gfortran -o test0415 test0415.f90
$ ./test0415
1.50000004E+16
4.99999999E-07
$
ということで、問題無く読めた。


248 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:21:33 ]
>>247
> ということで、問題無く読めた。

ということはコンパイラ依存か?
>>244 はそういう情報を出していないし。

249 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:35:39 ]
>>247
えーと、すみません、基本的には問題なく読めるのですが、全く同じやりかたを
してるはずの別の行で、何故か値がおかしくなる部分が存在するんです。
ここには書ききれませんでしたが本当はもっと膨大な値を読み込んでます。

>>248
コンパイラはSalfordFTN77ですが、別のコンパイラでやっても同じ結果になります。

250 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 14:52:33 ]
>>249
「値がおかしくなる」ための条件を自分で見付け出して。
サブルーチン内で正しく読めているか確認。そして、呼び出し元の
メインプログラムで同じ値を返すか確認。
問題の提示が曖昧でどうにもできない。


251 名前:244 mailto:sage [2008/04/18(金) 16:50:45 ]
>>250
うーん、多分なんですが自己解決しました。読み込みの都合上、
a.datの中では、読み込みの都合上(DO文で回すためです)
使わない要素にもダミーの数値を入れてたんですが、
COMMON文のがわで、「使わないんだからいいだろ」と思って
ダミーの文まで次元を用意してませんでした。
要するに存在しない配列の要素に数値を代入してました。
つまり

LIM(1,1)=10
LIM(1,2)=10
TEMP(1)=273

LIM(2,1)=20
LIM(2,2)=20
TEMP(2)=0←ダミーの数値

っていう場合に、

COMMON/SURFACE/LIM(2,2),TEMP(1)

としてました。

COMMON/SURFACE/LIM(2,2),TEMP(2)

にしたら直ったようです。ダメだったんですね…

252 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 02:48:59 ]
>>251
その説明ではよく分からんが、COMMONは記憶領域の共有であって、
グローバル変数だと思っていると正しくない。

COMMONの最後の要素の長さが違うだけなら、問題は起きないと思うが
(これは無名COMMONだけだったか?最近COMMONを使わないから細部を忘れた)
途中の要素の長さを変えたらそこから先の番地が全部ずれることになる。

253 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:25:11 ]
integer hoge(100)と宣言すると1が始点になり、hoge(1)〜hoge(100)までのメモリが確保されますが、
hoge(0)はどこかを指しているんでしょうか?
hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?

254 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 18:49:45 ]
>>253
> hoge(0)=123と代入しても特に怒られなかったのですが、やらないほうがいい行為でしょうか?

そりゃやらん方がえぇ。そもそもソレをする事にどんな意味があるの?
そういうのは C でも怒られないよね。で、メモリ絡みのバグに繋がるんだっけ?

コンパイラによるけど、定義範囲外にアクセスしたときに(プログラムを)強制中断するオプションがある。



255 名前:253 mailto:sage [2008/04/22(火) 22:27:34 ]
>>254
やはりそうですよね、常識で考えれば・・・
pgi6.4です。普通にコンパイルできて、結果も問題なかったんですが、アレって思いまして。

256 名前:254 mailto:sage [2008/04/23(水) 13:20:16 ]
>>255
文法上の違反ではない(はずだ)からコンパイルは出来る。
コンパイルオプションで警告を出すようにでもすれば、何
か言われるかもしれないが、何も付けなければ、文法上の
問題が無いからスルー。実行結果まで保証しない。

257 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:25:28 ]
2次元座標(x,y)を(r,theta)に変換する関数って用意されてないですか?
atan(y/x)とyの符号で場合分けしてましたが

258 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:01:36 ]
F77の勉強始めて3日目のの初心者なんですが、練習にオセロのプログラムを作ろうとして行き詰まってます。

BAN(8,8)の数列で、オセロのマスを指定してるんですが、あるマスBAN(m,n)に石を置いた時にその周り8方向のマスを調べる方法がわかりません。
だれか教えてください。

259 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:54:16 ]
>>255
Fortranはスピード優先なので、配列のはみだしは普通チェックしない。
コンパイラの実行時オプションでチェックするように出来るのが普通だが、あくまでデバッグ用の位置づけ。
今の場合、配列をはみだして他の変数を上書きしている可能性が高い。
MAPオプションでメモリー上に変数がどうアロケートされているかを調べれば、どの変数が壊されているか
見当がつく。

>>257
そういう関数はFortranの標準には無い。
今の場合、ATAN(y/x)よりもATAN2(y、x)を使うほうが適切、X=0.0の場合の0割エラーなどを避けられる。
詳しくはマニュアル味噌。

>>258
素直に前後左右斜めを調べるしかないべ。
DO i=-1,1
DO j = -1,1
CALL check(ix + i, iy + j)
END DO
END DO
枡をはみだす端っこの処理を簡素化するには、配列を0〜9までで宣言して端っこマスは
別途の方法で処理するとかできる。空=0、白=1、l黒=2、マスの外=−999とか。


260 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:51:47 ]
>>259
atan2なんてあったんですね!ありがとうございました。

261 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 17:00:17 ]
form指定子のunformattedとbinaryはどちらが推奨とかあるんですか?
unformattedは機種依存みたいだから、やっぱりbinary?

「Fortranのunformatted=バイナリ」と勘違いしてる人もたまに見かけますが
確かに紛らわしいところだと思いますが、どういう経緯でそういう仕様になったのだろう・・・

262 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:52:06 ]
>>261
普通に数値ファイルなどをシーケンシャルに読み書きするなら UNFORMATTED のほうがいいと思う。
ここでUNFORMATTED の SEQUENTIAL FILE は、改行コードが入っている。

DIRECT ACCESS の場合はベンダー依存だが、トランスパレントにべた書きされていることが多いと思う。
本来はランダムアクセスのためのファイル形式だが、レコード長を1BYTEに指定して順繰りに読んでゆく
ことで binary の代用に出来ることが多い。

昔のマンガや映画でコンピュータがガタガタ磁気テープをアクセスしているのは、DIRECT ACCESS で
ランダムアクセスしてデータを読み出しているところと思われる。

binary は、本当に改行コードなども含めてトランスパレントな生のデータが欲しいときに使うものなので
UNFORMATTED と直接比較されるものではないと思う。

ついでにいうと binary は Fortran2003 で導入される規格で、Fortran95までではコンパイラー側の拡張になっているはず。


歴史的には、文字コードも、数値フォーマットも、1ワードのビット数も機種依存だったので、
UNFORMATTED を機種依存と責めるのは可哀想です。

たとえていうなら、『僕の肛門もEBCDIC(K)をぶち込まれそうです(><;』といった感じ。


263 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 10:39:23 ]
改行コードって、一行のバイト数合計値を一行の前後にサンドイッチするやつだよね?
od -t x4で覗いたら、この値って4バイトだけど、これだと一行4Gバイトまでしか書けないことにならない?

264 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 11:14:27 ]
>>263
処理系依存だろうけど、今まで一語4バイトが主流だったから、そのくらいなんじゃない。
10年位前まではスパコンでも1配列のMaxが4Gだったし。




265 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 15:07:14 ]
>>264
そっか
でもそろそろ拡張してもいいような

266 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 23:34:36 ]
アナル拡張


267 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 13:05:57 ]
*

268 名前:助けてください [2008/04/29(火) 14:17:32 ]
あの〜私FORTRAN90初心者なんですが、ガウスの消去法のプログラムを作りたいのですが、
どなたか簡単に作っていただけないでしょうか?
ちなみに格子点の間隔は0.25で格子点9個です。
時間が無いので本当にお願いします。




269 名前:助けてください [2008/04/29(火) 14:51:02 ]
マルチポストしています。


270 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 16:05:54 ]
>>268 ググレカスでございます
www.tnb.sd.kanagawa-it.ac.jp/home/lec/FEM/fortran.html

271 名前:デフォルトの名無しさん [2008/04/29(火) 19:02:53 ]
複素数のべき乗の計算はどのようにすればいいのでしょうか

272 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 00:52:00 ]
>>271
複素数の実数べきか?実数の複素数べきか?


273 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 10:28:55 ]
いえ10の100乗のタンジェントです

274 名前:デフォルトの名無しさん [2008/05/06(火) 01:05:31 ]
行列を作って対角化するプログラムを作っています。

行列を作るプログラムが動いたので
それをサブルーチンに入れると
コンパイルできるのですが、実行すると
Segmentation fault (core dumped)のエラーが出ます。
行列の大きさは1000×1000です。

試しに行列のサイズを小さくすると350×350では動きました。

使ってるOSはvistaでcygwin上でg77でコンパイルしています。
メモリは2Gです。

行列サイズを大きいままで動かすことはできないでしょうか?



275 名前:274 [2008/05/06(火) 01:07:44 ]
行列を作るプログラムは
1000×1000でもちゃんと動きます。

276 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 03:06:32 ]
>>274
これだけでは、なんとも言えんなw
g77だから動的にメモリー取ったりはしていないんだろうし?

とりあえず、
-fbounds-check
-ffortran-bounds-check
この辺のオプションで配列はみだしチェックを。



もう少しヒントを呉。 
たとえば行列は実対称の単精度の密行列で、ライブラリはLAPACK、呼んでるルーチンは、某。
呼び出し行は
CALL xxxxx(xxxxxx)
使用変数の宣言行は、カクカクしかじか
REAL H(1000, 1000), xxxxxxxxxxxx
ぐらいあるとありがたい。


277 名前:274 mailto:sage [2008/05/06(火) 04:16:04 ]
>>276
-fbounds-check
をオプションにしてコンパイルしたらエラーは出ませんでした
コンパイルしてできたexeを実行したら
Segmentation fault (core dumped)のエラーが出ました
配列のはみ出しチェックのしかたがよくわからないのですが
これでいいんですかね?

あと行列は実対称の倍精度です。
今は対角化する以前の段階でプログラムは以下のような感じで作っています。

implicit none
integer m
parameter (m=1000)
real*8 a(m,m)
 ・・・

call matrix(a,m,mm ・・・)
write(*,*) mm
 (mmは実際に行列が書かれている行数)
stop
end

subroutine matrix(a,m,mm ・・・)
implicit none
integer m, mm, ・・・
real*8 a(m,m), b(m,m), ・・・
 ・・・
(行列を作る)

return
end

278 名前:274 mailto:sage [2008/05/06(火) 04:22:23 ]
上のようなプログラムです。
subroutineに入れなければm=2000でもきちんと動いたのですが
入れるとコンパイルはとおりますが
実行するとSegmentation fault (core dumped)のエラーが出ます(上に書いたとうりです)
このくらいの情報でよろしいでしょうか?
足りないのなら付け足します。
よろしくお願いします。

279 名前:274 mailto:sage [2008/05/06(火) 17:18:06 ]
自己解決しました。
subroutine の中の大きい行列(>>277のa(m,m)、b(m,m)など)全部を
メインプログラムので定義してやるとm=1000でも動きました。
subroutineの中にだけでかい行列を何個も定義したらダメなんですね。
知らなかった。

280 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 18:48:57 ]
>>279
それは多分スタックオーバーフローだな。
g77エラーメッセージは不親切だな。


281 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 19:02:33 ]
>>277
よく分からないのだけど mm はメインで定義しなくてイイの?


282 名前:274 mailto:sage [2008/05/06(火) 21:25:45 ]
>>280
スタックオーバーフローと思います。
今まででかい行列はメインで定義しないと
スタックからあふれるということを知らなかったです。

>>281
すいません、メインでmmは定義してます。

283 名前:281 mailto:sage [2008/05/06(火) 22:25:27 ]
下のコードを g77 でオプション無しでコンパイルした時も
-ffortran-bounds-check を付けてコンパイルした時も
正常に動作したけど。もぅワカリマセン。

program call_matrix
implicit none
integer m ,i ,j
parameter (m=1000)
real*8 a(m,m)

call matrix( a, m )
do i = 1, m , 1
do j = 1, m , 1
write(*,*)"a(",i,",",j,")=",a(i,j)
end do
end do
stop
end program call_matrix

subroutine matrix( a, m )
implicit none
integer m, i,j
real*8 a(1:m,1:m), b(1:m,1:m)
do i = 1, m , 1
do j = 1, m , 1
a(i,j) = dble( i+j )
b(i,j) = dble( i*j )
end do
end do
return
end subroutine matrix

284 名前:274 mailto:sage [2008/05/07(水) 04:21:21 ]
>>283さんのプログラムをg77でオプション無しでコンパイルして実行したところ
Segmentation fault (core dumped)のエラーが出ました。
mの値を変えてコンパイルして実行を繰り返したところ
m=509以上だとSegmentation fault (core dumped)のエラーがでます。

何か異常があるんですかね?

関係あるかどうかわかりませんがcygwinで ulimit -a を実行した結果を下に書きます。

core file size (blocks, -c) unlimited

data seg size    (kbytes, -d) unlimited

file size        (blocks, -f) unlimited

open files      (-n) 256

pipe size (512 bytes, -p) 8

stack size (kbytes, -s) 2033

cpu time (seconds, -t) unlimited

max user processes (-u) 63

virtual memory (kbytes, -v) 2097152




285 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:54:02 ]
>>284
509 * 509 * 8byte(倍精度) = 2,072,648 なので virtual memory の
MAX超えてるのかもしれんな。Cygwin はよく知らんが、こんな小さい初期値なのか?


286 名前:285 mailto:sage [2008/05/07(水) 09:55:53 ]
ごめんw 
よく見たら単位が kbytes だったw
だからメモリーはまだ余裕だwwwwww

287 名前:281 mailto:sage [2008/05/07(水) 12:09:31 ]
コンパイラを変えてみたらどうでしょうか?
g95 と gfortran くらいしか思いつきませんが。

288 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:16:23 ]
配列サイズを引数で渡さずにサブルーチン内で定義すれば?
んで、common 文をつかって、コンパイラに
「いちいちallocateしなくてもいいよ」と教えてあげる。
「common文は使っちゃだめ教」があるのは知ってるけど
試してみてちょ。


289 名前:288 mailto:sage [2008/05/07(水) 16:16:54 ]
program call_matrix
implicit none
integer m ,i ,j
parameter (m=1000)
real*8 a(m,m)
common /gyouretu/ a ! <-- ここ加えた
call matrix( )   ! <-- ここ変えた
do i = 1, m , 1
do j = 1, m , 1
write(*,*)"a(",i,",",j,")=",a(i,j)
end do
end do
stop
end program call_matrix

subroutine matrix( ) ! <-- ここ変えた
implicit none
integer m
parameter (m=1000) ! <-- ここ加えた
integer m, i,j
real*8 a(1:m,1:m), b(1:m,1:m)
common /gyouretu/ a ! <-- ここ加えた
do i = 1, m , 1
do j = 1, m , 1
a(i,j) = dble( i+j )
b(i,j) = dble( i*j )
end do
end do
return
end subroutine matrix


290 名前:288 mailto:sage [2008/05/07(水) 16:19:57 ]
あと、関係なとは思うけど多重ループはこの例の場合、
ループ制御のincrementalの整数は
内側をi
外側をj
にする習慣を付けていた方が良いよ。知ってたらごめん。



291 名前:288 mailto:sage [2008/05/07(水) 16:25:02 ]
コンパイル通らなかったw
サブルーチンの中でmを2回定義しているから後のはとってね。
自分の所の g77 on linux (バージョン不明) だと動いたよ。
がんばってね。

292 名前:288 [2008/05/07(水) 16:48:44 ]
更にお節介。
parameter文で定義した変数を
subroutineの引数に使うのはよした方が良いよ。

・・・・ cygwin 最近使ってないなぁ。
274さんはhostのOSは何?もうvistaに対応してる?

293 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:10:04 ]
OS :Windows Vista
gfortranをインストールしてコンパイルしようとしたのですが、
下記のようなメッセージが出てコンパイルできません。
ld: crtbegin.o: No such file: No such file or directory
どうすれば、コンパイルできるようになりますか?

294 名前:293 mailto:sage [2008/05/07(水) 18:20:36 ]
下記のページを参考にして、コンパイルを行いました。
ttp://www.esst.kyushu-u.ac.jp/~space/kumashiro/fortran.html



295 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:41:31 ]
>>293
可能性は3つある。
インストールしたバイナリに問題がある。
インストール方法に問題がある。
コンパイルしようとしたプログラムソースに問題がある。

あとは任せた。君なら出来る。

296 名前:281 mailto:sage [2008/05/07(水) 19:11:08 ]
>>292
> 更にお節介。
> parameter文で定義した変数を
> subroutineの引数に使うのはよした方が良いよ。

ココ詳しく。実はよくやってます。

297 名前:293 mailto:sage [2008/05/07(水) 19:35:54 ]
>>295
g95をインストールしてコンパイルしたら、できました。
ありがとうございました。

298 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 11:51:23 ]
>>296
281さんが例として出したプログラムだと問題ないんだけど、
何かの拍子にサブルーチン内でmの値を変更してしまう場合にややこしい。
おおざっぱに言って、メインレベルで定義された固定変数はコンパイラによって
m = 1000 の代入処理+メインレベルでmが変更されていないかを監視するだけか、
前処理の段階でメインレベルでの変数mを1000に置き換えるかのどちらかをするんだけど
前者の場合、副プログラムで値が変わる場合までチェックしないので面倒。たとえば
parameter(m=1000)
call foo(m)
write(*,*) m
で副プログラムfoo中でm=1という代入文があるばあいに結果が保証されなくなっちゃう。
出力はコンパイラによって1000だったり1だったり、浮動小数点なら値がエンディアンレベルで壊れていたりする。
ぜったいmを副プログラムで変えない(intent文でチェックするとか)ならいいけど、
習慣として引数渡しせずに副プログラムでも
parameter(m=1000)と定義してやった方が安全。
mの値の変更はたいていのエディタなら一括置換で出来るしね。
あるいはm2=mとかして非固定変数に値を移してからそれを引数にするとかすると良いと思う。
似た理由で
do i = 1, 100
call foo(i)
enddo
みたいにループ制御の(整数)変数も引数に使わない方が安心。
あくまで「安心と安全」という気分の問題だけどね。コードが大きくなるとデバッグするときに
こういう部分ががボディブローよろしく効いてくるので。老婆心。

299 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:09:15 ]
100×100くらいの大きな対称行列の逆行列を求める方法を探しています。
どのような方法が一番精度が良いでしょうか?お知恵をお貸し頂ければ幸いです。

300 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:46:45 ]
>>299
対象の行列に因ると思う。実対称とか色々。
私は考えるのがメンドーなので lapack に丸投げしてるが。


301 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 20:59:38 ]
lapack 丸投げでいいと思う。
lapack は誤差減らす工夫してたと思うし。
対称行列なら対角化を経由する方法がいいかと。
数値誤差で対称性がくずれるなんてこともないし。
三角行列で扱うから。

302 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 22:23:14 ]
やっぱ極力ライブラリ使うべきだよね
大抵のはあるし

303 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:02:12 ]
Fortranでは何次元配列で何要素数あつかえるのでしょうか。
メモリとCPUによる?

ちなみにFloatの4次元で、130559044000個(1ファイルで50GBのデータサイズ)を処理したい。

304 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:16:18 ]
確実にメモリには載らない。

1. 小出しに処理する
2. 圧縮する

のどちらかになるな。



305 名前:299 mailto:sage [2008/05/12(月) 04:37:39 ]
300,301,302さん、レスどうもありがとうございます。
自分の素人っぷりが恥ずかしい限りなのですが
扱う行列が倍精度でもLAPACKで大丈夫でしょうか?
何はともあれ、試行錯誤してみます

306 名前:助けてください [2008/05/13(火) 13:59:50 ]
今FORTRANで「ガウスの消去法のプログラムを作れ」とのことなのですが、サブルーチンを
使ったプログラムが作れません。ALLOCATABLEを使ったプログラムなら作れたのですが、誰か
ひとつ例として作って頂けませんか?お願いします。

307 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:29:56 ]
>>306
宿題スレではないぞよ。

308 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:48:18 ]
では宿題スレを紹介してください

309 名前:299 mailto:sage [2008/05/13(火) 19:27:04 ]
>>305
DSYTRF、DSYTRIを使ったのですがうまくいきませんでした ...orz

310 名前:300 mailto:sage [2008/05/13(火) 19:47:51 ]
>>309
DSYSV で B = 単位行列ってしたらダメ?やったコト無いけど(私は固有値問題しか解かないし)。
上手くいかないというなら何が可笑しいか。INFO の値は? 多くの場合、INFO=0 は正常終了の筈。
man を見る限り、DSYTRF は目的に合ってないように思うが、それはきっと私の気のせいだ。

ということで、もちっと何か晒せません?(差し障りの無い範囲で)

311 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 23:47:10 ]
>>310
丁寧な指導ありがとうございます。

いま扱っている対称行列Aは倍精度で、次元が40×40です。
各要素の値には8桁ぐらいのバラつきがあります。
DSYSVでAX=EとなるようなXを求めて、その後実際に
matmulでAXの積を計算して出力しているのですが
対角部分以外の値が全く0に近づきません。
infoは0で出てきてます。
WinXp、cygwin、g95でやってます。これがまずいのでしょか

312 名前:300 mailto:sage [2008/05/14(水) 00:21:48 ]
>>311
dsysv() から出た後の A が最初の A のままという保証は無いような。その所為では?
つまり dsysv() の中で A の中身が書き変わっている可能性がある。
だとしたら AX =E が成立しなくても可笑しくはない。

313 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 00:29:11 ]
説明不足ですみません。
DSYSVにはAをコピーしたA'を入力しています。
matmulには元のAを使っています。


314 名前:300 mailto:sage [2008/05/14(水) 00:41:25 ]
B (input/output) DOUBLE PRECISION array, dimension (LDB,NRHS)
On entry, the N-by-NRHS right hand side matrix B. On exit, if
INFO = 0, the N-by-NRHS solution matrix X.

だから、実行前に A のコピーを取って(C とでもする)、実行後に B と C の積を見れば?
やってみたら A の中身変わってた。あと (2,2) の実対称でやったら、ソレっぽい結果が出てた。

まぁアレだ、頑張れ。



315 名前:313 mailto:sage [2008/05/14(水) 02:03:19 ]
>>300
アドバイスどうもありがとうございまs。
もすこし頑張ってみます

316 名前:名 無し [2008/05/14(水) 18:06:09 ]
質問があります。
linux上でFortran77を使えるようにするにはどうすればいいのですか?
何かインストールすべきコンパイラがあったりしたら教えて下さい。

317 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:00:21 ]
>>316
大抵のディス鳥はg77が含まれているだろうから
$ which g77
で見つからなかったら

# yum install gcc-g77
とか
# apt-get install gcc-g77
とか
# yum install compat-gcc-34-g77
みたいな感じで。

318 名前:名 無し [2008/05/15(木) 15:47:37 ]
>>316
$ which g77で見つかったんですけど開けませんでした・・・

319 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:24:18 ]
>>318
which g77 で見つかったなら、Fortran77が使える準備が出来てるってことよん。
g77は開くものじゃない。

320 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:15:39 ]
fortranってブール型ないんですか?

321 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:21:57 ]
>>320

つ LOGICAL

322 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:03:44 ]
>>321
あったんですか、失礼しました
今まで0、1をfalse、trueとしてやってて、なんかかっこ悪いなぁと思ってまた。というか危険ですよね

ありがとうございました

323 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:46:14 ]
初歩的な質問で申し訳ないのですが。
資料を読み込む時、上からのn行が全ていりません場合はどうすればいいのですか?
僕はこう考えますが:

open(unit=10,file=filename,access="sequential",status="old")
do while( .true. )
read(unit=10,fmt="???",iostat=status)

???のところをいじればいいのですか?
それとも何か他の書き方にした方がいいのですか?

324 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:37:39 ]
>>323
DO i = 1, 10
READ(10, *)
END DO




325 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 12:50:03 ]
DO i = 1, 10
READ(10, *)
END DO
はどこに入れますか?

これで10行までの資料が読まれるけど保存されてないですよね?
僕はn行まではいらないけが、
n+1以後の資料はちゃんと読まれて配列に保存したいんです。

326 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 19:09:07 ]
fortran90で、ターミナルへの出力を一旦停止して、
例えば1分後に再開するという感じにしたいのですが
これは pause を使ってできますか?
pause だけだと、何か入力しないと再開しないのですよね?
僕は1分後に自動的に再開したいんです。

327 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 00:44:47 ]
>>325
DO i = 1, n
READ(10, *)
END DO
DO
READ(10, *, IOSTAT = io) a, b, c
IF (io == -1) EXIT
END DO

io = -1 は End of File


>>326
Fortranの規格の範囲内では基本的には無理。
空ループをまわして、DATE_TIMEで時間を監視してやれば出来ないことは無い。
しかしCPUが無意味に使われるのでお勧めできない。

ただコンパイラの多くは SLEEP() 関数等を用意しているので、マニュアルのコンパイラ独自拡張の所を
よく読めば出来る可能性が高い。またはライブラリなどの外部ルーチンを呼ぶという方法も無くは無い。
難易度はやや高い。


328 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 09:35:10 ]
>>326>>327

call system( ' sleep 60 ' )

ってダメかな?

329 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:37:59 ]
>>327, 328
どうもありがとうございます。がんばってみます。


330 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:31:19 ]
ファイルをEOFまで読む場合、read文にend=99とかして飛ばすようにすればできますが、
行番号使うのはあまりスマートじゃないし、基本的に使うべきじゃないですよね。
他の方法ってないでしょうか?

331 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 01:00:15 ]
>>330
>>327に出ている。
IOSTATの番号は機種依存だが、EOFの-1は確定と見ていい(これが規格に定められて
いるのか、慣習なのかよく分からんw)

それと行番号差別はよくない。行番号だっていい子なんだw
使いたいときは使うがいい。

あとFortran2003では、定数としてEOFやEOL等が定められている。

332 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 17:31:23 ]
fortranってスコープ内のローカル変数とかって作れないんすかね?

333 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 18:48:12 ]
>>332
サブルーチン化する

334 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:12:51 ]
NaN を代入したいときってどうしたらいいですか。
たとえば function を作るとき、定義域外の引数を受け取ると NaN を
返すようにしたいんです。
ゼロで割り算すると NaN が返るけど、コンパイラによってはエラーや
警告が出るのでそれは避けたい。



335 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:47:24 ]
>>334
PROGRAM NAN
IMPLICIT NONE
REAL(4) :: a
! 12345678901234567890123456789012
a = TRANSFER(B'01111111100000000000000111111110', 0.0)
PRINT *, a
STOP
END PROGRAM NAN

a には NaN が入る。NaN は指数部が全ビット立っていて、仮数部が0以外なので
単精度の場合はこれでいい。endian の違いによらないように左右対称にしてみたw

TRANSFER関数を使えば任意の型の中に任意の型での値を入れられるので
それを用いればよい。ここでは2進表現の整数を入れたが、別に文字列とかでもいいので、
たとえば倍精度で64こ0と1を並べる必要も無い。


336 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:51:54 ]
>>332
Fortranではスコープ内のローカル変数は無い。
というかスコープという概念は無い。


もともとのFortranは暗黙の型宣言がなされているので、宣言にこだわる必要は無い。
一方Fortran90以降では、ALGOL/Pascal/Modulaの系列の影響を受けたので、
宣言部はプログラム頭部に集中される。

スコープなどは忘れて、早く暗黙の型宣言を信仰するんだ。
最近の言語では型宣言の省略が流行り始めているので、一周遅れでTopに立てるww


337 名前:335 mailto:sage [2008/06/04(水) 00:57:48 ]
補足

PROGRAM NAN
IMPLICIT NONE
REAL(4) :: a
REAL(8) :: d
a = TRANSFER(-1_4, a)
d = TRANSFER(-1_8, d)
PRINT *, a, d
STOP
END PROGRAM NAN

実行結果 by Intel Fortran
NaN NaN
Press any key to continue . . .

ここで -1_4 と -1_8 はそれぞれ4バイトと8バイトの整数の -1 。
2の補数表現なので整数の -1 は全ビット立ってる。


338 名前:334 mailto:sage [2008/06/04(水) 07:51:04 ]
>>337
ありがとうございます。やってみます。
助かりました

339 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 18:46:57 ]
character*3 str
str='ABC'
print *,str(1:1)
とすると、Aが出力されますが、

character*3 str(1)
str(1)='ABC'
print *,str(1:1)
とすると、ABCが出力されます。

これはどういう仕組みでこうなるんでしょうか?
characterは文字の配列で実現されているんですよね?

340 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:19:30 ]
後者だと str は大きさ1の1次元配列で、配列の各要素は長さ3の文字列。

341 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:24:53 ]
>>339
>characterは文字の配列で実現されているんですよね?
ちがう。
それはCとかのやり方。

character*3 str(1)
これは>>340が書いているように長さ3の文字型の全要素数1の配列の宣言。

そこでやりたいことは、これで実現される。
PRINT *, str(1)(1:1)

むろん
PRINT *, str(1:1)(1:1)
でも同じこと。

部分文字列は定数でも指定出来る。
print *, 'abe-san'(1:3)

これは
abe
を出力する。

マニュアルをよく読み返すことをおすすめする。
Fortran90では文字列操作の便利な関数が増えたので読み甲斐ある。


342 名前:339 mailto:sage [2008/06/06(金) 21:33:39 ]
>>340,341
ありがとうございます。Cとは違うんですね。

Fortranって文字処理苦手な印象持ってましたが、最近は違うんでしょうかね

343 名前:デフォルトの名無しさん [2008/06/07(土) 02:04:05 ]
FORTRAN90の質問です。
初心者なので課題が手につきません。お願いします。
「うるう年のプログラム」
「2次方程式の判定プログラム」


344 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 04:00:31 ]
>>343
Fortran ResQ 閏年
fortran 方程式の実数解
でググレ



345 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:14:49 ]
>>343
先生に聞けよ、授業料払ってるんだろ。

346 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:32:43 ]
>>343
うるう年の方。結果を確認していないw

PROGRAM leap
IMPLICIT NONE
INTEGER :: iy
LOGICAL :: qleap
PRINT *, 'INPUT YEAR'
READ *, iy
qleap = .FALSE.
IF ( MOD(iy, 4) == 0 ) qleap = .TRUE.
IF ( MOD(iy, 100) == 0 ) qleap = .FALSE.
IF ( MOD(iy, 400) == 0 ) qleap = .TRUE.
IF ( qleap ) THEN
PRINT *, 'LEAP YEAR'
ELSE
PRINT *, 'ORDINARY YEAR'
END IF
STOP
END PROGRAM leap



347 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:42:58 ]
>>343
二次方程式の分類
一切チェックをしていないw 英語は適当www

PROGRAM quadratic_eq
IMPLICIT NONE
REAL :: a, b, c, d
PRINT *, 'INPUT A, B, C OF A QUADRATIC EQUATION AX**2 + BX + C = 0.'
READ *, a, b, c
d = b**2 - 4.0 * a * c
IF ( a == 0.0 ) THEN
IF ( b == 0.0 ) THEN
IF ( c == 0.0 ) THEN
PRINT *, 'UNDETERMINABLE' ! a=0, b=0, c=0
ELSE
PRINT *, 'INCONSISTENT' ! a=0, b=0, c/=0
END IF
ELSE
PRINT *, 'ONE NON-DEGENERATE SOLUTION' ! a=0, b/=0
END IF
ELSE
IF (D > 0.0) THEN
PRINT *, 'TWO REAL SOLUTIONS' ! D > 0
ELSE IF (D < 0.0) THEN
PRINT *, 'TWO COMPLEX SOLUTIONS' ! D < 0
ELSE
PRINT *, 'TWO-FOLD DEGENERATE SOLUTIONS' ! D = 0
END IF
END IF
STOP
END PROGRAM quadratic_eq


348 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:39:33 ]
>>346
オマエさん、凄くいい奴。改訂ユリウス暦ってのもあるんだな。
(第三条件:西暦年を900で割った余りが200または600になる年は閏年)
出題者は、グレゴリオ暦と正確に指示しているんだろうか?
「明治31年勅令第90号に基づき閏年を判定するプログラムを作成すること」
というマニアックな教師がいたら嫌だな。

349 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:51:19 ]
>>347
IF の分岐、上手いね。不定・不能まで判定してやるとは、さすが。
EPS で0判定したいところだが、READ なら不要かな?

350 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:57:12 ]
BASICかと思ったぜ
FORTRAN90なのか

351 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:59:14 ]
>>347
追加演習問題として、次のようなのはどう?
「数学的には重解になるが、自らのプログラムで重解と判定されない
 二次方程式の係数を一例あげよ。」

352 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:00:47 ]
>>350
PRINT とあるとBASIC っぽいが、宿題レベルなら十分だろうね。

353 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 04:17:23 ]
>>351 ぐはw 
0.1 2 1.0 で既に重根判定が崩れているw 0.125 2.0 8.0 とか二進法での有理数なら大丈夫なんだがw
a==0.0の類もどうかと思ったが、EPSILONとか使うと初心者らしくないかと思ってチョンボしたが、
Dは掛け算の後の引き算があるから避けられないなw

PROGRAM quadratic_eq
IMPLICIT NONE
REAL :: a, b, c, d
WRITE(*, *) 'INPUT A, B, C OF A QUADRATIC EQUATION AX**2 + BX + C = 0.'
READ(*, *) a, b, c
d = b**2 - 4.0 * a * c
IF ( a == 0.0 ) THEN
IF ( b == 0.0 ) THEN
IF ( c == 0.0 ) THEN
WRITE(*, *) 'UNDETERMINABLE' ! a=0, b=0, c=0
ELSE
WRITE(*, *) 'INCONSISTENT' ! a=0, b=0, c/=0
END IF
ELSE
WRITE(*, *) 'ONE NON-DEGENERATE SOLUTION' ! a=0, b/=0
END IF
ELSE
IF (D < EPSILON(0.0) ) THEN
WRITE(*, *) 'TWO-FOLD DEGENERATE SOLUTIONS' ! D = 0
ELSE IF (D > 0.0) THEN
WRITE(*, *) 'TWO REAL SOLUTIONS' ! D > 0
ELSE
WRITE(*, *) 'TWO COMPLEX SOLUTIONS' ! D < 0
END IF
END IF
STOP
END PROGRAM quadratic_eq

354 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 04:27:57 ]
0.1 2 1.0 →0.1 2.0 10.0 の間違いw

PRINT * はデバッグの時使うと便利。
普通のコンソール出力をWRITE(*,*)で書いておけば、後からデバッグ用出力を消し忘れることが無い。
READ * もたまに便利。

一応、宿題なので初心者っぽく、ちぐはぐなところを演出してみましたw

>>348
グレゴリオ暦のうるう年のアルゴリズムを確認しにWikipediaを見たときに、下のほうに改訂ユリウス暦と
いうのがあったので嫌な予感がしたがw やはりそう来ますかw



355 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 06:10:32 ]
>>353
ダメじゃん、学生さんに考えてもらわないとw

初心者だと整数と決め込んでしまいがちだから、
試行錯誤してもらえるかなと。
「丸め誤差に対する考察と、プログラム改良とその改善効果の提示」
A4一枚にまとめてもらえると、講師冥利につきるね。
学年に数人はそういう学生さんがいてほしいな。

不能・不定は、数学的な気配りがないと見過ごしがちだから、
考慮していない学生さんもいるだろうね。

丸め誤差は、数値計算の経験がないと気付かないから、
IF文を習ったばかりなら配慮できっこないねw

356 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 06:18:01 ]
>>353
さらに追加演習問題(表現は曖昧)として、次のようなのはどう?
「この二次方程式に解がある場合、その解を出力するように改造せよ。
 相異なる二つの実数解をもつ場合、
 数学的な厳密解と出力した実数解との誤差が大きい
 二次方程式の係数を一例あげよ。」

倍精度実数型や計算手順配慮の必要性を
学生さんに感じてもらえるかな。

357 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:42:46 ]
丸め誤差ってコンパイラオプションによっては違った結果になるよね
あんま気をつけたことはないけど、精度命な人はその辺も考えてるのかな

358 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:45:04 ]
文を改行後も続ける場合、&を行末に付加するって仕様、早く直らないかなぁ。
面倒で仕方ない。

359 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:57:27 ]
>>358

昔のように頭の方に継続記号を入れろってことか?


360 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:34:06 ]
考えようによってはCみたいに文末ごとに ; を付けるよりよっぽどお手軽だぞw

361 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:06:47 ]
>>358
Fortran文法は行番号があって,しかも予約語がない

end
= 1 +
end
print *,
end,
end;
end

とか

do
10
do=
10,
10
10
end
do
end

いや聞くだけでわくわくする文法ですね

362 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:42:13 ]
PASCALとかCとかって終端文字;を書くのがめんどくさくて死にそう
FORTRANはやっぱイイナと思うよ。


363 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 12:04:01 ]
Fortran77の質問です。初心者なので次の課題がでてよく分かりません。お願いします。
 
「フィボナッチ数列を配列f()とDo文を使って計算させ、30項までの結果を8i8の書式で出力せよ。

「日本で現在の流通通貨は1万円札から1円玉まで9種類ある(2千円札を除く)。
5桁の金額 kin を最も少ない枚数でそろえるには、それぞれ何枚になるか出力する。
貨幣9種の額はファイル kahei.txt から読み込む。出力の書式は○○yen ○○mai.」

364 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 17:28:54 ]
>>360
文が複数行に渡るなんてよくあるし、Cみたいな;のほうが良いと思う俺はFortraner失格ですか?

最近遊びでVSのC#を触ったが、色んな意味で感動したw
他の言語触るのはなかなかイイもんですな



365 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:11:18 ]
>>363
フィボナッチらしき(間違えている)ものを作った。
宿題に合わせて、間違えを修正しろ。

program main
integer f(10)
f(1)=1
f(2)=1
do 10 i=3,10
f(i)=f(i)+f(i)
10 continue

write(6,'( 8i8 )') (f(j),j=1,10)
end


366 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:48:57 ]
>>363
とりあえず入出力はつくった。
計算式をよく考えろ。

program main
integer kahei(9)
integer kin
open (1,File='kahei.txt')
do 10 i=1,9
read(1,*) kahei(i)
10 continue
print *, "input kingaku"
read *, kin
do 20 i=1,9
write(6,'( i5, "yen ", i1, "mai" )') kahei(i), kin/kahei(i)
20 continue
end

kahei.txt
10000
5000
1000
500
100
50
10
5
1


367 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 00:45:49 ]
>>363
しばらくぶりに77で書いた。すでに>>365-366があってがっくしwww

PROGRAM FIBONA
INTEGER F(0:30)
F(0) = 0
F(1) = 1
DO 10 I = 2, 30
F(I) = F(I - 1) + F(I - 2)
10 CONTINUE
WRITE(*, '(8I8)') (F(I), I = 0, 30)
STOP
END

PROGRAM KANE
INTEGER KAHEI(9), NUM(9)
OPEN(9, FILE = 'KAHEI.TXT')
DO 10 I = 1, 9
READ(9, '(I8.8)') KAHEI(I)
10 CONTINUE
WRITE(*, *) 'INPUT KINGAKU'
READ(*, *) KIN
DO 20 I = 1, 9
NUM(I) = KIN / KAHEI(I)
KIN = MOD(KIN, KAHEI(I))
20 END DO
DO 30 I = 1, 9
WRITE(*, '(I6, A, I5, A)') KAHEI(I), ' YEN ', NUM(I), ' MAI'
30 CONTINUE
STOP
END


368 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 11:32:44 ]
>>365-367
どうもありがとうございました。助かりました。

369 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:12:47 ]
>>367
「キルヒアイス、お前は優しいな。」
20ループと30ループ合体できない?
DO 20 I = 1, 9
NUM = KIN / KAHEI(I)
KIN = MOD(KIN, KAHEI(I))
WRITE(*, '(I6, A, I5, A)') KAHEI(I), ' YEN ', NUM, ' MAI'
20 END DO

370 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:28:49 ]
>>369
それも思ったが、I/Oと主演算は分離すべきかなと思って分けた。

天皇陛下万歳!


371 名前:デフォルトの名無しさん [2008/06/13(金) 01:34:43 ]
すいません、初心者なんですが
windows上で動くFORTRANのエミュってありますか?

372 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 01:44:23 ]
>>371
VMwareにLinux入れてg77使えばおkw

373 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 01:46:34 ]
>>371
ある。77も95も。
ぐぐれw


374 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 04:53:55 ]
>>373
お勧めの物はないのでしょうか?



375 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:01:12 ]
fortran のエミュってどういう意味なんだろう?
単に IDE があってコンパイルができればいいなら silverfrost ftn95 でググれば見つかるよ。

376 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 02:07:35 ]
>>374
G95とかどう?
ttp://ftp.g95.org/
Self-extracting Windows x86かそのへん


377 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:57:48 ]
>>376
cygwin入れるのがだるい。


378 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:42:03 ]
>>377
まあマジレスすると Self-extracting Windows x86 の方はMinGWだから
Cygwin環境が無くても単独で動くわけだが。

379 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 09:13:45 ]
しかし Cygwin のインストールがだるいって相当だな

380 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:07:53 ]
倍精度計算で、D○.○のようにして出力すると

例えば 0.12345D-3 のように表示されてしまうのですが
これを1.2345D-4
と表示する事は可能でしょうか?
試行錯誤しているのですが全然分からず教えて頂きたいです

381 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:41:00 ]
昔はcygwin入れるのは当たり前って感じだったが今はな・・・
最近影薄くて心配になるけど、細々と続いてるようね

382 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 19:51:44 ]
>>380
ESでできなかったかな。

383 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:44:40 ]
>>380
フォーマット指定するだけじゃん・・・

384 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 23:55:47 ]
>>382-383
ESとはなんでしょうか・・
ごめんなさい、どのようにしたら良いのかさっぱりで・・



385 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 00:43:11 ]
>>384
フォーマットの指定で"D○.○"の所を"ES○.○"にする

"D○.○"→0.100D+00
"ES○.○"→1.000E+00
"ES○.○E3"→1.00E+000

試してないから間違ってるかも

386 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 01:20:56 ]
>>380
Fortran90でよければ、上にみんなが書いているようにESでおk。
FORTRAN77ならば、1P D○.○ 0P でいける。
P 指定子は破壊力がでかいので、使ったらすぐ 0P で元に戻すが吉。

ま、マニュアル嫁


PROGRAM ppp
IMPLICIT NONE
REAL(8) :: d
d = 1.234567d-2
PRINT '(D15.6, ES15.6, 1P, D15.6, 0P)', d, d, d
STOP
END PROGRAM ppp

実行出力
0.123457D-01 1.234567E-02 1.234567D-02
Press any key to continue . . .

387 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 11:57:12 ]
P指定子ってすごいよな・・・
今考えるとアリエンけど、昔はああいう仕様は全然平気だったんだろうな

388 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 17:08:36 ]
世の中の処理系のほとんどが対応してると言っていいFortranのバージョンって、95でしょうか?
ちょっと前は、95はまだ早いから無難に行くなら90にしとけ、って声を聞きましたが。

389 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 20:44:00 ]
>>387
P指定子ってなんでありえないの??
よく使うのだが…

390 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 23:07:51 ]
昔、>>380の様に考えて出力用にP指定子を使ったが、クリアしていなかったので
READのところでFフォーマットの値がスケールされて読まれてしまい、とんでもない結果が出て悩んだw

たしかEとかベキ記号がついているときはスケールされないので、すげー悩んだ。

Fortran90の勉強を始めたとき、ESフォーマットがあったので、あぁアリガテーと思った。

391 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 12:47:18 ]
>>389
マジで言ってんの・・・?
まぁ気をつけてれば問題ないけどさ

392 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 16:22:50 ]
学校の課題で次のものが出たんですけど、初心者なのでわかりません。お願いします。ちなみにFORTRAN77です。

今日の月日と曜日を入力し,これを用いて今年の任意の月日の曜日を出力させよ.
 各月の日数はファイルから読み込む.ファイル名や変数名は自分で付ける.
曜日は数値で代用してよい.日曜=1,月曜=2,・・・土曜=7.
目標の月日が何日後か(前か)を出す.それから曜日を計算する.
today
6 23 2
when
1 1
-174days 3you
today
6 23 2
when
12 31
191days 4you

393 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:25:50 ]
>>392
「今年」と銘打っているのに、曜日の入力を要求するんだな。
今日の月日と曜日に不整合があった場合、どうするんだろう。

まずは次の課題を考えなさい。
今日の月日を入力し、一年の経過日数(正月=1)を出力するプログラムを作成せよ。

394 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 20:34:09 ]
わかってるところとわからんことを書かないと、アドバイスのしようがないのでは?
全部かいてもらう気なら別だが。



395 名前:392 mailto:sage [2008/06/23(月) 20:41:37 ]
>>394
上にも書きましたが初心者です。
全部わからないので全部書いてください。

396 名前:392 mailto:sage [2008/06/23(月) 20:54:35 ]
上の人は別人です
まだFORTRAN77を触り始めて間が無いので表示するプログラムが限界です
勉強のためにコメントをつけてくだされば嬉しいです

って言いたいと思う

397 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 21:17:09 ]
>>396
本質的には >>395 と言っている事が一緒だね。
さらに解説ヨロってのも凄いが。

398 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 21:36:47 ]
まぁとりあえず、作ってみようぜ

399 名前:デフォルトの名無しさん [2008/06/23(月) 23:13:44 ]
学校の課題なんだから必要な構文の説明あるだろ
初心者じゃなくて怠け者だろ

400 名前:デフォルトの名無しさん [2008/06/24(火) 02:33:14 ]
この問題がわかりません↓

0.0 から 1.0 までの 10 個の値、 0.12, 0.32, 0.09, 0.83, 0.58, 0.39,
0.72, 0.44, 0.71, 0.24 を使って、起点 0.0、幅 0.2 としたときの頻度分布
を求めるプログラムを作成せよ。

結果はこのように表示されるようです。
s < 0.2 2
0.2 <= s < 0.4 3
0.4 <= s < 0.6 2
0.6 <= s < 0.8 2
0.8 <= s 1

if文を使うのはわかるのですが、頻度分布をどう求めていいのかわかりません。
fortran77です。
どうかよろしくお願いします。


401 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 09:21:12 ]
>>396
初心者には、入出力まわりが一番難しいのだが。

402 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:36:12 ]
>>400
PROGRAM HIST
INTEGER NUM(5)
REAL S(10)
DATA S / 0.12, 0.32, 0.09, 0.83, 0.58,
$ 0.39, 0.72, 0.44, 0.71, 0.24 /
DO 10 I = 1, 5
NUM(I) = 0
10 CONTINUE
C
DO 20 I = 1, 10
IF (S(I) .LT. 0.0) THEN
WRITE(*, *) 'INPUT ERROR!'
STOP
ELSE IF (S(I) .LT. 0.2) THEN
NUM(1) = NUM(1) + 1
ELSE IF (S(I) .LT. 0.4) THEN
NUM(2) = NUM(2) + 1
ELSE IF (S(I) .LT. 0.6) THEN
NUM(3) = NUM(3) + 1
ELSE IF (S(I) .LT. 0.8) THEN
NUM(4) = NUM(4) + 1
ELSE IF (S(I) .LE. 1.0) THEN
NUM(5) = NUM(5) + 1
ELSE
WRITE(*, *) 'INPUT ERROR!'
STOP
END IF
20 CONTINUE
C


403 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:36:47 ]
WRITE(*, *) 's < 0.2 ', NUM(1)
WRITE(*, *) '0.2 <= s < 0.4 ', NUM(2)
WRITE(*, *) '0.2 <= s < 0.4 ', NUM(3)
WRITE(*, *) '0.6 <= s < 0.8 ', NUM(4)
WRITE(*, *) '0.8 <= s ', NUM(5)
STOP
END

s < 0.2 2
0.2 <= s < 0.4 3
0.2 <= s < 0.4 2
0.6 <= s < 0.8 2
0.8 <= s 1
Press any key to continue . . .

404 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 11:20:33 ]
>>392
あまりチェックしてない。
曜日求め部分をよく練っていない。
うるう年対応してしまったw 今年限定ならデータいじればよし。

FUNCTION ILEAP(IY)
ILEAP = 0
IF (MOD(IY, 4) .EQ. 0) ILEAP = 1
IF (MOD(IY, 100) .EQ. 0) ILEAP = 0
IF (MOD(IY, 400) .EQ. 0) ILEAP = 1
RETURN
END
C
FUNCTION IDAYS(IY, IM, ID)
INTEGER MDAYS(12)
DATA NFEB /28/
DATA MDAYS /31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
MDAYS(2) = NFEB + ILEAP(IY)
IDAYS = ID
DO 10 I = 1, IM - 1
IDAYS = IDAYS + MDAYS(I)
10 CONTINUE
RETURN
END
C



405 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 11:23:50 ]
PROGRAM CALEND
1 WRITE(*, *) 'TODAY'
READ(*, *) IM0, ID0, IDW0
IF (IM0 .LE. 0) STOP 'NORMAL END'
WRITE(*, *) 'WHEN'
READ(*, *) IM1, ID1
IDAYS0 = IDAYS(2008, IM0, ID0)
IDAYS1 = IDAYS(2008, IM1, ID1)
IDIFF = IDAYS1 - IDAYS0
IDW = MOD(IDIFF, 7) + 7 + IDW0 - 1
IDW = MOD(IDW, 7) + 1
WRITE(*, *) IDIFF, 'DAYS', IDW, 'YOU'
GOTO 1
STOP
END

TODAY
6 23 2
WHEN
1 1
-174 DAYS 3 YOU
TODAY
6 23 2
WHEN
12 31
191 DAYS 4 YOU
TODAY
0 0 0
NORMAL END
Press any key to continue . . .

406 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 12:03:44 ]
>>404 乙
「各月の日数はファイルから読み込む」となっているね。
最近みかける宿題の出題者は、
無駄にファイル処理をさせようとしていない?

407 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 12:09:14 ]
>>406
問題よく読んでなかったw
後で直す。


408 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 13:48:19 ]
>>402
ありがとうございました!!
NUMを使うんですね。
解決できました。感謝です。

409 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 15:03:32 ]
>>408
> NUMを使うんですね。

ピントがずれてないか?

優しい人たち乙。


私なら「宿題は自分でやれ」で放置だな。

410 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 15:47:09 ]
>>409
初心者はピントがずれているもんだよ orz

411 名前:デフォルトの名無しさん [2008/06/24(火) 20:20:12 ]
入力データ: test.datの中身
0,10,100,a,b,500,

プログラムソース
character dmm(10)*10
open(10,file='test.dat',status='old')
read(10,*) (dmm(i),i=1,6)
do i=1,6
write(*,*) dmm(i)
end do
stop
end

出力結果
0
10
100
a
b
500

compaq visual fortran 6.0では
たとえば入力データの"b"->"*"に変更した場合のように
文字列にアスタリスクが入っている場合、エラーで落ちてしまいます。
cygwinのg77では問題なく表示されました。

コンパイラによって読めない文字列ってあるのでしょうか?

412 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 23:55:38 ]
>>411
漏れのCVF6.6Cはbを*にしてもエラーでない。
単なるVer.6のバグでないか。

おぼろげな記憶ではVer.6→Ver.6.5は有料うpデートで、結構大きな変化があったはず。
Ver.6.0→Ver.6.1 と Ver.6.5→Ver.6.6は無料。



413 名前:407 >>392 mailto:sage [2008/06/25(水) 01:25:17 ]
FUNCTION IDAYS(IM, ID, MDAYS)
INTEGER MDAYS(12)
IDAYS = ID
DO 10 I = 1, IM - 1
IDAYS = IDAYS + MDAYS(I)
10 CONTINUE
RETURN
END
C*********************************************
FUNCTION IDW(IDIFF, IDW0)
K = MOD(IDIFF + IDW0, 7) + 7 - 1
IDW = MOD(K, 7) + 1
RETURN
END
C*********************************************
PROGRAM CALEND
INTEGER MDAYS(12)
OPEN(9, FILE = 'month.dat')
READ(9, *) (MDAYS(I), I = 1, 12)
C
1 WRITE(*, *) 'TODAY'
READ(*, *) IM0, ID0, IDW0
IF (IM0 .LE. 0) STOP 'NORMAL END'
WRITE(*, *) 'WHEN'
READ(*, *) IM1, ID1
IDAYS0 = IDAYS(IM0, ID0, MDAYS)
IDAYS1 = IDAYS(IM1, ID1, MDAYS)
IDIFF = IDAYS1 - IDAYS0
WRITE(*, *) IDIFF, 'DAYS', IDW(IDIFF, IDW0), 'YOU'
GOTO 1
STOP
END

414 名前:407 >>392 mailto:sage [2008/06/25(水) 01:36:07 ]
month.dat
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31


>>406
今回は、うるう年を外部データとして与えようという親心なのかもしれない。

>>396
プログラムの解説
FUNCTION IDAYS(IM, ID, MDAYS)
一月一日から特定の月日までの日数を計算する。

FUNCTION IDW(IDIFF, IDW0)
今日からの日数差と今日の曜日から、その日数差の日の曜日を求める。
この計算式は、考えるのが面倒なのでちょっと複雑。
もう少しシンプルな書き方があるかもしれない。
FORTAN77のMOD関数は負数を引数とすると、負の数を返すので+7とかが必要。
Fortran90ならMODULO関数というのが新設されていて便利。
だがいずれにせよ7で割り切れるときは0を返すので、1〜7にするために-1/+1の
人工的な操作をした。自分で決める曜日を0〜6にすれば話はもっと楽になる。

PROGRAM CALEND
まず各月の日数をファイルから読み込む。
今年はうるう年なので、うるう年の日数データを用意した。
あとは、I/Oの後、上で用意した関数を使ってやればいい。
ここでループから抜けるために、今日の月が0以下の数の場合終了するようにした。



415 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 10:25:23 ]
>>414
詳しい説明ありがとうございました。

416 名前:411 mailto:sage [2008/06/25(水) 13:24:19 ]
>>412
Ver.6.0から6.1へアップデートしてみました。
今度は*のデータの後にブランクが入るようになりました。
つまり、>>411の入力データでaを*にすると、
*

b
と表示されて、500のデータは読めていない。

おっしゃる通り、Ver.6.0とか6.1固有のバグなのかもしれません。
こういうデータ処理には使うなってことでしょうか。
ありがとうございました

417 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:19:25 ]
>>416
俺の予感では、
read(10,*) (dmm(i),i=1,6)
をフォーマットつけて
read(10,’(A)')
にすればおkな気がする。根拠は宇宙からのメッセージ!w


418 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 14:08:07 ]
FortranってCの/*〜*/みたいな範囲コメントってできないんでしょうか?

419 名前:411 mailto:sage [2008/06/26(木) 14:16:04 ]
>>417
そんなこと・・・あるかもなって思って試してみたけど、
だめだわ。エラーで落ちる。
cygwinのg77でもダメ。

その宇宙からのメッセージ、あんまあてに出来んぞ

ま気持ちだけは嬉しかったわ。ありがとな(´・ω・`)

420 名前:デフォルトの名無しさん [2008/06/27(金) 00:29:58 ]
>>418
fortranは、第1行目に「c」或いは「*」を入れるか、
「!」の後がコメントになる
その他のコメントは聞いたことないし見たことない

f90以降にそんなフォーマットがあるのかもしれんけど、おれは見たことない

421 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:31:33 ]
>>418
Fortranは行を基本単位とする言語なので、行毎に指示をするのが自然な形だ。
CやPascalのように、行が意味を持たない代わりに終端符号などをいちいち付ける言語とは
根源的な思想の違いがある。

しかしプリプロセッサを使えば実は範囲コメントも実現出来る。
ただ、プリプロセッサは本来の規格の外にあるので処理系依存の機能になる。
自分の処理系のFortranマニュアルでfppとかを調べてみるべし。

良いニュースとしては将来Fortran2008で、プリプロセッサが規格に入ることになっているので、
それまで、待つという手もある。
10年くらい待つことになると思うがwwwwwww


422 名前:418 mailto:sage [2008/06/27(金) 10:29:44 ]
>>420,421
ありがとうございます。
行をまとめてズバッとコメントアウトしたいときとか不便だなぁと感じるのですが、仕様上諦めるしかないんですね・・・

世の中のコンパイラがFortran2008に対応するのいつごろだろう
2003だってまだ新しい感じですよね

423 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 12:39:40 ]
>>422
え、それこそ1文字目にCや*を入れるだけでしょ。1行の前半分をコメントにするのは難しいけど。

まさか、エディタでしこしこ100行くらいの1文字目にC入れるのがしんどいとかだったら言語の問題じゃなくて
あんたの未熟さの問題だけど。

424 名前:418 mailto:sage [2008/06/27(金) 17:39:39 ]
>>423
確かに私は未熟者ですが・・・。

手動でしこしこやらずに、そういうことをサクッと一発でやる方法ってないですかね?
viでしこしこ書いてるんですが、sedなどの外部コマンド呼ぶのもアレだし
emacsや他のIDEならそういう便利機能ってあるんでしょうか?



425 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 18:00:20 ]
例えばVisual Studio + Intel Fortranの場合、
Shift押しながら複数行選択し、コメントアウトボタンを押せば行頭に!つくよ。

426 名前:418 mailto:sage [2008/06/27(金) 18:14:37 ]
>>425
ありがとうございます。VSはさすがに便利ですね。
今の開発環境は、単に端末からサーバに入ってvi、なんですが
Windowsに移行しちゃおうかしら

427 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 19:47:11 ]
do while文は最適化を妨げるから使うなって聞いたのですが、本当ですか?便利なので使いまくってますが。

428 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 23:03:57 ]
>>426
viなら置換コマンドを使え。

10行目から20行目までの先頭に ! を挿入
:10,20s/^/!/

30行目から40行目までの先頭の ! を削除
:30,40s/^!//

行頭の ! をすべて削除
:%s/^!//

429 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 23:05:25 ]
>>426
emacs では C-c ; でリージョンをコメントアウトできる

430 名前:418 mailto:sage [2008/06/27(金) 23:37:45 ]
>>428,429
ありがとうございます。勉強になりました。

431 名前:デフォルトの名無しさん [2008/06/28(土) 08:28:25 ]
>>418
コメントアウトしたいブロックを「#if 0」〜「#endif」で挟む。
UNIX系OS上の処理系なら、ソースファイルの拡張子を「.F」に、
Fortran90なら「.F90」にしておけば、コンパイル時に
自動でプリプロセッサを通してくれるはず。


432 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:58:39 ]
Fortran90のサフィックスは普通.f90ですが、2003や2008だとどうなるんですか?.f03や.f08?

433 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:15:58 ]
>>432
サフィックスは固定形式と自由形式の違いの認識じゃない?
f90 以降は、.f90だと思う。


434 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 09:47:29 ]
>>433
そうでしたね・・・お恥ずかしい質問失礼しました。



435 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 17:34:50 ]
Fortran90以降の(自由形式の)ソースファイルとして認識されるファイルの拡張子は処理系によって
.f90, .f95, .f2k, .f03, .f08
などがある。
固定形式の方は .f, .for, .ftn などがある。

436 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:41:15 ]
www.uploda.org/uporg1533847.f.html
このファイルなんだけど、
stv=c1*cos(t)-(0.5d0)*(exp(-c*t/2.0d0)*(c*cos(t*e1)-(e)*sin(t*e1)
の部分で絶対にエラーを吐かれます
何がいけないのかまったくわからないのですが文字数制限とかでしょうか?

437 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:46:53 ]
事故解決しました

438 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 20:28:27 ]
nはサブルーチンの引数で0<n<100の整数とします。

GOTO n
1 CALL hogehoge01(...)
GOTO 999
2 CALL hogehoge02(...)
GOTO 999
...
99 CALL hogehoge99(...)
999 PRINT *, '終わり'

みたいな事がやりたのですがコンパイルエラーになります。
現在は IF THEN FLSE で場合分けしているのですが分岐の数が多くて
あまりスマートではありません。何か上手い方法は無いでしょうか?

439 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 21:23:35 ]
>>438
使っている言語を詳しく

440 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 00:31:01 ]
>>439
Intel Fortran Compiler 10.1 です

441 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 00:36:14 ]
すいません、言語でしたね。Fortran 90 を使っています。
Fortran 95 で Intel Compiler がサポートしている機能なら使っても問題ないです。

442 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 14:38:07 ]
>>438
割り当てGOTO文の行き先はASSIGN文で与えないといけない。ただし、常数じゃないと駄目だったはず。
GOTO n, (1, 2, 3, 4, ....) と書く方法もあるが。

まぁFortran90だったら、素直に SELECT CASE にしとけ。



今時Fortran66時代の割り当てGOTOを持ち出し、しかもIF-THEN-ELSEより割り当てGOTOを
スマートだと感じ、エラーメッセージを貼らないで質問し、
おまけにhogehogeなどというUnix界隈の嫌な語を使うwwww

はっきり言えば、チミはセンスがズレてるから、ちゃんとFortran90以降を基礎から習え。

443 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 10:03:56 ]
昔のFORTRANって引数に渡した定数をサブルーチン側で変更すると
呼び出し側にも影響が出たって本当ですか?
function(1, 2)
とかで呼んだ場合定数の1と2が入れ替わるみたいな話を耳にしたのですが。

444 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 17:17:05 ]
フォートラン90なんですが、途中結果をターミナルに出力させた後に
pause 文を入れて、出力結果を確認してリターンキーを押さないと
プログラムが再開しないようにしてあります。
これを、リターンキーを押さなくても、ある程度の時間(10秒とか)が
経つと勝手に再開するようには出来ないのでしょうか。。




445 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 19:30:07 ]
>>444
OS とコンパイラは何?

446 名前:444 mailto:sage [2008/07/24(木) 20:38:42 ]
WinXpのcygwinで g95でコンパイルしてます

447 名前:デフォルトの名無しさん [2008/07/24(木) 21:40:55 ]
fortranを使って双子素数(連続した奇数が素数になっているものの組)を出力する課題に取り組んでいるんですが
完全にお手上げ状態です。
一応素数の出力はできてるみたいなんですが・・・

*素数の出力
INTEGER n,i,k
*
READ(5,*) n
i=2
WRITE(6,*) i
*
DO 10 i=3,n,2
k=3
30 IF (k**2 .GT. i) GOTO 20
IF (mod(i,k) .EQ. 0) GOTO 10
k=k+2
GOTO 30
20 WRITE(6,*) i
10 CONTINUE
*
STOP
END

こんな感じです。
違う方法でやったほうがいいんでしょうか…

448 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 22:46:10 ]
解読できんw

449 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 23:05:23 ]
>>446
CALL SLEEP(10)  ! 10秒間待つ

>>447
そのプログラムを修正するのなら、
 ・調べた奇数が素数だったのか素数で無かったのかを記録する変数を用意して
  「DO 10 i=…」 のループで毎回結果を記録しておく。
 ・素数が見つかったら上記の変数を調べて、1つ前の奇数も素数だった場合は
  両方の値を出力する。

450 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 23:34:50 ]
>>443
その通り。ただ定数を直接書くのではなくパラメータ指定した定数を書かないと
はっきり分からんだろう。これはサブルーチンの引数が参照渡しなので起こりうる。
SUBROUTINE sub_test(a, b)
IMPLICIT NONE
REAL, INTENT(IN OUT) :: a, b
REAL :: tmp
tmp = a
a = b
b = tmp
RETURN
END SUBROUTINE sub_test
!===========================================
PROGRAM test
IMPLICIT NONE
REAL, PARAMETER :: a = 1.0, b = 2.0
EXTERNAL :: sub_test
PRINT *, 'a=', a, ' b=', b
CALL sub_test(a, b)
PRINT *, 'a=', a, ' b=', b
STOP
END PROGRAM test

Fujitsu-Lahey Fortran95 実行結果 (Intel Fortran は実行時エラー)
a= 1.00000000 b= 2.00000000
a= 2.00000000 b= 1.00000000
Program Completed
Press Enter to Continue.

>>444
過去レス>>326と重複している。その回答を読め。


451 名前:デフォルトの名無しさん [2008/07/25(金) 00:13:07 ]
>>449
本当に申し訳ないのですが素数だったか素数じゃなかったかを判別するプログラムが作れません…
まるなげになってしまって申し訳ないですが具体的にどうなるか教えていただけないでしょうか?
(面倒だったり自分でやれとおっしゃるならいいですが)


452 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 09:09:52 ]
449 ではないが。
素数を画面に書かせることはできてるわけでしょ?
それなら
(1)素数を画面に書くかわりに、適当な変数たとえば prime_prev に代入
(2)あらたに素数を見つける。その素数と prime_prev との差を調べる
(3)差が2なら双子素数。2でないなら、(2)で見つけた素数を prime_prev に代入して
   ふたたびステップ2へ。
でいいんじゃね?

453 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 11:54:47 ]
普通素数はエラトステネスのふるいをつかって求めるから、
その表で連続している奇数を捜せば良いのではないかい?


454 名前:名無し [2008/07/28(月) 17:48:07 ]
FORTRAN77を用いてモンテカルロシミュレーションのプログラムを作成しようと思っています。
しかしFORTRAN77を用いたプログラミング自体始めたばかりであり、プログラムの作成方法についてピンときません。
もしよかったならどのようにしてプログラムを作ればよいのか教えてもらえませんか?
大まか過ぎる質問ではありますが・・・。




455 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 23:27:16 ]
その質問だと回答してくれる人少ないんじゃない?

まず
1. 計算機にやらす内容を手作業でできるかどうか(時間は別として)

ここでつまづくならFortranの問題じゃなく、
モンテカルロって何?
何を入力して、何を出力するの?
などがわかってないのでちょっと別問題。

1.をクリアしてるなら、次に
2. その処理をコーディングしていくと、どこでつまづくのか
を考えよう。
その部分が明確になっているなら、このスレッドの方は回答くださるかと思います。



大まかな質問なので大まかな回答しかできないけど
RANDOM_NUMBERやRANDとかいった乱数発生関数があるのでこれを利用することになるんだと思うよ。
ちなみにどんな関数があるかはコンパイラに依存するので・・。

456 名前:デフォルトの名無しさん mailto:sage [2008/07/28(月) 23:57:35 ]
>>454
分子シミュレーション講座1 モンテカルロ・シミュレーション
ISBN978-4-254-12691-4、神山新一・佐藤明、朝倉書店
付録 7.7 基本的なFORTRANの計算プログラム集
図書館で借りろ。

457 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 00:49:18 ]
>>454
FORTRANでプログラム出来るとはありがたいこと。
まず天皇陛下に感謝をささげよ。

次に先輩から下敷きになるプログラムを貰うこと。
これで将来の運命が決まる。
筋の悪いウンコプログラムを貰ったらもうアウトw
筋が良くても長大な完成版を貰ったらやはりアウトww
筋が良くて簡素で、自分で拡張してゆける物を貰えたら、おのずから上達して成功する。

つまり、すべては運なので神に祈れw


458 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 03:21:57 ]
>>457
課題がモンテカルロだしw

459 名前:デフォルトの名無しさん [2008/07/29(火) 18:11:23 ]
サブルーチンの練習ということで以下のようなプログラムを作ったのですがコンパイル時にエラーになってしまいます。
もしよろしければどこがだめなのかご教授ください。改行が多いと怒られたので2レス使います。
PROGRAM ENSHUU6_4
IMPLICIT NONE
INTEGER :: I,A

INTERFACE
SUBROUTINE PHIBO(i,result)
IMPLICIT NONE
INTEGER,INTENT(IN) :: i
INTEGER,INTENT(OUT) :: result
END SUBROUTINE PHIBO
END INTERFACE

WRITE(*,*) ' I= '
READ(*,*) I
CALL PHIBO(i,result)
WRITE(*,*) ' result= ',result
STOP
END

460 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 18:12:22 ]
SUBROUTINE PHIBO
IMPLICIT NONE
INTEGER,INTENT(IN) :: i
INTEGER,INTENT(OUT) :: result
INTEGER, DIMENSION(0:100) :: A
INTEGER :: N
A(0)=1
A(1)=1
DO N=1,i
A(N+1)=A(N)+A(N-1)
END DO
result=A(i)
RETURN
END SOUROUTINE PHIBO

sage忘れました・・・申し訳ない

461 名前:デフォルトの名無しさん mailto:sage [2008/07/29(火) 22:29:02 ]
>>459
>>460
・IMPLICIT NONEがあるのに宣言されていない変数が使われている
・サブルーチンの宣言に仮引数がない
・綴りの間違い

何行目に間違いがあるのかはエラーメッセージに示されているはずなので
それを参照して自分で探すこと。

462 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 01:04:09 ]
>>461
ありがとうございます

463 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 12:14:25 ]
>>462
エラーメッセージをコピペしてもらえると、回答はすごく楽になる。


464 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 15:27:02 ]
>>463

In file ttt.f90:16

CALL PHIBO(i,result)

Error: Symbol 'r' at (1) has no IMPLICIT type

とだけ表示されます。
>>461の宣言されていない変数がなんなのかと綴りがどこが間違っているか発見できません。




465 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 15:30:31 ]
間違えました

>Error: Symbol 'r' at (1) has no IMPLICIT type

ではなく

Error: Symbol 'result' at (1) has no IMPLICIT type

です

466 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 16:07:50 ]
>>464-465です

解決しました。ありがとうございました!!

また質問に来た時はよろしくお願いします。

467 名前:デフォルトの名無しさん [2008/07/30(水) 20:58:51 ]
>>454-458
アドバイスありがとうございました。
説明不足でしたので少し補足をしておきます。

モンテカルロシミュレーションを用いたタンパク質と低分子の結合実験を行えるプログラム(使用言語:FORTRAN77)を作ろうと考えています。
ここでのモンテカルロシミュレーションはタンパク質上の各部分に乱数とよばれる数をふりわけて、確率的な試行(低分子をタンパク質に結合させる操作)を何回も繰り返すことを意味します。
これによってタンパク質上での低分子の結合しやすい部分を見つけ出そうと考えています。
しかしプログラミングを本格的に始めて間もないということもあり、プログラムを作るための糸口がいま一つ見つかりません。
(例えばタンパク質上の各部分での乱数のふりかた、パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方)

話がまた戻りますが、プログラム完成にいたるまでの手順、方法等についてのアドバイスを頂けませんか?


468 名前:デフォルトの名無しさん mailto:sage [2008/07/30(水) 23:34:14 ]
> 例えばタンパク質上の各部分での乱数のふりかた

乱数はRANDOM_NUMBER関数で0<=x<1の値を発生させることができる。
発生させたい数字が5〜10なのなら、
発生させたい数字 = 5.0 + x * 5.0 になる。


> パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方

パソコンではどうあがいても分子結合はできません。
揚げ足を取りましたが、シミュレーション方法は先生に聞くべき。

ここではそのシミュレーション方法をプログラミングに反映させる方法を聞いてください。


469 名前:デフォルトの名無しさん mailto:sage [2008/07/31(木) 08:07:51 ]
fortran77 だと RANDOM_NUMBER 関数は使えないらしいぞ
www.geocities.jp/eyeofeconomyandhealth/homepage/kumikomi3.html
しかし >>467 は fortran90 か 95 を使わない理由はあるの?
77より便利だよ。

470 名前:デフォルトの名無しさん mailto:sage [2008/07/31(木) 09:10:48 ]
>>467
この質問内容を見る限り、自分で一から作るのは無理っぽいので、
下敷きになるプログラムをどこかから手に入れることだ。
論文読めばプログラム名があって、ググレば出るだろ。

今はそれどころではないと思うが、真面目な計算に入る前に、乱数も自前のを用意したほうがいい。
というか本来は擬似乱数の評価からはじめないと、叩きまくられる。
乱数マニアがいてうるさいw
スパコンのたぐいならハードウェア実装の乱数とかもあるが。


471 名前:デフォルトの名無しさん mailto:sage [2008/07/31(木) 18:52:31 ]
モンテカルロで使う乱数はメルセンヌツイスターでいいだろ。
fortran のコードも公開されてるから、ググってダウンロードして、出力される数列を
自分でチェック。

472 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 19:04:40 ]
くだらない質問ですが
closeしたファイルに書き加えるってどうやるのでしょうか?

473 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 20:56:17 ]
>>472
もう一度openする。そのときにposition='append'で書き込み位置を指定する。
そうするとwriteで書き込みしたときにファイルの最後に書き足される。

474 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 21:06:56 ]
FORTRAN90と95のgnu版が欲しいな



475 名前:472 mailto:sage [2008/08/14(木) 22:12:29 ]
>>473
ありがと〜

476 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:18:44 ]
フリーのFORTRAN95なら
www.silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.asp

477 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:33:19 ]
>>474
gfortran

478 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:40:42 ]
gfortranのwin32版はないみたいだ

479 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 22:43:31 ]
>>478
あるよ
gcc.gnu.org/wiki/GFortranBinaries

480 名前:デフォルトの名無しさん [2008/08/22(金) 14:34:23 ]
以下のコードは、配列を受け取る手続きcallbackを別の手続きforward
に渡すコードです。forwardでは、callbackに対応する仮手続きの引用
仕様で、この配列が1開始添え字(つまりデフォルト)としているが、
callbackでは、0開始添え字になっています。

このような「添え字のずらし」は合法のはずですが、これをコンパイル
すると、g95ではOK、intel fortranではコンパイルエラーとなります。
質問は、これがintel fortranの方言によるものなのか、規格上の根拠
があるのか、どちらなのかということです。



481 名前:デフォルトの名無しさん [2008/08/22(金) 14:36:14 ]
module dummyproc
contains
subroutine callback(x)
real(8), dimension(0:) :: x
end subroutine

subroutine forward(cb,x)
interface
subroutine cb(x)
real(8), dimension(:) :: x
end subroutine
end interface
real(8), dimension(:) :: x

call cb(x)
end subroutine
end module

use dummyproc
real(8), dimension(5) :: x
x = (/1d0, 2d0, 3d0, 4d0, 5d0/)
call forward(callback, x)
end

482 名前:デフォルトの名無しさん [2008/08/23(土) 00:28:50 ]
>>480-481
>>481でエラーが出るのはインターフェースが矛盾しているからだろう。
real(8), dimension(0:) :: x
こうすればコンパイラを通る。

ただ、0から始まる配列の引き渡しで様々な問題が起こるのは事実。
規格書をよく読んでいないから断言できないが、元々多分曖昧な点があるんだろうと思う。
処理系によって動作が違う。

また、部分配列を送る時に微妙な問題がある。
たとえば、
REAL :: x(0:100)
の全体を、サブルーチンに送る時に、
1.CALL sub(x)
2.CALL sub(x(:))
と送ると、ソース上の意味では同じことだが、大概の処理系では2.の時のように
部分配列の指定子がつくと、いったん暗黙にアロケートされたテンポラリ配列に
コピーして送るために、サブルーチン側で LBOUND(x) を書かせてみると
1.の場合は配列が0から始まると認識するのに、2.の場合は配列が1から始まると
みなしていたりする。

さらにややこしいことに、最近 Intel Fortran は、引数として x(:) を渡すときは、
テンポラリを作らずに x の番地をそのまま渡すようにしたらしい事で、時と場合と処理系に
依存して何が起こるか分からん気分だったりする。

まぁFortranの自然数は1から始まるのでしょうがない。
0から配列を始める奴が悪いwwwというのが、俺が昔同じような問題で悩んだときの結論だw






483 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:12:11 ]
すみません、教えて下さい。
fortran77で、プログラム途中に print *, A みたいに
Aを出力させるとさせないのとでは
最後の結果(計算にAの値を使う)が異なってしまいます。
(printを入れると正しい値、入れないと NaN)
出来ればprint無しで動かしたいのですが、これって何が悪いのでしょうか?
WinXp-Cygwin、g77でコンパイルしています。

484 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 04:53:09 ]
>>483
書いたプログラム晒せや。



485 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 21:26:44 ]
デバッグ文入れたときにのみ結果が違うってのは、
大抵の場合、配列破壊が起きてる。

サブルーチンの引数渡しをチェック、宣言文チェック等すべし。

ちなみにprint文周辺だけ見てもわからない場合が多いよ。



後は、晒すしかないね。

486 名前:483 mailto:sage [2008/08/26(火) 22:10:28 ]
>>485
ありがとうございます。
ここで晒すには長すぎるので、なんとか地力で頑張ってみます


487 名前:デフォルトの名無しさん [2008/08/27(水) 01:06:04 ]
>>486
PRINT文を入れて結果が変わるのは、最適化による場合もある。
最適化レベルを0にする、もしくはデバッグモードで実行してみるという手もある。

また>>485で指摘された可能性を追求する場合には、サブスクリプト・チェックの
オプションをつけてコンパイル・実行することにより容易に確認できる。


488 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 19:22:23 ]
>>486
77なら暗黙の型宣言使ってるだろうから、その A がプログラムの実行順で、
どこに初めて現れるのかも確認すれ。初期化に失敗してるかもしれん。

どうしてもバクがみつからなかったら、90/95で書き直すべし。
固定形式と暗黙の型宣言の組み合わせは、バクの温床。


489 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 21:04:19 ]
新しく独学でFORTRAN勉強したいのですが、
77と90/95ではどちらがいいのでしょうか?

完全にプログラミング初心者です。

490 名前:486 mailto:sage [2008/08/27(水) 22:24:09 ]
>>487-488
追加アドバイスどうも感謝です
参考になります!



491 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 01:01:36 ]
二次元配列とかで
行列の一部に数値を与えた場合
他の数値を与えられてないところの部分はどのように処理されるのでしょうか?


492 名前:デフォルトの名無しさん mailto:sage [2008/08/28(木) 01:12:29 ]
>>491
基本的に変数や配列の中身はゴミが入っていると思ったほうが良い。
0が入っていると思ってはいけない。

共同利用のコップと同じで洗ってから使えw

493 名前:491 mailto:sage [2008/08/28(木) 01:26:19 ]
なるほど!ありがとうございます。

494 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 21:57:13 ]
コンパイルは成功するのですが
データを入力すると

RUNTIME ERROR
Error 29.Call to missing routine AAA

といってエラーが出ます、これはどういう意味でしょうか??



495 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 00:22:31 ]
>>494
副プログラムAAAが存在しないというエラーだが、普通はリンク時に存在しないと怒られる。
externalとかで引数にでもしてるのかな?

もう少しコンパイラ等を詳しく。

496 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 19:20:51 ]
>>489
しがらみのない自由の身なら、断然90/95。並列化など、将来性も多少はあるかもしれない。
一方77は、過去の遺産を引き継ぐはめになった人が、発狂しながら解読するもの。


497 名前:デフォルトの名無しさん [2008/09/01(月) 21:25:09 ]
今までfortran77を使っていたのですが、90や95を使いたくなり、g95をインストールしました。

それで実際に試してみたのですが、コンパイルが上手くいきません。
77を使っていた時はテキストエディタにfcpadを使っており、マウス操作でコンパイルしていましたが、
g95ではコマンドプロンプトでコンパイルするため、勝手がよく分からず困っています。

例えばhello.f90というファイルを作ってコンパイルするとき、
g95 hello.f90 -o a.exe
とコマンドプロンプトで入力すると
g95: hello.f90: No such file or directly
となってしまいます。

こうなってしまうのは入力した内容がおかしいからでしょうか?
ファイルの保存場所などにも関係があるのでしょうか?

あまりに初歩的な内容で申し訳ないのですが、よければよろしくお願いします。

498 名前:デフォルトの名無しさん [2008/09/01(月) 22:40:26 ]
>>497
>g95: hello.f90: No such file or directly
hello.f90 が(g95から見て)見つからないのでコンパイルできません。

cd コマンドで hello.f90 が保存してあるディレクトリに移動してからコンパイルして下さい。
現在居るディレクトリ(カレントディレクトリ)は通常コマンドプロンプトのカーソルの左に
C:\hage\> 等と表示されています。


499 名前:デフォルトの名無しさん [2008/09/02(火) 07:53:41 ]
>>498
わかりやすい説明ありがとうございます。
申し訳ないですが、もう1つ質問してもいいですか?

helloの拡張子がfだとコンパイルできるのですが、f90やf95に変えると
g95: hello.f90: No such file or directly または
g95: hello.f95: No such file or directly 
となってしまいます・・・。これはなぜでしょうか?

500 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 23:06:57 ]
>>499
まずエクスプローラでファイル名及び拡張子が確実に「hello.f90」になっているかチェック。
エクスプローラは必ず「拡張子を表示する」設定にしておくこと。

メモ帳で編集している場合は「テキスト文書(*.txt)」で保存すると勝手に拡張子 .txt を付けられて
「hello.f90.txt」となっている場合がある。


501 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 11:22:12 ]
うちの研究室の先輩からソースコードをもらったのだが・・・
COMMON文やGOTO文がそこらじゅうにあって解読するのが大変だ・・・。

個人的にはF90以降形式で書きたいけれど、ここに書き加えて大丈夫かな?

>>499
windowsなら、g95の後にソースコードをドラッグ&ドロップか、
vistaならソースコードのアイコンを、shiftを押して右クリック、パスとしてコピーをして
プロンプトにパスを貼り付けて実行してもダメ?

502 名前:デフォルトの名無しさん mailto:sage [2008/09/04(木) 19:58:26 ]
>>500
>>501

色々と試してみましたが、やはり上手くいきませんでした・・・。
もうちょっと試行錯誤してみます。
こんなくだらない質問に答えていただき、ありがとうございました!

503 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 01:22:52 ]
Intel Fortran の次期バージョンベータテストが始まっている。
V.11が来年一月までの期限付きだが、無条件に配布されている。
Windows版はVisualStudio(Fortran 専用)つきで。
気になる人はチェキラ!w

ここの右下に入り口あり。
ttp://www.intel.com/cd/software/products/asmo-na/eng/399359.htm
めーる登録でライセンスキー送られてくる。
Fortran2003対応の模様。インストールにXP以降が必要。
仕事マシンWin2kの俺様涙目w


504 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 01:53:15 ]
配列について伺います。
以下のような配列を宣言することはできるのでしょうか?
1 2 3
a = 4 5
6 7 8 9

言葉にすると、「i成分ごとに異なる数のj成分が存在するような配列を宣言できるか?」
ということになります。
不要な成分に0を入れて(3,4)成分の配列をつくるのが素直なのかもしれませんが、メモリの関係でそのような配列の宣言ができませんでした。

#実際の問題設定は、三次元の多相流の計算です。
#計算領域がいくつかのゾーンに分かれており、
#それらの領域すべての物理量をひとつの配列で取り扱おうとしています。
#従って、座標3成分、相の種類1成分、物理量の種類1成分、ゾーン1成分
#の計6成分の配列を取り扱います。
#ゾーンの大きさがマチマチなので最大のものに合わせて配列を宣言すると
#メモリが足りなくなってしまいます。




505 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 08:51:02 ]
>>503
つかってみよっと

506 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 11:28:03 ]
>>504
F90以降なら構造型を使う。

F77なら、確かEQUIVALENCEで部分配列に別名を付ければ、そのようなことが出来なくもなかったはず。
ただ、諦めて複数の配列変数に分割する方か、見通しがよくなるかもしれない。
F77では、まともにコーディングしたことない、つーか、したくないので、他に定石があるかもしれんが…


507 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 13:59:21 ]
>>504
配列の持たせ方を変える方法はどうかな?
上記の例の場合、
実際にデータのあるa(9)に値を入れ、
参照配列b(3)にa中の各行の値の入る先頭番号を入れる。 b(1)=1,b(2)=4,b(3)=6
各行の先頭の値は例えば下記のように取り出す
do i = 1, 3
print *, a(b(i))
enddo


508 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 15:07:44 ]
90なら ALLOCATALE で配列を宣言して、必要なだけそのときに
ALLOCATEすればいいかな。


509 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 17:03:26 ]
窓用gfortran試してるんだけど、a.exeじゃなくてコンパイル後のファイル名を指定してコンパイルする方法ってある?

510 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 17:39:30 ]
いつもどおり-oでいいとおもった
ためしてない

511 名前:デフォルトの名無しさん [2008/09/06(土) 18:24:23 ]
CompaqのFortranV6.6からIntelFortranV10.1に乗り換えました
付属のVisualStudio環境ではF90の作業用の前提となっているのか
そのエディタは6カラム目の素敵な継続行カラムなどに配慮されていません
そのあたりF77の固定カラムに便利なように設定は変更できないでしょうか?

512 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 19:25:04 ]
>>511
ツール>オプション>フォントおよび色
で変えられたはず。



のであったが、>>503の新版入れたらなんかおかしくなったwww



513 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 21:29:47 ]
固定形式は廃止予定事項だから、新機能の実装を優先して、後回しにしたんじゃw


514 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:00:56 ]
>>506-508
ありがとうございます。
構造体を使うことも検討したのですが、ゾーンを指す変数nzでdo文を回したいと考えていたので、今回は用いませんでした。
割付け配列についても、ゾーン間で補完を行う必要があり、同時にすべてのゾーンのデータを保持する必要があるため、今回の用途には適さないのではないかと考えています。
>>507さんのアドバイスを検討してみます。




515 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 21:38:02 ]
>>509
gfortran -o xxx.exe 2ch.f90でおkですよ。

でも、同じくgfortranで自作ライブラリのリンクの仕方が分からない・・・
どうやってコマンドを入力すればいいんだろう・・・。

516 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:16:59 ]
>>515
gfortran hage.f90 -lmytoupee
または
gfortran hage.f90 libmytoupee.a

モジュールとライブラリのパスはそれぞれ -I, -L で適時指定すること。

517 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 03:10:45 ]
というかGCCってコンパイラオプション統一してんの?

518 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 21:58:22 ]
>>516
ありがとうございます。

でも、自分がものすごく初歩的な勘違いをしているかもしれませんが、
ネット上のライブラリはOKでしたが、自作ライブラリがうまく使えないんです。
ライブラリってサブルーチンやモジュールをいろいろなプログラムで使えるようにしたもの、
という認識でいいのでしょうか?

519 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 00:35:44 ]
gfortran -c subroutine.f90
ar cr module.a *.o
ranlib module.a
gfortran main.f90 ./module.a
./a.out

でダメか?作った静的ライブラリをパスの通っている場所にコピーして使ってもおk

520 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 21:00:58 ]
プログラムをつい最近始めたばかりの超初心者です。
微妙にスレチですみませんが・・・

intel fortran compiler10.1をknoppix(5.3.1)の環境でインストールしようと思い、
​ttp://www.obihiro.ac.jp/~suzukim/masuda/ifc101_install.html​
の手順にそって行っていました。
しかし、ライセンス文を読み進めたあとに

Where do you want to install to? Specify directory starting with '/'.
[/opt/intel/fc/10.1.015] :

でそのままEnterを押し、インストールが開始され、

Installing...

という文字が出るのですが、そのままPCがフリーズしてしまいます。
何度か再起動しやり直しましたが同じでした。
これはkoppixそのままの環境ではインストールできない
ということでしょうか?
初歩の初歩だと思うのですが、
どなたかご教授お願いいたします。

521 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 00:14:12 ]
knoppix を LiveCD で使っているとか?

522 名前:520 mailto:sage [2008/09/12(金) 01:17:25 ]
CD-Rに焼きこんでそのまま起動させて使っています。
他で少し調べたのですが、
HDDにknoppixをインストールして使うべきなのでしょうか・・・。

523 名前:デフォルトの名無しさん mailto:sage [2008/09/12(金) 11:26:51 ]
容量が足りんとかかなぁ

knoppixのハードディスクインストールって、普通のディストロのインストールと
比べて簡単かなぁ

524 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:30:43 ]
>>519
ありがとうございます。うまくできました。
こうして作ると、modファイルも生成されるのですが、
このmodファイルもライブラリ配布の時に必須なのでしょうか?
modファイルが無いとコンパイルに失敗するので・・・。



525 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 02:17:51 ]
>>522
/opt が CD-R にあるから書き込めないんだと思う
knoppix を HDD にインストールして使えば大丈夫でしょ

>>524
モジュールを使ったライブラリ配布するならモジュールが記述されたソースファイルを配布すればいい

それ以前に、ライブラリを配布するなら全てのソースファイルを配布してくれるのが一番ありがたい
どうしてもソースの公開がいやならば、静的ライブラリだけでなく、動的ライブラリも付けたほうがいい

526 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:02:26 ]
fortran77を使っているのですがファイルをopen分で読み込むプログラムを作成した際
attempt to read past end-of-failというエラーメッセージが表示されます。
この原因と対策について教えていただければありがたいです。

527 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:36:35 ]
>>526
>attempt to read past end-of-fail
end of file じゃないの?
ファイルを読み込んでいるうちに、まだ読まねばならないはずなのに、おしまいまで
来てしまったというエラーだと思う。


528 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 21:56:24 ]
Windows用gFortranに対応しているIDEって何かある?
あと>>503に登録したけどメール来ない(´・ω・`)

529 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 23:05:08 ]
524です。
>>525
ありがとうございます。確かに、ソースファイルを渡すのが手っ取り早いですね。
静的、動的ライブラリがいいんですね。覚えておきます。

何度も質問で申し訳ありません。Fortran90形式でplplotを使いたいと思うのですが、
CMAKEを使って処理をすればよいとのことでしたが、f90コンパイルをONにしてもエラーになって
C++とF77形式のみでしかmakeができません・・・。
できたファイルを見てもほとんどがC++の形式で、VS2005で開いてコンパイルも失敗してしまいます。

どうしたらFortran90形式でライブラリを読み出して使えるようになるでしょうか。

530 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 19:37:35 ]
>>528
eclipse + Photran で大丈夫だと思う。Windows版は使ったことないから保証できんが。

>>529
plplot は使ったことないからわからんな。すまんこ。
おいらはグラフィックは gnuplot に描かせている。system 関数で端末のコマンド打てるから
それ使えば自動でグラフ表示できるよ。

531 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:01:39 ]
>>528
Sign Up Now! のところではなく、右下のLINKを踏んで登録だぜ!



532 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:48:38 ]
もしかすると基本的なことなのかもしれないのですが調べてもわからなかったので・・・
以下のようなファイルに収められた数値を順番(?)に読み込むことは可能でしょうか
200709150   左から4文字までが年、そこから2文字で月、さらに3文字でガソリンの価格
200710151   最近30年を対象に年ごとのガソリン価格の平均を求めるプログラムを作りたいのですが
200711153   とりあえずデータを年・月・ガソリン価格に分けて読ませたいのですが
200712151   なにかいいアイデアはございませんでしょうか?
200801149
(以下同様に続く)

533 名前:532 mailto:sage [2008/09/25(木) 02:50:20 ]
書き忘れましたがfortran77を使ってます

534 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:08:25 ]
format指定すれば簡単に読めるけど、
「調べてもわからなかったので・・・」の内容を詳しくよろしく



535 名前:532 mailto:sage [2008/09/25(木) 09:04:20 ]
詳しくいうといくつかのfortran関連サイトや教科書を見たけどわからなかった  ということです

536 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 09:19:49 ]
>>535
だれが"調べる"の定義を詳しく言えといったんだ…

537 名前:532 mailto:sage [2008/09/25(木) 09:28:28 ]
といいますと・・・

538 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 18:01:49 ]
質問者が主に3種類
1) 自分で調べる気がないので神が答えを書いてくれることを期待した丸投げ
2) 丸投げだと印象が悪いかと思い、調べてもいないくせに「調べてもわかりません」
3) ちゃんと調べたけどわからない勤勉な人

回答:
a) 質3なら回答してあげたい
b) 質2なら遠まわしに回答
c) 質1なら放置

532が教科書等で何を調べたのかどう調べたのかで
教えてあげるかどうか決めたいってことでしょ



539 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 18:21:17 ]
fortranのことで調べてもわからなかったような奴のどこが勤勉なんだよ
こんなもん調べてもわからないような奴の方がカス

540 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 22:08:54 ]
>>532
READ(10, '(I4, I2, I3)') IYEAR, IMONTH, IPRICE

これで読め!



541 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:31:14 ]
read文は終わった後に次の行に改行しますが、改行しないで今の位置を保持する方法ってありますか?

542 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 18:46:24 ]
>>541
do i=1, 3
read(unit=10, fmt='(I5)', advance='NO') n(i)
end do


543 名前:541 mailto:sage [2008/09/27(土) 19:09:10 ]
>>542さん
advanceってreadでも使えるんですか!ありがとうございました。

544 名前:デフォルトの名無しさん [2008/09/29(月) 14:28:56 ]
実行時にエラーメッセージ「invalid character in field」が表示されます
原因として何が考えられますでしょうか




545 名前:544 mailto:sage [2008/09/29(月) 15:35:53 ]
自己解決しました。単純なミスでした・・・
一息ついて後でみると以外とすぐミスがわかったりしますよね

546 名前:デフォルトの名無しさん [2008/09/29(月) 16:42:11 ]
FORTRANってやったことないんだけど
なんかこのスレ見てるぶんには
PL/Iに文法が似てますねえ

547 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 18:28:02 ]
そりゃ大昔の言語という仲間だからな

548 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 23:08:21 ]
>>546
FORTRANの方が先祖だけどな。
PL/I=FORTRAN+COBOL かな。

昔はIBMに勤めると嫌でもならわされていたような。

549 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:48:45 ]
>>530
ありがとうございます。
gnuplotをダウンロードして、早速使ってみました。
うまく工夫すれば直接Fortran計算結果をグラフにできるようなので、いろいろと試してみます。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef