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


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

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



1 名前:デフォルトの名無しさん [2006/01/24(火) 09:48:23 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、 
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 
FORTRAN使いが優しくコメントを返しますが、 
お礼はFORTRANの布教と初心者の救済をお願いします。 


757 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 05:34:16 ]
分割コンパイルくらいは周りの人に聞きゃいいんじゃね?
プログラムできる人、全く居ないのか?

758 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:25:18 ]
>>756-757
初心者には、ハードルが高いと思うよ。
先輩の遺品の中に、makefile というのがどこかにないかな?

例えば、こんなの。
Make と Makefile の説明
ttp://www.unixuser.org/~euske/doc/makefile/

自分の環境を書いた方がいいよ。

759 名前:番組の途中ですが名無しです [2006/07/25(火) 06:41:39 BE:35013825-2BP]
標準出力に出力するとき、改行せず内容を更新したい場合はどのようにすればいいんでしょうか?
具体的には

a = 2.0000000

とあって、aを更新したときに

a = 2.0000000 (改行)
a = 4.0000000

とするのではなく

a = 4.0000000 (改行無しで2が4に切り替わる)

のように表示したいのです。

760 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 06:52:27 ]
>>758
makefile があったら、ハードル高いも何も make 一発じゃないかな?
まあ、make hoge みたいにするようになってる可能性はあるが。

761 名前:迷子 [2006/07/25(火) 07:01:55 ]
周りはC/C++かJavaだけの人(といっても皆さんにわか覚えの人達)しかいないのです。
みんなFortranの方はお手上げです(部屋にはコンパイラすらない)。
一人がVisualC++.netを使ってCの分割コンパイルの仕方を教えてくれたのですけど。
それでFortran部分とリンクが出来ているとは思えないなんてコメントを残すし。
エクスキュータブルには.exeファイルが一つしかないから、
ひょっとしてCとFortranのファイルを全て同時にコンパイルする方法があるのかな?
じゃ、ひょっとして特別な環境じゃなきゃコンパイルできないのかな?
Linuxには富士通からのFortran/C++のコンパイラが出てるみたいだけど...PCには?
もう2週間ほど妄想に迷走しまくっていてます。
こんな超素人ですがよろしくお願いします。

762 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:03:16 ]
コンパイラ無いのに前の人はどうしてたんだろう?

763 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:07:31 ]
とりあえず、FORTRAN も C もオブジェクトファイル(*.o)を吐くんだから
それをそのままリンクすりゃええわけだけども、
注意する事は識別子名がそのまま使える事は限らないってことと、
標準ライブラリをちゃんとリンクするってところだな。

識別子名に関しては既に対策取られてるはずではあるけど、
それもコンパイラが変われば状況変わる可能性があるので、
前の人が使っていたコンパイラが無いなら
またいじる必要があるかもしれん。

あとは、FORTRAN コンパイラを通してリンクするなら C の標準ライブラリを、
C コンパイラを通してリンクするなら FORTRAN の標準ライブラリを
忘れないようにリンクするだけだな。

764 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 07:08:55 ]
gccなら
> gcc *.f *.c
でおk

765 名前:デフォルトの名無しさん [2006/07/25(火) 10:50:42 ]
>>759
標準出力を、FORTRANのラインプリンター制御文字が有効になるモードにして、
改行せずの+を1文字目に出力する。





766 名前:デフォルトの名無しさん [2006/07/25(火) 14:11:04 ]
教えてください!!明日レポート提出です・・
(1)n個のデータa1、a2......anを読み、大きい順に並べて出力する。
(2)y=x**2+1の0から2までの積分地を台形則から求める。
以上の二つをお願いします。(2)がさっぱりです。

767 名前:デフォルトの名無しさん [2006/07/25(火) 14:56:27 ]
>>766
(1) FORTRAN77で初心者っぽく作ってみた

PROGRAM kintama
REAL a(1000)
WRITE(*, *) ' INPUT No. of DATA'
READ(*, *) n
DO 10 i = 1, n
WRITE(*, *) 'INPUT DATA No.', i
READ(*, *) a(i)
10 CONTINUE
CALL sort(n, a)
WRITE(*, '((5F10.4))') (a(i), i = 1, n)
STOP
END
C
SUBROUTINE sort(n, a)
REAL a(n)
DO 10 i = 1, n
DO 20 j = i + 1, n
IF ( a(j) > a(i) ) THEN
tmp = a(i)
a(i) = a(j)
a(j) = tmp
END IF
20 CONTINUE
10 CONTINUE
RETURN
END

768 名前:デフォルトの名無しさん [2006/07/25(火) 15:12:27 ]
>>766
(2) 
解析的には8/3+2|^2_0=4.6666・・・・・・・だが、100分割で計算すると4.6668000
台形公式だしh^2に誤差が比例しているとするとまぁこんなところか。

文関数を使っているがあまりお勧めできない。積分をサブルー朕に、被積分関数をfunctionにすると
もっと通っぽいだろう。あと、台形の面積を正直に求めているが、これは同じ値を2回計算しているので
ウンコである。両端を0.5倍、その他を1倍で足すほうがまとも。

初心者っぽさを出すために、マジ台形で計算してみた。

PROGRAM okki
F(x) = x**2 + 1.0
n = 100
s = 0.0
x0 = 0.0
x1 = 2.0
h = (x1 - x0) / n
DO 10 i = 1, n
x = x0 + h * REAL(i - 1)
s = s + h * ( F(x) + F(x + h) ) / 2.0
10 CONTINUE
WRITE(*, *) ' AREA =', s
STOP
END

769 名前:766 [2006/07/25(火) 18:21:46 ]
>>767-768さん
本当にありがとうございます。助かりました。

770 名前:迷子 [2006/07/26(水) 00:27:33 ]
>>758
>>760
私一人では跳び越せないハードルで見たいです。
ファイル群をmakeとmakefileで検索したのですがmakefileは見つかりませんでした。
ついでに全部のファイルをざっと見ているのですがそれらしきものはまだ見つかっていません。
わたしのPCはデルPrecisionにXPをのせたものです。



771 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 00:44:28 ]
>>762
前の人が僅かに書き残してくれていたノートには
MSの Fortran Powerstation4.0 とVisual C++4.0なるものを使っていたと書かれていました。

>>763
前の人が最後にコンパイルしていったプログラムはしっかり走るようなので
上記の環境用にソースは大丈夫だと思います。
新しい環境での問題は試して比べてみるしかありませんよね?
部屋にはMSVisual C++.netが一つ空いているのですが、
FORTRANのコンパイラはどれでもいいのでしょうか?
またこのCとFORTRANのコンパイラなら大丈夫と言うお勧めはありますか?

772 名前:デフォルトの名無しさん [2006/07/26(水) 00:51:09 ]
すいませんが誰かこの問題のプログラムを解ける人、教えていただけないでしょうか。
レポートの提出が明日の13時です。
(1)ニュートン法を用いて、
式ZIN=(√Ur/12.0)×tanh((J×6.28×5000000000)/(3000000000×(√12×Ur)×0.005))で、

ZIN=0.4296446とありUrを求めるプログラムです。
Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6となるはずです。
よろしくお願いします。 

773 名前:デフォルトの名無しさん [2006/07/26(水) 00:54:36 ]
>>772
Jの値がないんだが・・・・ 工学部で虚数単位をJと書いているようにも見えないし・・・

問題文を全部かい手味噌

774 名前:デフォルトの名無しさん [2006/07/26(水) 00:59:45 ]
すいません。
J=(0,−1)とおいてプログラムするそうです。

775 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 01:07:28 ]
>>771
そのFortran PowerstationとVC++4.0はどこ行ったんだよ。
どうしてもコンパイルし直す必要があるならIntel Visual Fortranでも買ってもらえ。



776 名前:デフォルトの名無しさん [2006/07/26(水) 01:23:24 ]
>>774
おk Jは虚数単位だったかw
複素のニュートン法か、めんどいな。 

どうしてもっと早く持ってこない!もう眠いwww

>>771
FortranPowerStationは、IO周りにメモリーリークのバグがあるので注意。

あと、VisualC++がマネージドコードしか出せないversionだと、
FortranとはLINKできなかったはず。IntelVisualFortranを買うなら環境は統合できるが
そのへん注意が必要。

INTELのサイトから2週間試供品が落とせるので、まず試してみるのがよかんべ。
2週間以内にすべてを終わらせる勢いでがんばるという手もある。
インテルは一年ごとの更新料がかかる。

FORTRANコンパイラを買うとCコンパイラが付属してくるものもある。
LaheyやABSOFTのプロフェッショナル版を買うと、Cコンパイラが付属してくるので、
若干敷居が低くなるかもしれない。

Laheyのものは富士通のOEMだが富士通とちがってWindows版もある。
値段的には8万円コースか。

値段の安いものとしてはNAGの入門版があるが、使ったことはない。
ライセンス条件はうざい感じが漂っている。
NAGは文法に厳密だが、スピードは遅いという特徴がある。
www.nag-j.co.jp/FortranBuilder.htm

777 名前:迷子 [2006/07/26(水) 01:47:40 ]
夜遅くにレスありがとうございます。
>>775
コンパイラが入ってたPCは昨年に廃品回収されてしまいました〜
ソフト本体は前の人が持っていってしまったようです。
>>776
うーどれも結構なお値段ですね。
ちょっと比べてみて私に使える物をせびってみます。


778 名前:デフォルトの名無しさん [2006/07/26(水) 10:38:17 ]
>>772
ちゃんと問題文写してるか?
質問がウンコだと、答えもウンコにならざる終えない。

そもそも式が良く分からん 5000000000)/(3000000000  こんな数が出るとは思えない。
Jは虚数単位なのか、そのマイナスなのか良く分からん。ルートのかかっている範囲も分からん。

>Ur=Ur1+Ur2で答えがUr1=13,Ur2=−6 
この意味も分からんが、実部と虚部ということにしておく。

上記の可能性を色々変えても、答えのUrは式を満たさない。
故にニュートン法を試そうにもどうにもならん。

もう時間もないし、素直に0点をもらいなさいw

ローボコン 0点


779 名前:689にて質問したものです [2006/07/26(水) 15:49:52 ]
PROGRAM main
INTEGER,ALLOCATABLE:: sqmx(:,:)= 0
INTEGER:: l, m, n, i, sum = 0
PRINT'("正方行列の行数は? ",\)'; READ*, l
ALLOCATE( sqmx(1:l, 1:l) )
DO i = 1, l
DO m = 1, l
PRINT'(A,I2,A,I2,A, \)',"第", i, "行", m,"列の要素は? "
READ*, sqmx(i,m)
ENDDO
ENDDO
PRINT*, det(sqmx)
CONTAINS
RECURSIVE FUNCTION det(sqmx) RESULT(res)
INTEGER,INTENT(IN)::sqmx(:,:)
INTEGER:: res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,1)-1)
n = SIZE(sqmx,1); res = 0
IF(n == 1) THEN
res = sqmx(1,1)
ELSE
DO i = 1, n
wk(:,1:i-1) = sqmx(2:,1:i-1)
wk(:,i:n-1) = sqmx(2:,i+1:n)
res = res + sqmx(1,i)*det(wk)*(-1)**(i-1)
ENDDO
ENDIF
ENDFUNCTION det
END
「再起呼び出しをもちいてn×nの正方行列をもとめよ」
以前ヒントをいただき、うえのようなプログラムをつくったのですが、未だにうまく動かず
生き恥をさらしています。どこに問題があるのでしょうか?教えてください。1×1、2×2は
うまくいくのですが3×3でうまくいかないのです。

780 名前:デフォルトの名無しさん [2006/07/26(水) 17:46:27 ]
>>779
お答えしよう、問題は副関数がわでINTEGER::i,nの宣言をしていないために、
主プログラム側のi,nをグローバル変数として使用してしまい、
このために再帰で呼び出すたびに、i,nの値が書き換わってしまうからである。

主プログラム内で、CONTAINSを使うときは、これがおきるのでよっぽど簡単なサブルーチン
以外は面倒でも独立したMODULEで作ったほうが安全w

グローバル変数コワスwwwww

781 名前:689にて質問したものです [2006/07/26(水) 19:18:01 ]
780さんありがとうございます。containsは使わないほうがよいということですね。
もう少し煮詰めてみます。

782 名前:デフォルトの名無しさん [2006/07/26(水) 19:26:33 ]
>>781
いや、言葉が足りなかった。開発のときには使わないほうがいいということ。
おkなのが確認されたら一体化すればいい。

MODULEだってグローバル変数に関しては同じ危険があるのだが、
MODULEのグローバル変数に、i,j,nやx,y,aなど普段使う変数を入れるのは稀だ。
しかし、メインプログラムでは使わないことは少ない。それで、もし今回のようにCONTAINされる側で
うっかりi,j,n等を宣言し忘れたらどうなるか?メイン側で使っていなければエラーがでるが、
メイン側で使っているとエラーがでないし、今回のように悪性の間違いになってしまう。
予防の問題だ。


CONTAINS
RECURSIVE FUNCTION det(sqmx) RESULT(res)
IMPLICIT NONE
INTEGER,INTENT(IN)::sqmx(:,:)
INTEGER:: i, n, res, wk(SIZE(sqmx,1)-1, SIZE(sqmx,2)-1)
〜〜〜〜〜〜〜
n = SIZE(sqmx,1); res = 0
IF(n == 1) THEN
res = sqmx(1,1)
ELSE
DO i = 1, n
wk(:,1:i-1) = sqmx(2:,1:i-1)
wk(:,i:n-1) = sqmx(2:,i+1:n)
res = res + sqmx(1,i)*det(wk)*(-1)**(i-1)
ENDDO
ENDIF
print *, n, res
〜〜〜〜〜〜〜これで再帰の挙動がみられるので、i,nを宣言した場合としない場合の違いが見れる
ENDFUNCTION det

783 名前:689にて質問したものです [2006/07/26(水) 20:27:43 ]
782さん、具体例まで示していただき本当にありがとうございます。
プログラムが動きました!!自分のちからでないにしても感動があります。
逆に勉強不足も痛感していますが。本当にありがとうございました。

784 名前:デフォルトの名無しさん [2006/07/26(水) 22:45:41 ]
質問させてください。
配列を使用した場合、小数点以下の桁数を指定して出力することはできないのでしょうか?


785 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 22:58:59 ]
>>784
普通に書式を指定すればおk



786 名前:デフォルトの名無しさん [2006/07/27(木) 00:02:52 ]
>>785
うーん、formatとかつかうんですかねー?
もう少し具体的に教えていただけないでしょうか?すみません

787 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 00:46:10 ]
>>786
普通の変数だろうが配列だろうが入出力の書式指定はいっしょ

DOUBLE PRECISION X(5)
DO 10 I=1, 4
X(I)=1.D0/I
WRITE(6,100) X(I)
10 CONTINUE
X(5) = 4.D0 * ATAN(1.D0)
WRITE(6,'(1X,F12.9)') X(5)
100 FORMAT(1X,F6.3)
END

788 名前:デフォルトの名無しさん [2006/07/27(木) 00:59:17 ]
ありがとうございます。
うまくいきました。ホント初心者なんで助かりました。

789 名前:デフォルトの名無しさん [2006/07/27(木) 01:51:55 ]
>>788
FORMATは、足りなくなったら直前のカッコの所までもどってそれを繰り返す。
ゆえに、1行目だけ特殊で、2行目以降繰り返しというようなことも出来る。


■ print '(a, i7, 3f10.3,/ (5F10.3))', ' kintama okki', i, (x(i), i = 1, 13)

■ kintama okki 1 1.000 1.000 1.000
   1.000 1.000 1.000 1.000 1.000
    1.000 1.000 1.000 1.000 1.000


(/は改行。)

(x(i), i = 1, 13) は、入出力のとき使えるDO....LOOPの一種。F90になってからはあまり必要なくなったがF77だと便利。





790 名前:デフォルトの名無しさん [2006/07/29(土) 18:03:58 ]
質問です。

卒論でFortranを勉強する必要があって、普段は環境の整っている学校のパソコンを使っています。
しかし、夏休みで実家に帰るので、ノートPCにもFortranが作動する環境を入れたいのですが、
フリーで手に入るソフト類はないでしょうか?
可能なら、それをダウンロードするページも教えていただけたら助かります。

791 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 18:12:18 ]
>>790
pc8.2ch.net/test/read.cgi/tech/1104724162/3

792 名前:790 [2006/07/29(土) 18:32:28 ]
>>791
ありがとうございました。

793 名前:デフォルトの名無しさん [2006/07/30(日) 23:04:31 ]
n(任意の整数)の4乗は何桁になるか表示せよ

という問題が分かりません。お願いします。

794 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 23:19:23 ]
一般的にある数の桁数は、その数の10を底とする対数の整数部に1を足した値になる。

795 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 01:55:04 ]
メモメモ



796 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 03:38:41 ]
高校で習う筈だが。

797 名前:デフォルトの名無しさん [2006/07/31(月) 08:36:28 ]
質問です。自作のプログラムがどうしてもコンパイルできないです。
経験者の方にどこが間違ってるのか見てほしいんですが、そういう質問はこのスレでも受け付けてくれますか?

798 名前:797 [2006/07/31(月) 09:18:44 ]
過去ログ読みましたorz
>799にプログラムを貼るので、どこが間違っているのか指摘していただけると助かります。

サブルーチンの関数を用いてa,v,xを更新していくプログラムです。

799 名前:797 [2006/07/31(月) 09:21:14 ]
! ---宣言文---
implicit none
real yy,aa,vv,xx,aa2,vv2,xx2,tt,dt,mm,cc,kk,beta
integer n,i
tt=0

!---入力---
write(*,*) 'input m,c,k' !システム条件の入力
read (*,*) mm,cc,kk
write(*,*) 'input beta' !βの入力
read (*,*) beta
write(*,*) 'input a0,v0,x0' !初期条件の入力
read (*,*) aa,vv,xx

800 名前:797 [2006/07/31(月) 09:22:03 ]
!---ファイルオープン---
open(10,file='jishindou.txt')
open(20,file='outouchi.txt')
read (10,*) n,dt

!---初期値の書き込み---
write(20,*) tt,aa,vv,xx

!---doループによる計算---
do i=1,n
read (10,*) yy
call reply(yy,aa,vv,xx,aa2,vv2,xx2)
aa = aa2
vv = vv2
xx = xx2
tt=tt+dt
write(20,30)tt,aa,vv,xx
30 format(f4.1,3f6.3)
end do

801 名前:797 [2006/07/31(月) 09:23:00 ]
!---ファイルクローズ---
close(10)
close(20)
stop
end

!---サブルーチン副プログラム---
subroutine reply(y,a,v,x,a2,v2,x2)

real y,a,a2,v,v2,x,x2
a2 = -(y+cc*(v+a*dt/2)/mm+kk*(x+v*dt+a*dt**2*(1/2-beta)))
& /(1+cc*dt/2/mm+kk*beta*dt**2/mm)
v2 = v+dt*(a+a2)/2
x2 = x+v*dt+a*dt**2*(1/2-beta)+beta*a2*dt**2

end subroutine reply

以上です。

802 名前:デフォルトの名無しさん [2006/07/31(月) 10:05:41 ]
>>797
固定フォーマットで書いたのか、自由形式で書いたのかよく分からないが、
自由形式なら継続行の1行目の尻に&を書いておく必要がある。

そうすればコンパイルは通るぞ。

803 名前:デフォルトの名無しさん [2006/07/31(月) 10:12:13 ]
>>793
PROGRAM yasukuni
WRITE(6, *) 'input n'
READ(5, *) n
x = REAL(n**4)
k = INT(LOG10(x)) + 1
WRITE(6, *) n, '**4=', INT(x), ': ', k
STOP
END

FORTRANでは普通のLOGは自然対数なので、10進法での桁を求めるには常用対数LOG10を
呼ぶ必要がある。


804 名前:797 [2006/07/31(月) 11:07:34 ]
>>802

固定フォーマット(のつもり)です。コピペしたときにずれてしまったんですが、
サブルーチン内でa2を計算している箇所の、2行目の6列(6カラム)のところに&を入れています。
ご指摘いただいたのはそこの部分でしょうか?

805 名前:デフォルトの名無しさん [2006/07/31(月) 11:27:15 ]
>>804
うい。固定フォーマットだったか。失敬。
FORTRAN77の表記とFortran90の表記が入り混じっているので、どちらとも判断できなかった。
とりあえずどっちでもコンパイルできたぞ。

いちおうエラーメッセージを貼ったほうが、皆の衆の助言はもらえやすいと思うぞ。
せめてエラー行とか。





806 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 19:23:14 ]
>>797-801
subroutine reply の方でdt, mm, cc等の変数が宣言されておらず
値が不定のまま使われている。

たとえ同じファイルの中に書いてあっても、主プログラムと副プログラムとでは
変数の有効範囲が別々になるので注意が必要。

807 名前:デフォルトの名無しさん [2006/08/01(火) 22:08:22 ]
DQNな質問で恐縮なのですが...
write文やread文で装置番号を用いずに直接ファイルにアクセスする方法はないでしょうか?
出力するパラメータが増えるごとにほかのすでに出力しているファイルが使っている装置番号と干渉しない装置番号を探さねばならず困っています。

808 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 00:28:46 ]
>>807
inquireを使えば何とかならないかな。

program nurupo
logical :: opened
character(len=6) :: string
open(10,file="test10")
i=10
do
inquire(unit=i,opened=opened)
if(.not.opened) then
write(string,'("test",i2)') i
open(io,file=string)
write(*,'(i2," opened")') i
exit
endif
i=i+1
enddo
end program nurupo


809 名前:デフォルトの名無しさん [2006/08/02(水) 00:51:00 ]
>>807
Fortran規格内では無いと思う。 番号を指定しない入出力は、PRINTとREADだが
これは標準出力ということだから意味ないし〜
同時にアクセスするのでなければ、いちいちOPEN/CLOSEするしかないかも。
F90ではAPPEND MODEでOPEN出来たりするので77時代よりは使いよい。

3桁の装置番号が使える系もあったりするが、大抵は2桁までなので使用ファイルが増えると困ることがある。


FORTRANの装置番号は確かに改良の余地がある。

ISOにコネのある人は、次の規格で何とかするように提案してくださいw



この他にも、01〜09あたりや90番台が予約されている処理系もあったりするので、
知らずに移植したりすると、奇怪な挙動を示して泣く。

まぁEBCDIC/ASCII 問題、浮動小数のFORMAT問題、IO STATの返り値問題と
数十年来の問題が規格において徐々に解決してきているので、装置番号問題も
日ごろから不平不満を漏らしていれば、いつかは解決すると思うw




810 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 04:00:00 ]
改良と言うか、装置番号をこちら側から指定するっつー仕様自体がアレだよなあ。
そんなもんは内部で決めてもらわないと。

811 名前:デフォルトの名無しさん [2006/08/02(水) 18:03:54 ]
>>808-810

みなさん、いろいろとありがとうございました。
>>808さんの方法を試しつつFortran2010(?)まで待つことにします。

812 名前:デフォルトの名無しさん [2006/08/03(木) 00:23:38 ]
NEC 日立 富士通 あたりはISOと関わっているはずだから、
喚いているとそのうち声が届く可能性は無きにしも非ずだな。

2015年のジェッターマルス時代までには何とかなるだろうさ。



813 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:10:07 ]
すいませんが、次の課題のヒントだけでももらえないでしょうか。

関数f(x)=x^2+1を台形公式を用いて積分し,出力するプログラムを作成せよ。ただし,次の点に留意してプログラムを作成すること。
・積分区間の下限値a,上限値bはキーボードから入力する。
・分割数nの値は5から20まで5刻みで増加させて繰り返し計算する(すなわち,分割数5,10,15,20の場合について計算する)
・台形公式の計算にはサブルーチン副プログラムを用いる。
・関数f(x) の計算には関数副プログラムを用いる。

台形公式とは。
与えられた関数f(x) を区間[a,b]について積分するとき図のように関数f(x)をn等分して,各区間の曲線を直線で近似し,n個の台形を作る。n個の台形の面積をS1,S2,・・・,Snとすると,全面積Sは近似的に,
S = S1 + S2 + ・・・ + Sn
となる,ここでn等分した小区間の幅hは,
h = (b-a)/n
となるので,各台形の面積は
S1 = h・(Y0+Y1) /2.0
S2 = h・(Y1+Y2) /2.0
・・・
Sn = h・(Yn-1+Yn) /2.0
となる。したがって,全面積は,
S = S1+S2+・・・+Sn
= h・{(Y0+Yn)/2.0+(Y1+Y2+・・・+Yn-1)}
と近似できる。

814 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 09:32:18 ]
>>813
program trapez
read(*,*) a,b
do n=5,20,5
call calc_area(a,b,n,area)
print *,n,area
enddo
end program trapez

real function fx(x)
fx=x*x+1
end function fx

subroutine calc_area(a,b,n,area)
real,dimension(:),allocatable :: y
allocate(y(0:n))
h=(b-a)/float(n)
do i=0,n
y(i)=fx(a+i*h)
enddo
area=h*((y(0)+y(n))/2.+sum(y(1:n-1)))
deallocate(y)
end subroutine calc_area


815 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 10:32:59 ]
>>814
ありがとうございます。
でも、自分でなんとか作ってみました。
ものすごく拙いプログラムですけれど…
時間をとらせてしまってすいませんでした。



816 名前:デフォルトの名無しさん [2006/08/03(木) 21:48:03 ]
超絶初心者なんですが明日試験があるのでなりふり構わず質問させていただきます
7.0D0/3.0D0とかにあるDってのはなんなんでしょうか?

817 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:51:57 ]
double precision

818 名前:デフォルトの名無しさん [2006/08/03(木) 22:04:25 ]
>>817
ごめんなさい、どういう意味なんでしょうか・・・
そしてさらにわからない問題あるんでお願いします

INTEGER I,J,K
I=11
K=o
DO 10 J=5,1,-2
IF (J.LE.I)THEN
K=K-J
END IF
I=I+K
10 CONTINUE
WRITE(*,*) K
を実行したときに表示される数を求めよ
これがどういうことをやるプログラムなのかも教えてくれると更に嬉しいです・・・

819 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:16:05 ]
参考書嫁

820 名前:デフォルトの名無しさん [2006/08/03(木) 22:23:19 ]
ごめんなさい、手元にある参考書っていうか教科書が
初心者の為に簡潔に書いているせいか、なんか意味がわからないんです
何回も読んでみたんですけど何でそうなるのか理解できないんです
スレ汚して申し訳ありませんでした

821 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:58 ]
>>818
Oと0、Iと1って間違いやすいよな。

今これが分からないのなら明日の試験は絶望的だぞい。

822 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:32:09 ]
I と 1 は間違えてないと思うが。

823 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:20:29 ]
最悪なのは小文字のlと1だろう。

やっぱ大文字最高!!w

824 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:35:45 ]
>>823
同意。
ただ全角スペースは見た目が半角とつかない。

825 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:06:37 ]
大文字でプログラムを書く人は CAPS LOCKにしているの?

vi でプログラムを書いていると、 CAPS LOCK にすると意図に
反する編集をしてしまいそうで怖い。でもずっと shift を押し
ながら打つのも面倒。
それで小文字で書いてます。



826 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 16:36:44 ]
プログラムするなら、ちゃんと文字を区別できるフォントにしなきゃ。

827 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 08:49:17 ]
つまり、こんなフォントを使えば良いんだな。
ttp://www.geocities.com/TimesSquare/4965/

828 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:31:49 ]
Osaka 等幅で十分

829 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:51:22 ]
必ずしも等幅フォントである必要はないね。エディタ(或いは表示系)が勝手に
等間隔に配置してくれるだけでも事は足りるから。

830 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 16:22:18 ]
質問があります。
ある文献のFORTRAN77で書かれたプログラムを、練習がてら
そのまま書き写してbuildすると

libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
test.exe - 2 error(s), 0 warning(s)

とりあえず、build errorの中を調べてみたんですが、全く解決できません。
コンパイルエラーはゼロです。

どのような解決方法がありますか?教えてください。

831 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 18:02:10 ]
>>830
program文がないんだよ。

FORTRANのプログラムは program 文で始まり end program 文で終わる。
program文をちゃんと書いたか確かめてみな。

832 名前:デフォルトの名無しさん mailto:sage [2006/08/08(火) 19:02:10 ]
program 文は一応あってもなくてもコンパイル可能。普通は書くけど。
end は大事だけど、end がないだけだとそういうエラーにはならない。

このエラーが出てくるのは、
関数とかサブルーチンとかしか定義してないファイルの場合。
まあ、それを指して「program 文がない」と表現してるのかもしれないけど。

833 名前:デフォルトの名無しさん [2006/08/09(水) 13:06:31 ]
age

834 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:51:51 ]
>>831-832
うーん。なるほど。
なんとかがんばってみます。ありがとうございます。

835 名前:デフォルトの名無しさん [2006/08/09(水) 23:39:19 ]
>>831-832
おまいら、ここは初心者スレなんだからもっと優しく教えてやれよ!

さぁ次はしょんべんだ!ってかんじでさー





836 名前:デフォルトの名無しさん [2006/08/10(木) 09:54:51 ]
しょんべんワロタ


837 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 16:55:46 ]
       ______       |
    ,,..-‐";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;` 、   i       あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;、  ヽ  つ   あ
  /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|  〉  ぎ   :
  |;;;;i "'`~  "`~ `i||i" '' ゙` " |;;;;;;|  /  は   :
  |;;;;|       ヽ`     u  |;;;;;| |    シ
  .|;;| ,-;;;;;;;;;;"フノ  ヾ`;;;;;;;;;;;;;;;ヽ |;;;;| |    ョ
 ,,ト;| ',,_==-、く    >゙-==、  |/ i |   ン
 |i 、|   ' ̄"彡|         || | |    べ
 |'. (|       彡|          |)) | .|    ン
  ! 、|      i,"(_ ,, 、,      |" i  |   だ
  ヽ_|        `         .|_/  ノ_
   .|゙      、,.−-‐ 、,,     |     ヽ、_,,,、_ノ
   .i ゙、    '  ̄ニ ̄     /|
   |   、      ̄ ̄    , ' |
   |  i ` 、    (    , "   |
    |      ` ー---― "|    |
   |  |          i     |

838 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 21:33:56 ]
>>835
ソースがなければ、これ以上どうにもならん。

839 名前:デフォルトの名無しさん mailto:sage [2006/08/11(金) 00:10:30 ]
ソースがなければ、しょう油をかければ良いじゃない!
文句があるならベルサイユへいらっしゃい!!

840 名前:デフォルトの名無しさん [2006/08/15(火) 16:48:28 ]
自宅のWindowsPCでfortranを使いたいのですが
インストール用のディスクを入れると

This kit does not support the currently
running Operating system or Hardware

と表示されます。「あきらめろ」てことでしょうか。
動かす方法があれば教えてくださいっ

841 名前:デフォルトの名無しさん mailto:sage [2006/08/15(火) 17:06:54 ]
そのFORTRAN処理系に未練があるのなら、
処理系の動作環境を確認して、
それに応じたOSとハードを用意すればいい。

842 名前:デフォルトの名無しさん [2006/08/15(火) 21:08:04 ]
>>840
基本的にはあきらめろってことだw

しかし、せめてOSの種類とインストールを試みているコンパイラの名前くらい
書かないとまともな返事は期待できないw


843 名前:デフォルトの名無しさん mailto:sage [2006/08/17(木) 01:11:50 ]
>>840
つ ttp://www.google.co.jp/search?hl=ja&q=%22This+kit+does+not+support+the+currently+running+Operating+system+or+Hardware%22&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

844 名前:デフォルトの名無しさん [2006/08/20(日) 21:02:50 ]
さあ、楽しい夏休みも残り二週間だ。
みんな、宿題はもう終わったかな?

845 名前:デフォルトの名無しさん [2006/08/22(火) 06:28:00 ]
Absoft の コンパイラーをWinXP上で使ってもらったソースのコンパイルをしようとしています。
現在、ソースのコンパイルは出来るのですが、そのプログラムが壊れているようです。
調べてみると 以下のような getarg の部分でつまずいているみたいです。

...
character*100 extflag, newbin, oldbin, schnam
integer*2 status
...
ii = 1
call getarg(ii, extflag, status)
ii = ii + 1
call getarg(ii, iname, status)
...

getargについてすこし調べたのですが説明はすべて二つのパラメターを用いることを前提としているようなので
この部分が何をしているのかわかりません。何をしようとしているのでしょうか?
また、この部分のコンパイルの問題を解決する方法はありますか?
お願いします。



846 名前:デフォルトの名無しさん [2006/08/22(火) 10:38:20 ]
GETARG はコマンドライン引数を受け取るサブルーチン。
Fortran2003で正式の規格に入ったが、それ以前のバージョンではメーカーごとの
独自拡張仕様である。が、たいていは存在している。

解決法
1.コマンドライン引数を使わないならコメントにして飛ばす。
2.マニュアルの後ろのほうにある、非標準メーカー拡張の章をしらべて書き直す。
(たいていはPOSIX規格互換になっているので、微妙な修正で解決できると思う。)


847 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 18:23:24 ]
保守党

848 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 08:34:44 ]
コンパイル時にエラーがないのに実行できないのはプログラムに問題があるという事なのでしょうか?

849 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 10:29:29 ]
はい、そうです。

850 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 12:06:38 ]
実行環境の方に問題がある場合もある。

851 名前:初心者 [2006/09/02(土) 06:26:17 ]
くだらない質問ですみません・・・
Compaq Visual FortranとFortran77を用いる際、プログラムの違いはあるのでしょうか??

あと、前者を用いて、分割数を上げていき、円周率を求めるプログラム例がわかりません。
どなたかご教授願えないでしょうか?

852 名前:デフォルトの名無しさん [2006/09/02(土) 08:13:32 ]
module oppai
contains
real function pi()
pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164
return
end function pi
end module oppai
program main
use oppai
implicit none
print *, pi()
stop
end program main

853 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:11:39 ]
>>848
chmod a+x

854 名前:デフォルトの名無しさん mailto:sage [2006/09/02(土) 10:24:05 ]
program hoge
implicit none
integer, parameter :: WP = SELECTED_REAL_KIND(15)
integer :: i
do i = 8, 160, 8
print *, "分割数:", 4*i, ", π =", oppai(i)*4
end do
stop
contains
pure function f(x)
real(kind=WP), intent(in) :: x
real(kind=WP) :: f
f = 1 / (1 + x**2)
end function f
pure function oppai(n)
integer, intent(in) :: n
integer :: i
real(kind=WP) :: oppai, dx, s
dx = 1.0_WP / n
s = 0
do i = 1, n/2
s = s + f(2*(i-1)*dx) + 4*f((2*i-1)*dx) + f(2*i*dx)
end do
oppai = s * dx / 3
end function oppai
end program hoge


855 名前:デフォルトの名無しさん [2006/09/07(木) 23:09:34 ]
すみません。フリーのFortran90/95のプログラム作成ツールありませんか?

それで質問なんですけど。定積分をするときにf(x)=3*x**2などのような簡単な関数は

処理の手前に文関数として定義することで認識されて計算できるのですが、

f(x)=erfc(a*x)+(4*a*c)*exp(2*a*k)+・・・・・・・・・・・・・・・・のような長い関数を

文関数として定義してやると、エラーが出ます。エラーの内容は配列とみなされどうのこう

のといったないようです。どうしたらよいでしょうか



856 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 03:27:36 ]
>>855
>フリーのFortran90/95のプログラム作成ツールありませんか?
ttp://www.g95.org/

>それで質問なんですけど。
ttp://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/sec8.html#8.2.


857 名前:デフォルトの名無しさん [2006/09/08(金) 20:50:48 ]
ファイルをオープンして入力処理をしているプログラムを安全に中止する方法
はありますか?ctrl+cで強制終了するとファイルが壊れる恐れがあることを聞きました。
linux環境で実行しています。

どうか、よろしくお願いします。

858 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 23:13:53 ]
>>857
読み込みだけならCtrl-C(SIGINT)を受け取って終了する時にファイルが壊れることは無いと思うが
心配ならSIGINTを無効にするなり、自分でシグナルハンドラを書いて適切な終了処理をさせれば良い。

処理系依存でSIGNALとか言う感じの関数なりサブルーチンが用意されている(ことが多い)

859 名前:デフォルトの名無しさん [2006/09/09(土) 02:24:31 ]
858さん

教えて頂いてありがとうございます。
知識不足なので、これを手がかりにやってみます

860 名前:デフォルトの名無しさん [2006/09/12(火) 21:24:00 ]
TBasicなのですが・・・
キーボードから西暦年を入力し、その年が閏年かどうかを判定するプログラムを作れ。
但し、if文は一つだけ使うこと。

1.西暦が4で割り切れると閏年である。
2.ただし西暦が4で割り切れても100で割り切れる年は閏年としない。
3.ただし西暦が100で割り切れても400で割り切れる年は閏年とする。

if ((a mod 4 = 0) or (a mod 400 = 0)) and (a mod 100 <> 0) then

こうすると2000年が閏年ではなくなってしまうのですがどうすれば良いのでしょうか?
どなたか教えてください。お願いします。

861 名前:デフォルトの名無しさん mailto:sage [2006/09/12(火) 21:56:29 ]
スレ違い


すれ立てるまでもない質問はここで 第78刷
pc8.2ch.net/test/read.cgi/tech/1157765060/

862 名前:デフォルトの名無しさん [2006/09/12(火) 22:52:28 ]
>>860
結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。

つぎにこの課題はすでにこのスレで2回ぐらい出てきている。過去レス嫁。

最後にここはFortranスレなのでBasic野郎は失せやがれ!w


863 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 02:55:02 ]

> 結論から先に言うと2000年はうるう年ではない。カレンダーを見て確かめろ。 

え?
ホントに2000年のカレンダー見たの?


864 名前:デフォルトの名無しさん [2006/09/13(水) 03:48:58 ]
>>863
グレゴリオ暦じゃないんだろw



865 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 08:01:29 ]
2000 年は閏年だよー。
普通は 100 年ごとに閏年じゃないけど 400 年ごとに閏年なんだよ。



866 名前:デフォルトの名無しさん mailto:sage [2006/09/13(水) 13:08:27 ]
そろそろ本題に入ろうよ><

867 名前:860 [2006/09/13(水) 15:56:18 ]
ご迷惑をお掛けしてすみませんでした。今後気をつけます。

868 名前:デフォルトの名無しさん [2006/09/21(木) 13:10:11 ]
はじめまして。
授業でfortranの授業をやっているのですが、さっぱりわかりません。。
ソフト?は77でやってます。
この問題を誰か解いてください涙。。

行列の計算

  1 2 3     −1 −2
A= 4 5 6 B= −3 −4
  7 8 9     −5 −6
A*B
この行列のプログラム、教えていただけないでしょうか。
お願いいたします。

869 名前:デフォルトの名無しさん [2006/09/21(木) 14:15:44 ]
>>868
まず、手でA*Bの計算はできるんだろうな??

870 名前:デフォルトの名無しさん [2006/09/21(木) 14:16:44 ]
できます!!!!!!

871 名前:デフォルトの名無しさん [2006/09/21(木) 14:48:20 ]
AとBを2次元配列に入れる
ex. A(1,1)=1, B(3,2)=-6

A*B=Cとするなら、
C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)
とうい具合にC(1,1)〜C(3,2)まで6個式を書けばいい。

872 名前:デフォルトの名無しさん [2006/09/21(木) 14:52:13 ]
do ループをつかわなければならないんです;。

873 名前:デフォルトの名無しさん [2006/09/21(木) 14:58:55 ]
すみません。どうにかできそです^^

874 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 21:18:24 ]
>>868
mixiでも質問してだだろ。

875 名前:デフォルトの名無しさん [2006/09/21(木) 22:06:02 ]
>>873
がんばれ!

うまくいかなかったら、また聞きに来い

そのかわりちんちんうp



876 名前:デフォルトの名無しさん mailto:sage [2006/09/29(金) 13:40:50 ]
ルンゲクッタつかおうとおもったら
functionの形じゃないとだめですかね?
というかfunction以外でできる方法あるの?

877 名前:デフォルトの名無しさん [2006/09/29(金) 20:54:07 ]
>>876
つ SUBROUTINE

878 名前:デフォルトの名無しさん [2006/09/30(土) 00:22:52 ]
簡単すぎて申し訳ないとは思うんですがどうしていいのか...

real dI,dV,dR3,R1,R2,R3,Rx
write(*,*) 'dR3 ?'
read(*,*) dR3
write(*,*) 'R1 ?'
read(*,*) R1
write(*,*) 'R2 ?'
read(*,*) R2
write(*,*) 'R3 ?'
read(*,*) R3
write(*,*) 'Rx ?'
read(*,*) Rx

dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))

write(*,*) 'dI=',dI

dV=dI*9090

write(*,*) 'dV=',dV
stop
end



879 名前:デフォルトの名無しさん [2006/09/30(土) 00:24:32 ]
をコンパイルするとこんなエラーが出ました。
どうすればいいのですか?

0013) dI=R2*2*dR3/(R1*R2(R3+Rx)+R3*Rx(R1+R2)+9090(R1+R2)(R3+Rx))
0014)
*** R2 is already in use as a local name
1 ERRORS [<MAIN@>FTN77 Ver 4.03]

*** Compilation failed

880 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 00:32:21 ]
13行目途中から掛け算の*が消えているのを直せばいいんじゃない?

始めに消えたR2(R3+Rx)のとこで、R2が実数ではなくて関数とみなされたんで、
もうR2ってのは実数として定義してますよっていうエラーだと思う。

881 名前:デフォルトの名無しさん [2006/09/30(土) 00:35:20 ]
いけました!ありがとうございます!

882 名前:初心者 [2006/10/04(水) 21:11:02 ]
フォートランでサブルーチンを使ってフーリエ変換をするプログラムをつくりましたが、横軸の値のとり方がわかりません!!わかる方いらっしゃいましたらどうか教えてください!

883 名前:デフォルトの名無しさん [2006/10/04(水) 22:18:19 ]
>>882
その質問では、そなたがフーリエ変換をよく理解していないという以外分からない。

もう少し、詳しく書き込め 3行で


884 名前:sage [2006/10/05(木) 05:43:12 ]
>>882
横軸は、周波数か周期では?

885 名前:初心者 [2006/10/05(木) 18:46:37 ]
作ったプログラムを書きます。
C
USE NUMERICAL_LIBRARIES
PARAMETER(NN=3000000)
C
REAL XN(0:NN),XX(0:NN),N(10000),COEF(0:NN),FFTN(0:NN)
INTEGER NNF
CHARACTER DATAFILE*35
C
DATAFILE='experience.csv'
OPEN(100,FILE='data.csv')
DO 110,I=1,1024
READ(100,*) XN(I)
110 CONTINUE
CLOSE(100)
C
N=I
NNF=I
CALL FFTRF(NNF, XN, COEF)
DO 200 K=0,(NNF)-1
FFTN(K)=ABS(COEF(K))/DBLE(NNF/2)
200CONTINUE
C
OPEN(200,FILE='OUTPUT.dat')
DO 210,K=0, NNF-1
WRITE(200,*)  FFTN(K)
210CONTINUE
CLOSE(200)
END
縦軸はFFTN(K)ですが、横軸の周波数をどのようにすればいいのでしょうか??




886 名前:デフォルトの名無しさん mailto:sage [2006/10/06(金) 03:08:16 ]
>>885
プログラムがどうこう言う前にフーリエ変換の基礎から勉強し直せ。

887 名前:デフォルトの名無しさん [2006/10/07(土) 00:34:18 ]
関数COTH(X)を使うために、実行文の前に
COTH(X) = 1.0 / TANH(X)
と定義したのですが,コンパイルしてみると
COTH is not an array
とエラーが出ます。どんな原因が考えられますか?

888 名前:デフォルトの名無しさん [2006/10/07(土) 02:17:17 ]
>>887
コンパイラは何ですか? 
文関数は最新の規格では廃止になっているので厳格なコンパイラならエラーになります。

その配列と間違えるエラーは、実行文より後に使うと出るものです。



889 名前:887 [2006/10/07(土) 10:57:16 ]
レスありがとうございます。
プログラムは本当に初心者でコンパイルがどれをさすのか
分かってないのですが、silverfrostのFTN95の個人用を使っています。
関数の定義は、変数の型宣言の直後に書いています。
他に簡単なプログラムを書いてみて、試してみたところ、
うまくいきました。エラーはここ以外に出ていませんが、
warningでIn a previous call to COTH, the first argument was of type
REAL (KIND=1), it is now INTEGER (KIND=3)
と出ています。

890 名前:887 [2006/10/07(土) 12:36:34 ]
自己解決しました。
他の部分に不備があったようです。

891 名前:デフォルトの名無しさん mailto:sage [2006/10/08(日) 15:07:12 ]
f(x)の区間[0,b]の積分を台形公式で近似した
∫f(x)dx=(h/2)*(f(x_0)+2(x_1)+2f(x_2)+…+2f(x_n-1)+f(x_n))
(ただしh=b/nはn分割したときの刻み幅でx_i=h*i)
という式を数値積分をしようと思うのですが、
f(x)=((x^4)*exp(x))/((exp(x)-1)^2)
なのでf(0)が発散してしまいます。
  こういう場合、どう処理したらよいのでしょうか?
思いついたのは
(f(x_0)+2(x_1)+2f(x_2)+…
という部分を
f(x_1)+2(x_2)+2f(x_3)+…
とする方法(端のほうを無視する)なのですが、他に方法はないのでしょうか?
  みなさんでしたら、どうするのか、あるいは他に方法はない(思いつかない)のか、
どうか助言お願いします。

892 名前:デフォルトの名無しさん [2006/10/08(日) 20:31:02 ]
>>891
変数変換するべし。


893 名前:891 mailto:sage [2006/10/08(日) 22:58:27 ]
なるほど!
どうもありがとうございます。
少しまた考えて見ます。

894 名前:デフォルトの名無しさん mailto:sage [2006/10/10(火) 00:20:42 ]
>>893
というか、そもそもf(+0)は0なのでは?
確かに、f(0)そのものは分母がゼロになるので、計算できないが、
f(x) x->0 はゼロなので、普通に端っこだけ除けば計算できる。
(もちろん、十分結果が収束するまで分割数は多くしないとダメだけど)

それか、計算区間を[0,b]ではなく、[ε,b](εは十分小さい数)で計算するとか。
同じことだけど。



895 名前:デフォルトの名無しさん [2006/10/11(水) 22:29:36 ]
ちょっとお聞きしたいのですが
atanとatan2とdatanの違いはなんなのでしょうか?
検索してみたのですがいまいちわかりません(バカですいません)
プログラム書いてるのですが、どう考えてもここしか間違いがないのですが・・・



896 名前:デフォルトの名無しさん mailto:sage [2006/10/11(水) 23:10:24 ]
     引数の型(個数) 関数の型
atan 実数型(1) 実数型
datan 倍精度実数型(1) 倍精度実数型
atan2 実数型(2) 実数型
datan2 倍精度実数型(2) 倍精度実数型


897 名前:デフォルトの名無しさん [2006/10/12(木) 00:38:18 ]
>>895
ATANではよく、ATAN(Y/X) みたいな計算をするが、この場合X=0の時、
0割の例外が起きて困る。だが実際はATAN(∞)=π/2だ。

こういうのを避けるのに使うのがATAN2(Y,X)だ。



898 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:50:11 ]
>>896,897
ありがとうございます。
もしかしてatan(-1/-1)=atan(1/1)じゃないんでしょうか?

899 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 01:58:35 ]
>>898
それはFortranの話ではなく高校数学の話。
atan(-1/-1)=atan(1/1)=atan(1)=π/4

900 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 02:46:10 ]
>>899
ありがとうございました!
なぞがすべて解決しました。深夜にサンクスでした

901 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 18:43:21 ]
高速化したい場合は、どのような場合でも-O5をつけてOKですか?

902 名前:デフォルトの名無しさん [2006/10/12(木) 23:16:29 ]
>>898
それはいい質問だ。
ATAN(y/x)の場合、象限に関する情報が失われてしまうのも問題で、
x=0.0のゼロ割りの時と並んで厄介なものである。

ATAN2の場合、その問題にも少し対応している。

ATANの場合は値域が−π/2〜π/2だが、ATAN2の場合象限に関する付加的な
情報があるので、返す値域が−π〜πに拡大している。

>>901
その質問は難しい。一概には答えられない。
まぁ最適化の手引きのようなものを読んで勉強するしかない。

その上でマニュアルを読んで、使用しているコンパイラの最適化がオプションごとに
どうなっているかを知ったうえで、自分のプログラムと合わせて考えねばならない。

単純には、人間が見ても自明なソースはコンパイラも素直にコンパイル&最適化
できるので、正しく最適化されることが多い。



903 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 02:46:34 ]
なんだ、昨日はいろいろなスレにatan厨が湧いたのか

904 名前:デフォルトの名無しさん mailto:sage [2006/10/15(日) 15:04:15 ]
FortranのDLLをC#もしくはBasicから呼び出そうとしています。
↓このあたりを参考にコードを書いているのですが、FatalExecutionEngineErrorというエラーが出てしまいます。

www.atmarkit.co.jp/fdotnet/dotnettips/025w32string/w32string.html
www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg18_05_01.htm#EXPORT
dotnet247.com/247reference/msgs/32/164624.aspx

文字列をあつかわない関数に関しては成功しているので、文字列の引渡しがうまくいっていないようです。
DllImport文には以下のようにCharSetの記述をしています。

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]

文字列の渡し方は、stringで渡す、stringBuilderで渡す、char配列で渡す、の3通りを試しましたがいずれもエラーとなりました。

もとのFortranコードおよび
自分が具体的に書いたコードを以下に記します。
なにかお気づきの点などあれば教えていただけないでしょうか?


905 名前:904 mailto:sage [2006/10/15(日) 15:05:00 ]
オリジナルのFortranコード

subroutine SETUPdll(i,hfld,hfm,hrf,ierr,herr)
implicit double precision (a-h,o-z)
implicit integer (i-k,m,n)
dll_export SETUPdll
parameter (ncmax=20)
character hfld*10000,hfm*255,hrf*3,herr*255,hfmix*255
character*255 hf(ncmax)
do 10 j=1, ncmax
10 hf(j)=' '
if (i.eq.1) then
hf(1)=hfld
else
m=1
do 20 k=1,i
j=index(hfld(m:10000),'|')
if (j.ne.0) then
j=j+m-1
hf(k)=hfld(m:j-1)
m=j+1
endif
20 continue
endif
hfmix=hfm
call SETUP (i,hf,hfmix,hrf,ierr,herr)
end



906 名前:904 [2006/10/15(日) 15:06:52 ]
自分で書いたコード(char配列を利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
char[] hfld = new char[10000];
char[] hfmix = new char[255];
char[] hrf = new char[3];
char[] herr = new char[255];
string strBuff = "fluids/nitrogen.fld";
strBuff.CopyTo(0, hfld, 0, strBuff.Length);
strBuff = "fluids/hmx.bnc";
strBuff.CopyTo(0, hfmix, 0, strBuff.Length);
strBuff = "DEF";
strBuff.CopyTo(0, hrf, 0, strBuff.Length);
strBuff = " ";
strBuff.CopyTo(0, herr, 0, strBuff.Length);
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}

907 名前:904 mailto:sage [2006/10/15(日) 15:09:49 ]
自分で書いたコード(stringBuilderを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref char[] hfld, ref char[] hfm,
char[] hrf, ref int ierr, ref char[] herr);

static void Main(string[] args){

int nc = 1;
StringBuilder hfld = new StringBuilder(10000);
hfld.Append("fluids\\nitrogen.fld");
StringBuilder hfmix = new StringBuilder(255);
hfmix.Append("fluids\\hmx.bnc");
StringBuilder hrf = new StringBuilder(3);
hrf.Append("DEF");
StringBuilder herr = new StringBuilder(255) ;
herr.Append("");
int ierr = 0;
SETUPdll(ref nc, ref hfld, ref hfmix, hrf, ref ierr, ref herr);
}

908 名前:904 mailto:sage [2006/10/15(日) 15:12:50 ]
自分で書いたコード(stringを利用)

[DllImport("*****.DLL", CharSet=CharSet.Unicode)]
private extern static void SETUPdll(ref int nc, ref string hfld, ref string hfm,
ref string hrf, ref int ierr, ref string herr);

static void Main(string[] args){

int nc = 1;
string hfld = "fluids\\nitrogen.fld";
string hfmix = "fluids\\hmx.bnc";
string hrf = "DEF";
string herr = "";
int ierr = 0;

SETUPdll(ref nc, ref hfld, ref hfmix, ref hrf, ref ierr, ref herr);

}

909 名前:デフォルトの名無しさん [2006/10/15(日) 20:03:53 ]
>>904
難しい質問だなw
Fortranコンパイラはなんなの?

一般的にC言語などは尻にx00のNULL文字が入る内部構造なので、
Fortan側で文字列をいじったあとは尻にNULLをつけたりしないと駄目だったりするが・・・
DECの拡張では尻にCと書くことでNULL文字が付け加わる。


910 名前:904 [2006/10/17(火) 08:48:25 ]
出張で返信遅れました。
すみません。

コンパイラはSalfordのftn77を使っています。
Salfordのftn95を使って.NET用にコンパイルしたところ、
一応は使えるようになりました。
ただ、一定時間広告が出てしまうのでできるならばftn77でなんとかしたいところです。

!DEC$ の末尾にCも付け加えましたが、やはり同一のエラーが出ます。
もう少し検討してみます。

911 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 09:49:08 ]
で、公開関数はいつはいるの?

912 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 19:01:46 ]
intelfortran ver.9.0を使っています。
教官からもらったプログラムをコンパイルしたところ
npionkai.f(2803) : Error: This character is not valid in a format list. [R]
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS

-^
compilation aborted for npionkai.f (code 1)
といわれました。
これはformat文の中に[R]を使うなボケェってことなんでしょうか
それならなんか理不尽です

913 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:35:29 ]
>>912
プログラムの"6000 FORMAT ..."の行を晒しては如何。
その書式は教官以上にエッチにならないと使えないらしいよ。

914 名前:デフォルトの名無しさん mailto:sage [2006/10/17(火) 21:41:49 ]
ホレリスの文字数がずれてたり、1行当たりの文字数制限でいつの間にかお尻が切れてたりする可能性がある。

915 名前:デフォルトの名無しさん [2006/10/17(火) 23:00:53 ]
>>912
たぶん継続行のところでホレリスの数えがずれたんじゃないかな。
その行だけじゃなく、文全部をだせや




916 名前:912 mailto:sage [2006/10/18(水) 00:11:18 ]
format文全文は
WRITE(2,6000) NINT,MAXINT
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS
1 VERSION OF MINUIT IS ONLY DIMENSIONED FOR,I4//)
です。
このformat文があるサブルーチン内で IMPLICIT REAL*8(A-H,O-Z) を宣言しています。

よろしくお願いします。
やはりホレリスずれで最後のFORの[R}が文句いわれてるんですか



917 名前:912 mailto:sage [2006/10/18(水) 00:15:09 ]
連投すみません
47Hを48Hにかえたらいいんですね


918 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 00:31:10 ]
>>916
6000 FORMAT(/42H TOO MANY VARIABLE PARAMETERS. YOU REQUEST,I5/47H THIS

ホレリスの途中で行を分けてるのが不味いな。
行末の「THIS」の後ろにスペースが入ってるとそれがカウントされて文字数がずれる。

919 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 08:04:08 ]
Fortran77を使っているんですが,
乱数を発生させようと思い

real a

do i= 1,10

a = rand()


write(*,*)a


enddo

stop
end

このようなプログラムを作ったところ,
乱数は書き出されるのですが毎回同じものになってしまいます.

実行するたびに違う乱数を得るにはどうしたらいいのでしょうか.


920 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 09:34:30 ]
>>919
乱数を使用する前に SRAND で乱数の種を設定する。

PROGRAM HOGE
REAL A
CALL SRAND(TIME())
DO I=1, 10
A = RAND()
WRITE(*,*) I, A
END DO
STOP
END

但し、RAND/SRAND/TIME はFORTRAN77標準ではないので
もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと。

921 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 11:19:26 ]
>>920さんのプログラムを入力してみたのですが
やはり何回やっても同じ値しか返してきません。

>もし使っている処理系にない場合は同等のサブルーチン/関数を探すこと

なんでしょうか。もう少し調べてみます。

922 名前:デフォルトの名無しさん [2006/10/18(水) 12:42:59 ]
>>921
F90にはRANDOMIZEというのが標準であったはずだが・・・

しかし、この手の問題はBASIC全盛時代のゲームの乱数の頃からのFAQだw
時計で乱数の種を作る。

宿題程度ならともかく、まじめなシミュレーションをやりたいなら、乱数の専門サイトへ行って、
乱数マニアの御託を我慢して読んで、目的にあった適切な擬似乱数のルーチンを貰ってくるのが吉。
大体言語内蔵の乱数はウンコなことが多いという経験的な事実がある。

金が余っているならハードウェア的に乱数を吐き出すボードもあるようだ。
熱雑音か放射性物質の崩壊を利用して天然物の乱数を出してくれる。


923 名前:デフォルトの名無しさん [2006/10/18(水) 21:00:08 ]
fortran77で計算結果をfile.csvに記録するとき

WRITE(3,*)a(1),',',a(2),',',a(3)・・・
(a(n)は数値)

とカンマ区切りで出力しているのですが、70文字目くらいで折り返されて
記録されているため、Excelで開いたときに1行で結果が見られません。
これを1行で記録するにはどうすればいいのでしょうか?

924 名前:デフォルトの名無しさん mailto:sage [2006/10/18(水) 21:45:57 ]
>>923
横着せずに書式を指定する

write(3, '(100(F8.3,:,'',''))') (a(i), i=1,100)


925 名前:923 mailto:sage [2006/10/18(水) 22:11:40 ]
>>924
出来ました!
ありがとうございます。



926 名前:ふつふつ [2006/10/19(木) 23:25:37 ]
fortran77を使っているんですけど、得られた6つの値を1行1列、2行1列、3行1列
1行2列、2行2列、2行3列の順番にformat文を使って表示するにはどのようにしたら
いいでしょうか?初心者でぜんぜんわからなくて。どなたかお願いします。

927 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 23:33:15 ]
>>926
>得られた6つの値
どんな形式で与えられるのか、詳しく説明せい。

928 名前:ふつふつ [2006/10/19(木) 23:41:23 ]
>>927
説明不足ですみません。E25.16E3です

929 名前:デフォルトの名無しさん [2006/10/19(木) 23:44:46 ]
掲示板のHTTML教えてください

930 名前:ふつふつ [2006/10/20(金) 00:45:03 ]
ほんとごめんなさい。どこに書いてあるのですか?htmlって?

931 名前:デフォルトの名無しさん [2006/10/20(金) 21:41:25 ]
>>926
データ数とフォーマットによる表示数が合ってない。
>>927の書式もおかしい。

問題文を忠実に写せ。このままでは答えようが無い。


932 名前:ふつふつ [2006/10/22(日) 02:30:06 ]
Nx=256,Ny=256で、以下のプログラムでやっています。これを一列目に256個の結果を出し、257個目から
2列目に結果を表示していき、行256、列256にしたいんです。E25.16E3は変えられません
    DO 250 I=1,Nx
  DO 250 J=1,Ny
 write(30,260) U(I,J)
250 continue
260 Format (E25.16E3)

933 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 03:04:50 ]
>>932
なんか >>926 と言ってることが違うんだが…
>>932のプログラムから察するとこういうことか?

WRITE(30, 260) ((U(I,J), J=1,256), I=1,256)
260 FORMAT(256(256E25.16E3,/))


934 名前:ふつふつ [2006/10/22(日) 17:45:27 ]
実はこのプログラムが実際のものだったんです。逆にややこしくしてしまったようです。
それにもかかわらず答えていただきありがとうございました。
明日試してみます。

935 名前:デフォルトの名無しさん [2006/10/23(月) 20:21:09 ]
学校でfortranやらされる事になった・・・



936 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 20:29:55 ]
>>935
おめでとう!

937 名前:デフォルトの名無しさん [2006/10/23(月) 23:10:38 ]
>>935
FORTRANはいいぞぅ!

1950年代のコードが未だに生き残っている。

ソース再利用では最高水準の言語だw


938 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:21:30 ]
7カラムにぴったり揃えたあの美しさ。インデント糞喰らえ。
これに匹敵できるのはアセンブリしかない。

939 名前:デフォルトの名無しさん mailto:sage [2006/10/23(月) 23:27:21 ]
おいおい、そんなこと言ってるとCOBOLerの皆さんが…

940 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 10:45:52 ]
× 匹敵できる
○ 匹敵する
○ 比肩できる

941 名前:stack overflow [2006/10/24(火) 14:17:33 ]
severe(170): Program Exception - stack overflow というエラーが出るのですが、解決方法が分かりません。
過去の書き込みに同様のものがありますが、もう1度スタックのサイズの増やし方を教えてください。
あと、配列はすべてallocatableで宣言していて、deallocateを繰り返しているのですが、stack overflowになってしまうものなんでしょうか?
エラーの出る行がcall文だし、そもそも、どうするとメモリが消費されるのか分かりません。
ど素人にご教授願います。


942 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 20:07:34 ]
fortran4で書かれたコードを使いたいのですがgccではコンパイルできませんでした。
fortran4でもコンパイルできる今手に入るコンパイラはないでしょうか?

943 名前:デフォルトの名無しさん mailto:sage [2006/10/24(火) 22:24:00 ]
>>941
>スタックのサイズの増やし方
Windows上のCompaq Visual Fortranなら
df hoge.f90 /link /stack:0x12ab000

Intel Visual Fortranなら
ifort /F0x12ab000 hoge.f90

ほかは知らん。

>エラーの出る行がcall文
(FORTRAN77形式の)次元と範囲が明示された配列を引数に取るサブルーチンに
(Fortran90以降の)部分配列やポインタを渡して呼び出そうとすると
暗黙のうちに一時的な配列が作られ、これがサブルーチンに渡される。
このとき要求される配列のサイズが大きいとスタックがあふれる可能性がある。


944 名前:stack overflow [2006/10/24(火) 23:06:34 ]
エラーの出るサブルーチンの引数に配列は含まれていません。
ループを繰り返していると、見えないところで、メモリが切られて、スタックがあふれてしまう???っぽいんですが・・・

945 名前:デフォルトの名無しさん [2006/10/24(火) 23:44:35 ]
動的メモリー割付をとる領域には、ヒープとスタックの2種類がある。
普通はヒープはOSの管理下に、スタックはプログラムの管理下にある。
ゆえにスタックサイズはリンカーで指定することになる。

allocateはヒープ領域からメモリーを取られるのが一般的だ。

スタックの方は、オートマチック変数などに取られる。
呼び出し側のサブルーチンで、オートマチック変数を取っていないか?
これがでかすぎるとスタックオーバーフローが起こる。

コンパイラの実装にもよるが、スタックオーバーフローはallocateではないんじゃないか?



946 名前:デフォルトの名無しさん [2006/10/24(火) 23:55:32 ]
>>942
CP/Mのエミュレーターを入れて、その上でFORTRAN IVのコンパイラを動かす
ことは出来る。エミュレータとソフトはネットに流れているので拾える。


というのは冗談だ。

FORTRANIVはFORTRAN66と同じものだと考えてよい。
FORTRAN66は、ごく些細な部分を除けばFORTRAN77に含まれている。
したがって、(色々落とし穴はあるが)若干の修正で動くはずである。


FORTRAN90→95→2003 と進むにつれて徐々に古臭い機能を切り落としているが、
現実の実装では機能は生き残らせてあるのが普通だ。
新しいコンパイラでも動くだろう。

DEC/INTEL FORTRANなどではFORTRAN66形式のDO廻り
(条件にかかわらず必ず1回は回る)とかをオプションで指定できる。
あと拡張DO LOOPもDEC時代には対応していた。


GCCでどうなってるかは知らん。



947 名前:942 mailto:sage [2006/10/25(水) 00:16:11 ]
>>946
回答ありがとうございます。intelで試してみます

948 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 01:33:30 ]
大学でFortranを使うことになったのですが、詰まってしまいまして。
以下のようなプログラムを作るのですが……。

1.すでにAと言うデータファイルがあり、2列で構成されている。
  それぞれの列が粒子のx座標、y座標に対応で、1行1粒子に当たります(座標情報は実数です)

2.ここから新たに別のファイルBを作成して、
  Bに原点からの距離(sqrt(x**2+y**2))を計算して入力していく。

というものです。
試しにプログラムを作り入力データが1行のAを用いたところ、できたBの中に距離を表す数値が
一つだけ表示されていて成功したのですが、行数が2行以上になると、どう試してもできず。
Aの各行の値がばらばらでも、Bで表示される数値が全部の行で同じに……orz

行数が少ないなら自力で計算するところなのですが、Aが数千万行クラスのファイルなので
手計算ではどう考えても時間がかかりすぎます。

内容的に初歩の物だとは思うのですが、幾つかのサイトを見てみても複数行のデータを
うまく読み込み、計算して書き出す方法がわからず、先に進めません。

どなたか、御力をお貸しくださいませ。よろしくお願いしますm(_ _)m

949 名前:デフォルトの名無しさん mailto:sage [2006/10/25(水) 02:08:57 ]
>>948
program main
implicit none
real(kind=SELECTED_REAL_KIND(10)) :: x, y, d
integer :: ios
open(unit=11, file="A", status="OLD")
open(unit=12, file="B", status="REPLACE")
do
read(unit=11, fmt=*, iostat=ios) x, y
if (ios /= 0) exit
d = sqrt(x**2 + y**2)
write(unit=12, fmt=*) d
end do
close(11)
close(12)
end program main


950 名前:948 mailto:sage [2006/10/25(水) 15:46:23 ]
>>949
すぐに答えて頂いたのに、返答が遅くなってしまい申し訳ありませんm(_ _)m
さっそく上記のプログラムを用いたところ、無事計算されたファイルが
出力されました。
これでようやく先に進めそうです。本当にありがとうございました!!

ただ、一つ疑問点が……。
3行目のreal以下の()文を書いたままコンパイルすると、

Invalid declaration of or reference to symbol
`selected_real_kind' at (^) [initially seen at (^)]

という警告文がでて、コンパイルが止まってしまいました。
中身を含めて()を消してみたところうまくコンパイルできたのですが。

もしよろしければ、()内の意味を教えていただけないでしょうか。
重ね重ね申し訳ありませんが、よろしくお願いします。

951 名前:stack overflow [2006/10/25(水) 23:16:42 ]
返信遅くなりました。昨日(945)の続きお願いします。
今日は寝ないつもりです。(もちろんデフォルトの名無しさん には強制しません)
オートマチック変数ってどのような変数のことをいうのでしょうか?
いろいろ調べてみたのですが、いまいちです。
結局、オートマチック変数が原因の場合どうすればよいのでしょう?

952 名前:デフォルトの名無しさん [2006/10/25(水) 23:28:30 ]
>>950
あれはFORTRAN90以降で導入された精度保障のための関数だ。
kind=SELECTED_REAL_KIND(10)
これは有効数字10桁を保障するような型に対応する種類(KIND)を返す。
普通のFORTRANは短精度と倍精度を持つが、短精度の有効桁は7〜8、
倍精度は14〜15なので、倍精度に相当する値を返す。
FORTRAN77で言えばREAL(8)に相当する。

これでコンパイラのエラーが出るとすると、FORTRAN90完全準拠で無いと思われる。


953 名前:デフォルトの名無しさん [2006/10/25(水) 23:39:38 ]
>>951
オートマチック変数または自動変数とは、サブルーチンが呼び出されたときに
一時的に割り付けられる変数だ。

SUBROUTINE unko(a, n)
IMPLICITE NONE
REAL, INTENT(IN) :: a(n)
REAL :: work(SIZE(a))
云々

とあったとすると、配列workが自動変数にあたる。
これはあまり大きなものを取ることを想定しておらず、スタック領域に割り付ける。

こういう使い方で大きな配列などを取っていると、スタックオーバーフローがおきる。

サブルーチンを呼び出すと、戻る場所などの情報をスタックに保存することになる。
またサブルーチンで一時的に使用するメモリー等もスタックに取る。
サブルーチンの呼び出しが過剰に多いか(再帰関数が無限ループとか)、
一時変数が領域を食いすぎるとオーバーフローが出る可能性がある。


エラーメッセージからするとDEC系のコンパイラの感じだが、トレースバック情報などの
デバッグ情報を吐き出させるオプションをつけてコンパイルし実行してみるのも手だ。

まぁ、もう少し詳しい情報が無いと助言のしようが無い。




954 名前:stack overflow [2006/10/26(木) 00:19:00 ]
programを省略して書くと、

(宣言文)
open(21,file='filelist')
do
allocate
read(21,*,end=1000)unko
open(51,file=unko)

 (計算)

close(51)
deallocate
end do
1000 close(21)
stop
end
データのファイル(具体的には地震動の波形)がたくさんあって
1つ1つに同じ処理をして出力ファイルを作成したかったので、
cmdで入力ファイルのパスのリストを作って、リストのファイルが読み終わるまで、
doループで繰り返すように動かしたいのです。
大体2000回くらいループを繰り返すとstack overflowします。(動かして20分ぐらい)
mainで使う配列はすべて、doループのなかでallocateとdeallocateを繰り返しています。
subroutine内でも引数でない配列は、allocateとdeallocateをしています。
こんな風な動かし方ってできないんですかね?

OSはWindowsXP、programはvisual studioで動かしています。

955 名前:デフォルトの名無しさん [2006/10/26(木) 00:43:27 ]
>>954
その範囲内では問題ないと思われる。
20分はちゃんと動いているとすれば、結構厄介なBugかもしれない。
Visual Studioを使っているという事は、コンパイラはIntelのものでいいのか?

昔のMSPowerStationだとI/OにメモリーリークがあるのでI/Oを繰り返すと
死にメモリーが増えて行きどこかで死亡することになっていた。
これはタスクモニターでメモリー使用量を観察していると分かる。

Intelではそういう事は無いと思うのだが、もしかしたらそういう可能性が無いともいえない。


ALLOCATEとDEALLOCATEの対応が狂って、きちんとメモリーが解放されていない場合も
タスクモニターでメモリー使用量を見ていると、どんどん使用メモリーが増えてゆくので
見て取れる。

ところで実行はDEBUG MODEでためしているだろうか?




956 名前:stack overflow [2006/10/26(木) 00:47:04 ]
プログラム概要を記します。

(宣言文)
open(21,file='filelist')
do
allocate
read(21,end=1000)unko
open(51,file=unko)
read(51)
(計算)
close(51)
deallocate
enddo
1000 close(21)
deallocate
stop
end

データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。

こんな使い方しませんか?

OSはwindowsXPで、visual studioでプログラムを作ってます。

957 名前:stack overflow [2006/10/26(木) 00:47:56 ]
プログラム概要を記します。

(宣言文)
open(21,file='filelist')
do
allocate
read(21,end=1000)unko
open(51,file=unko)
read(51)
(計算)
close(51)
deallocate
enddo
1000 close(21)
deallocate
stop
end


958 名前:stack overflow [2006/10/26(木) 00:48:58 ]
957の続き

データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。

こんな使い方しませんか?

OSはwindowsXPで、visual studioでプログラムを作ってます。

959 名前:stack overflow [2006/10/26(木) 00:50:11 ]
957の続き
データ(具体的には地震動波形(6000stepから10000stepぐらい))のファイルがたくさんあって、
1つ1つに同じ処理をしたいので、cmdでファイルのパスのリストを作って、このリストを読み終わるまでdoループを繰り返しているのですが、
2000回くらい繰り返すと(大体20分ぐらい)stack overflowになります。
mainで使う配列はすべてdoループのなかでallocateとdeallocateを繰り返しています。
subroutineでも引数でない配列はallocateとdeallocateを繰り返しています。
こんな使い方しませんか?
OSはwindowsXPで、visual studioでプログラムを作ってます。

960 名前:stack overflow [2006/10/26(木) 00:51:33 ]
すいません。
同じ内容を何度も書き込んでしまいました。

961 名前:stack overflow [2006/10/26(木) 01:17:54 ]
ファイルリストがいくつもあるのでバッチファイルで動かしていました。
filelistをcall getargで読み込ませています。
DEBUG MODEでやった方がいいですか?
タスクモニターを見ながらもう一度動かしてみようと思います。

962 名前:stack overflow [2006/10/26(木) 01:43:26 ]
つかぬ事をお聞きしますが、タスクモニタのどこをみればよいのでしょうか?
見ながら動かして見ましたが、あまり変わりません。

コンパイラはIntel FORTRANです。


963 名前:948 mailto:sage [2006/10/26(木) 01:58:24 ]
>>952
なるほど、精度保障のための関数でしたか。勉強になりました。
一度、自分の使っているFORTRANのバージョンを確認してみます。
お答えいただき、どうもありがとうございました!

964 名前:stack overflow [2006/10/26(木) 02:15:31 ]
!!!!なぜか、急に動くようになりました。????
もう少し長い時間動くかどうか、やってみます。結果は明日報告します。

ご丁寧に説明していただき、ありがとうございました。お時間取らせてしまってすいません。
and同じ書き込み何度もして、すいません。

965 名前:デフォルトの名無しさん [2006/10/26(木) 02:39:52 ]
>>961
一応DEBUG MODEで1回は動かしておくのがいい。
時間はかかるので小さめのデータを用意して確かめておくのがマナー。
いきなりリリースモードに行くのは、体を洗わずに湯船につかるようなものw


>>962
概略ならパフォーマンスのところを見るとグラフが書かれているのでそれで傾向を知れる。
プロセスのところでMEMUSAGEをみれば、数値でどのくらい使われているかが分かる。





966 名前:デフォルトの名無しさん [2006/10/26(木) 05:22:04 ]
f90glを使いたいのですが、導入の方法からつまづいています。

math.nist.gov/f90gl/f90gl-1.2.12.zip
を取ってきたあと、どうすれば導入&コンパイルできるのですか?
環境はWindowsXP、cygwinでインストールしたOpenGLを使っています。
コンパイラは何を使うのでしょう?gfortran?g95?

967 名前:stack overflow [2006/10/26(木) 09:07:18 ]
>>965
お騒がせしました。program無事に終了しています。
stack overflowが出る前は、debug modeで試すというのはやっていましたが、
そのあとの修正が反映されてなかったってことなのかな・・・
コンパイルはしてたはずだったんですが・・・
初心者なもんでお許しを
何がともあれできてよかったっす。ありがとうございました。


968 名前:stack overflow [2006/10/26(木) 10:53:04 ]
できたと思ったのですが、やっぱりできていませんでした。
昨日か一昨日、どこでメモリが食われているのか、調べるために
出力の部分をコメントアウトしたりしていたのですが、
コメントアウトしたままで実行したので動いていたようです。
やはり、出力時にメモリが使われているようです。
出力はバイナリ形式なんですが、なにか関係があるのかなあ・・・

969 名前:デフォルトの名無しさん mailto:sage [2006/10/26(木) 22:03:07 ]
>>966
まず、f90glから使える GLUTが必要。
これは(少々バージョンが古いようだが)ソースとWindows用にコンパイルした物が
f90gl Softwareのページから拾える。

次に f90gl-*/INSTALL, mf_keyをよく読んで自分の使っているOS/C/Fortranコンパイラに
合ったMakefile(mf*)またはバッチファイル(mf8n*.bat)を探す。
適切な物が見つかれば、それを自分の環境に合わせて修正し
makeまたはバッチファイルを実行し、ライブラリとモジュールファイルを作る。

適切な物がなければ、似たような物から自分でMakefile/バッチファイルを作るか
Makefile/バッチファイルの処理内容を見て手動でコンパイルする。

f90gl-1.2.12.zipにはcygwin gcc + g95/gfortran用のmf*は含まれていないようなので
自分でMakefileを作るしかないようだな。

970 名前:デフォルトの名無しさん [2006/10/26(木) 22:54:26 ]
>968
or1cedar.cps.intel.com/ISN/Community/en-US/forums/thread/30223289.aspx
まずはここを嫁

コメントアウトして動くようになった行をうpれ!


971 名前:デフォルトの名無しさん [2006/10/26(木) 23:43:58 ]
VC++を勉強しようと思うのですが、お勧めの参考書があれば教えてください!!

972 名前:デフォルトの名無しさん [2006/10/27(金) 00:14:28 ]
>>971
つ ttp://www.amazon.co.jp/gp/product/4320029658

973 名前:stack overflow [2006/10/27(金) 00:38:09 ]
>>970
コメントアウトの行は、出力部分で、
ファイル形式が某企業のもので詳しく載せれません。
open文×10
write文×20
close×10

もうそろそろ諦めます。
最後に紹介して頂いたintelのサイトに書いてあるのは、誰かが出したエラーの原因か何かですか?
英語苦手なんで、どういうサイトなのかだけ教えてください。


974 名前:966 mailto:sage [2006/10/27(金) 02:15:38 ]
>969
丁寧にありがとうございます!


975 名前:デフォルトの名無しさん [2006/10/27(金) 03:39:20 ]
>>973
あれはintelのサポートページにある掲示板だ。
SteveLionelというのがDEC→Compaq→HP→INTELとずーっと一貫してサポートの前面に
立ってきた人間なので、とりあえず奴の書き込みだけを見れば足るだろう。

あれ以外にもStackOverflowに関する一般的な説明があった。
それは上のほうにあった書き込みと似ている内容だったが、INTELコンパイラは将来的には
巨大なAutomatic変数は自動的にHeap領域に割り当てるように改良を考えているらしい。


念のためコンパイラは最新版にupdateしておくとよい。
またコンパイラの問題かどうかの参考にするには、別の会社のコンパイラでやってみるという
手もある。チェックだけなのでftn95とか、g95とか、あとどっかの2週間のおためしと版とか
で試して同じ症状が出るかどうかみてみるという手もある。



DEBUGオプションでやってみるのが基本なのだが。




976 名前:stack overflow [2006/10/27(金) 14:33:52 ]
>>975
分かりました。
どうもありがとうございます。m(_ _)m

977 名前:デフォルトの名無しさん [2006/10/28(土) 22:55:00 ]
以下のようにしてテキストファイル内の行数を数えたいのですが、
テキストファイル最後の行の判別はどう書けばよいのでしょうか?
(つまり、DO WHILEの条件はどう書けばいいのですか?)
.  OPEN(11,FILE='01.dat',STATUS='old')
.  READ(11,*) x,y,z
.  DO WHILE(x /= NULL) !←NULL
.  max_line = max_line + 1
.  READ(11,*) x,y,z
.  END DO
.  CLOSE(11)
教えてください、お願いします!

978 名前:デフォルトの名無しさん [2006/10/28(土) 23:37:18 ]
>>977
.  READ(11,*, IOSTAT=IOSS) x,y,z
とすると、ファイルの終わりに達したら IOSS に負の値が入る。

ちなみに エラーが起きたら正の整数値、それ以外ならゼロが入る。
正、負の具体的な値は処理系依存。

または
.  READ(11,*, END=文番号) x,y,z
とすると、ファイルの終わりに達したら (文番号) に分岐する。

979 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 02:07:11 ]
>978できました!ありがとうございます。

980 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 16:38:30 ]
do i=20,90,1
でi=70だけを飛ばしたいときはどのようにしたらよいのでしょうか?

981 名前:980 mailto:sage [2006/10/31(火) 16:47:36 ]
自己解決しました
if文を入れてi=70だけを飛ばしました。


982 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 20:54:05 ]
スマソ、助けてください。
例えば、この連立一次方程式
  3x1+2x2+7x3+x4=8
x1+5x2+x3−x4=5
4x1+x2+3x3−2x4=7
x1+6x2+4x3+3x4=13

これをガウスジョルダン法で解きたいんですが
open文でデータを開いて計算したいんです。
プログラムはどのようにすればよいでしょうか?



 

983 名前:982 mailto:sage [2006/10/31(火) 20:56:03 ]
ちなみに77でお願いします。

984 名前:デフォルトの名無しさん mailto:sage [2006/10/31(火) 22:30:19 ]
>>982

program hoge
parameter (N=4)
real a(N,N+1)
open(11, file='data.txt', status='old')
read(11,*) ((a(i,j), j=1,N+1), i=1, N)
close(11)
do 101 i=1, N
piv = a(i,i)
do 201 j=i, N+1
a(i,j) = a(i,j) / piv
201 continue
do 202 j=1, N
if (j .ne. i) then
t = a(j, i)
do 301 k = i, N+1
a(j,k) = a(j,k) - t * a(i, k)
301 continue
end if
202 continue
101 continue
write(*,*) (a(i, N+1), i=1, N)
stop
end

エラーチェックは省いたので「不正なデータ」を読ますとランタイムエラーになるw


985 名前:982 mailto:sage [2006/10/31(火) 22:44:32 ]
>>984
おー、こんなに短くなるもんなんですね。
後は自分でやってみます。
ありがとうございますた(`・ω・´)



986 名前:982の1/2 [2006/10/31(火) 23:55:25 ]
再度質問ですが
PARAMETER (NN=10)
DIMENSION A(NN,NN),B(NN),X(NN)
WRITE(*,*)'何元の連立方程式か、元数を入れてください。'
READ (*,*) N
WRITE(*,*) 'N=',N
OPEN(10, FILE='TEXT1.TXT', STATUS='OLD')
DO 1 I=1,N
READ (10,*) (A(I,J), J=1,N),B(I)
WRITE(10,*) (A(I,J), J=1,N),B(I)
1 CONTINUE
CLOSE(10)
DO 100 K=1,N-1
P=A(K,K)
DO 2 J=K+1,N
A(K,J)=A(K,J)/P
2 CONTINUE


987 名前:982の2/2 [2006/10/31(火) 23:56:57 ]
B(K)=B(K)/P
DO 3 I=K+1,N
Q=A(I,N)
DO 4 J=K+1,N
A(I,J)=A(I,J)-Q*A(K,J)
4 CONTINUE
B(I)=B(I)-Q*B(K)
3 CONTINUE
100 CONTINUE
X(N)=B(N)/A(N,N)
DO 200 K=N-1,1,-1
S=B(K)
DO 5 J=K+1,N
S=S-A(K,J)*X(J)
5 CONTINUE
X(K)=S
200 CONTINUE
WRITE(*,*) ' 解 X '
DO 6 I=1,N
WRITE(*,*) X(I)
6 CONTINUE
STOP
END

ここまでは自分でアレンジしましたが、プログラムが回りません。
どこが間違っていますか?


988 名前:デフォルトの名無しさん mailto:sage [2006/11/01(水) 20:47:30 ]
>>986
> DO 1 I=1,N
のループの中で
ファイルからデータを読み込んだすぐ後に
同じファイルに上書きしてる。

> DO 3 I=K+1,N
のすぐ下
Q=A(I,N) → Q=A(I,K)

こんなところかな。

989 名前:デフォルトの名無しさん mailto:sage [2006/11/02(木) 14:34:42 ]
>988
出力形式になってなかったですね。
激しく感謝です。

990 名前:デフォルトの名無しさん [2006/11/03(金) 00:40:49 ]
そろそろ次スレたのむ、
テンプレも進化させてw


991 名前:デフォルトの名無しさん mailto:sage [2006/11/03(金) 12:47:20 ]
Formula 1

992 名前:デフォルトの名無しさん [2006/11/04(土) 13:00:21 ]
2007年はFORTRAN50周年だ。

俺達も盛大に祝おうぜ!!



993 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 16:32:22 ]
FORTRAN = FORmula TRANslation

994 名前:フォートランを初めて3日目 [2006/11/04(土) 19:37:05 ]
今、ワードのようなテキストデータの中に1961年から2005年までの乱雑した年
数だけわかっていて、そこから連続した数を抽出し、発生頻度と見なしてその
発生確率からポアソン分布による乱数を行なえるようなプログラムを知りたい
のですが、よければ、教えてくれませんか?


995 名前:デフォルトの名無しさん [2006/11/04(土) 20:44:32 ]
>>994
そのようにファイルから読み出すのは初心者には難しいだろう。
発生確率にするまで教えてやろう。

データ例を出せ。


そこから先の後半は、カテゴリーが違うので後だ。
まずは作業を概念的に分割して小さい単位で作れ。




996 名前:フォートランを初めて3日目 [2006/11/05(日) 11:34:08 ]
データ例と言われましても、初めてでよくわからないのですけど、’nenpow.txt'
というようなワードの文章の中に112行1列(要は縦に一つずつの年報が並んでいる)
になっています。ちょっと描いてみると
1行目:1961
2行目:1961
3行目:1962
  …
112行目:2005
というようになっており、ここからそれぞれの年報をまとめて発生個数として
ポアソン分布を作成し、それによる確率的な乱数を発生させるようにしたいの
ですけど・・・。
初めてなので、こういう解釈になってしまうのですけど、わかりますか?

997 名前:フォートランを初めて3日目 [2006/11/05(日) 11:38:56 ]
できれはFORTRAN77と、90の両方でお願いしたいのですけど

998 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 12:14:28 ]
>>997
PARAMETER (NYMIN=1961, NYMAX=2005, NTOTL=112)
INTEGER NUM(NYMIN:NYMAX)
DO I=NYMIN, NYMAX
NUM(I) = 0
END DO

OPEN(11, FILE='nenpow.txt', STATUS='OLD')
DO I=1, NTOTL
READ(11,*) NY
IF ((NY .LT. NYMIN) .OR. (NY .GT. NYMAX)) THEN
WRITE(*,*) 'ERROR:', I, NY
ELSE
NUM(NY) = NUM(NY) + 1
END IF
END DO
CLOSE(11)

DO I=NYMIN, NYMAX
WRITE(*,*) I, NUM(I)
END DO
STOP
END

長くなりそうなので、
ファイルから年を読んで NUM(1961)〜NUM(2005) に各年の出現数を格納する
所まで

残りは誰かが次スレでw

999 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:02 ]
FORTRAN = FORmula TRANslation

1000 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 17:39:39 ]
次スレ

FORTRAN III
pc8.2ch.net/test/read.cgi/tech/1104724162/l50

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<404KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef