FORTRAN II

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
FORTRAN総合スレッドです。
FORTRAN77/90/95, HPF等、FORTRAN全般に関する話題を書き込んで下さい。

・前スレ
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/ (dat落ち)
2デフォルトの名無しさん:03/11/09 13:26
・関連スレ?
FORTRAN専用スレッド
http://pc.2ch.net/test/read.cgi/prog/1052290911/l50

【科学技術計算】C言語とFortran どっちがいい?
http://science.2ch.net/test/read.cgi/sim/1042715803/l50
FORTRAN90はどうでしょう?
http://science.2ch.net/test/read.cgi/sim/970819313/l50
3デフォルトの名無しさん:03/11/09 13:27
・FORTRAN関連情報
The Fortran Company
http://www.fortran.com/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/
Compaq Visual Fortran オンライン・ドキュメント
http://www1.jpn.hp.com/products/software/development/dvf/docs/index.html
Intel Fortran Compiler 日本語版マニュアルのダウンロード (要登録)
http://www.xlsoft.com/jp/products/intel/download.html
Fortran Source Check (オンライン文法チェック)
http://www.lahey.com/check.htm

・フリー/無料のコンパイラ
g77 (FORTRAN77)
http://gcc.gnu.org/
Salford FTN77 Personal Edition Compiler (FORTRAN77、要登録)
http://www.salford.co.uk/compilers/ftn77pe/index.shtml
Open Watcom Fortran Compiler (FORTRAN77)
http://www.openwatcom.org/
The G95 project (Fortran90/95 未完成)
http://g95.sourceforge.net/
the F Programming Language (Fortran90のサブセット)
http://www.fortran.com/F/compilers.html
Intel Fortran Compiler (無料評価版/非商用バージョン、要登録)
http://www.intel.co.jp/jp/developer/software/products/global/eval.htm#compilers
Lahey/Fujitsu Fortran (期限付きトライアル版、要登録)
http://www.lahey.com/downloads.htm
FORTRAN II とか書いてあるから、何をいまさらそんな古い規格について語ることがあるんだ ?

って思ったら、2スレ目なわけね。
6fortran初心者:03/11/09 22:49
お助けください・・・fortranで質問です。
1から1000までの素数を求めるプログラムで
配列変数を用いてプログラムを作る方法がわかりません。
do文だけ使用という条件ならわかるのですが、配列変数を用いて
プログラムを作る方法がわかりません。
どなたか暇な方教えて下さい(´Д`;)
7素人:03/11/09 23:48
素人の質問ですが、かまってください
* TEST

PROGRAM TEST
REAL A,B,X,Y,F,Y0
INTEGER N

F=X**2-Y
A=0.
B=1.
Y0=1.
N=100

CALL RUNGE_KUTTA(X,Y,A,B,N,F,Y0)
WRITE(6,*) X,Y
END
8デフォルトの名無しさん:03/11/09 23:48
SUBROUTINE RUNGE_KUTTA(X,Y,A,B,N,F,Y0)
REAL A,B,X,Y,F,H,K1,K2,K3,K4,Y0
INTEGER I,N
EXTERNAL F

X=A
Y=Y0
H=1/REAL(N)

DO 10 I=1,N
K1=H*F(X,Y)
K2=H*F(X+H/2,Y+K1/2)
K3=H*F(X+H/2,Y+K2/2)
K4=H*F(X+H,Y+K3)
X=X+H
Y=Y+(K1+2*(K1+K3)+K4)/6
WRITE(6,100) X,Y
100 FORMAT(' ',F10.5,F10.5)
10 CONTINUE

RETURN
END
9素人:03/11/09 23:52
これを走らせると(コンパイルは出来る)、
次のようなエラーメッセージがでます。

Runtime error from program:c:\win32app\salford\backup\renshu~1.exe
Access Violation
The instruction at address 0373fb83 attempted to read from an illegal location

0373fb83 routine at address 373FB83 [+0000]

00401000 TEST [+005c]

\win32app\salford\backup\renshu~1.exeは生成された、実行ファイルです。
どこが悪いか全く分かりません。 できたらアドバイスお願いします。
10素人:03/11/10 00:04
質問だけでも何なので>>6 こんなのがあります。

    LOGICAL PRIME(1000)
INTEGER LIST(250)

READ(5,*)

L=1
LIST(L)=2

DO 10 I=3,N,2
PRIME(I)=.TRUE.
10 CONTINUE

DO 30 I=3,N,2
  IF(PRIME(I)) THEN
   L=L+1
   DO 20 J=I,N,I
    PRIME8J)=.FALSE.
20    CONTINUE
END IF
30 CONTINUE

WRITE(6,200) (LIST(I),I=1,L)
200 FORMAT(' ',10I6)
END
11素人:03/11/10 00:06
論理型の配列変数を用いて、
エラトステネスの篩を使うやり方です。
12デフォルトの名無しさん:03/11/10 00:48
>>7-9
PROGRAM TEST中の
    F=X**2-Y     ! 変数 F への代入

    F(X,Y)=X**2-Y  ! 文関数 F の定義
では?

でも文関数の有効範囲はそれを定義したプログラム単位(ここでは PROGRAM TEST)
内だけなので、F() を SUBROUTINE RUNGE_KUTTA() で使うには
FUNCTIONで別に関数定義する必要があると思います。
13素人:03/11/10 12:01
>>12 早速ありがとうございます。

<変更点>
REAL FUNCTION F(X,Y)
REAL X,Y
F=X**2-Y
RETURN
END
これを別に定義して、

RUNGE_KUTTA(X,Y,A,B,N,F,Y0)

RUNGE_KUTTA(X,Y,A,B,N,,Y0) 文関数の中の変数のFを消去

これでうまく行きました。
サブルーチンの変数に文関数を入れたらまずいですね。
14fortran初心者:03/11/11 20:54
>>10
遅レスですが・・・
無事にプログラムを走らすことができました
ほんとうにありがとうございましたヽ(´ー`)ノ
文関数は実行文ではないので,プログラム単位中では全ての宣言文のあと,
全ての実行文の前に書く。
16デフォルトの名無しさん:03/11/12 11:41
Fortranにプリプロセッサは無いのでしょうか?
環境が変わるたびに書き換えるのは非常に面倒です。
VFの設定にはPreprocessorというカテゴリがありますが
>>17
VFとは 何でしょうか?ひょっとして Visual Fortran ですか?
HP FortranはCプリプロセッサ (cpp) 指令も認識します。
Sun Fortranはfppとcppというソースファイルプリプロセッサをサポートしています。
UNIX系コンパイラでは、拡張子を".F"とすることで、FORTRANのコンパイルの前にCプリプロセッサによって処理される。
21デフォルトの名無しさん:03/11/13 11:43
大学の研究でFortranを使い始めたばかりの者です。
コンパイラはVisual Fortranを使ってます。
私はC言語の経験があるのでプログラムの流れなどは入門書を読めば分かるのですが、
先輩からもらったプログラムを解読するためにはリファレンス的な本が必要です。
何かおすすめがありましたらお願いします。
22デフォルトの名無しさん:03/11/13 14:18
>>22
市販のf90本では富田本かねぇ
彼のwebページも読んでおくべし
本当はbit別冊のf90入門書が良いがもう市販されてない
富田本って>>4でしょ
大文字はやめてくれ〜っ
だれだ〜っ、とてつもなくどでかいコアファイルはきださせたのは〜っ!
26デフォルトの名無しさん:03/11/15 23:11
HPのVisualFortranってコンパイラのバグはどう?
IDEにVS使えるから、そろそろ移行しようかと思ってるんだけど。

海老ソフトProFortranのコンパイラ、バグ多くてやってられん。
integer :: a(3)
real*4 :: b(3) = hoge
a = real( b )
としても、a(1)にしかキャストされた値が代入されない。
a(1:3) = real( b(1:3) )
とすれば問題なし。
配列内の全ての値がキャストされ、a(1:3)に代入される。

subroutine( b )
logical, optional, intent(in) :: b
関数やサブルーチンにのlogical型仮引数をoptional属性つけて宣言した場合、
どうも、present( b )で実引数と結びつけられているか、調べられない。
おかげで、logical型引数にはoptional属性をつけられない。
logical型以外の引数の場合は問題なし。

何故かしらないが、select case構文内で
小文字で、"case default"と書くとコンパイラにしかられる。
仕方なく大文字で、"case DEFAULT"と書いてる。
うぜぇぇぇ。
27デフォルトの名無しさん:03/11/15 23:53
>>26
HP の Compaq Visual Fortran 6.6B で試してみたところ、
>>26で挙げられているバグはなく、正常にコンパイルできました。

なお、HP は Compaq Visual Fortran の販売を11月28日で終了して
今後 Visual Fortran の販売は Intel に移行します。
(Intel Visual Fortran 8(?) は12月発売予定)
ttp://www1.jpn.hp.com/products/software/development/dvf/
>>26
IDEにVS使えるから,VisualFortranと言っているが,IVFでは要VC.netです.
やっほー、ふぉーとらんらんらん
>>28
> IDEにVS使えるから,VisualFortranと言っているが,IVFでは要VC.netです.

おっ!ということは逆に言えば、VS.NETならVFなしでも動くということですよね?
今までVF買えなくてg77でがんばってきたけど、VS.NETならアカデミック版が生協で簡単に手に入るので買っちゃおうかなぁ。
31デフォルトの名無しさん:03/11/17 00:11
>>30
Visual Fortranを使うためにはVS.NETまたはVC++.NETが必要 と言う意味です。
VS.NETにはVFは入っていないため、VS.NETだけではFortranのソースをコンパイルできません。

詳しくは、下記のURLから
ttp://www.xlsoft.com/jp/products/intel/support/statusupdate_qa.html
> Q5. インテル Fortran コンパイラには、Microsoft Visual C++ .NET スタンダード版2002 または 2003、
>    あるいは Visual Studio .NET プロフェッショナル版2002 または 2003 が必要ですか。
> A5. はい。インテル Fortran コンパイラは Microsoft Visual C++ のリンカを使用するために
>    上記ソフトウェアが必要になります。
3230じゃないYO!:03/11/17 00:15
>>31
ねぇねぇ!!
ということはCのライブラリもリンクできるのぉ?
3430:03/11/17 01:13
>>31
> Visual Fortranを使うためにはVS.NETまたはVC++.NETが必要 と言う意味です。
ん?そうなんですか?うちの先生は、「Cなんかわからん!」とかいって、Visual Fortranしか入れてなかった気が。

それと31さんが示してくださったのリンク先のQ&Aを読むと、Visual FortranがなくてもVC Tがあれば、
というかVCのリンカがあれば、別にVisual Fortranがなくても(とりあえずコマンドラインからは)使えますよん。
と書いてあるように思えるんですけど。
で、IDEに関しても、

> Q4. IDE を持っていない場合、どうすれば良いですか。
> A4. 弊社では Microsoft Visual C++ スタンダード版および Microsoft Visual Studio プロフェッショナル版を販売しております。あわせてご検討ください。

と書いてあるからには、Visual FortranなしでもVCがあれば、IDEも使える気がするんですが。

35デフォルトの名無しさん:03/11/17 02:09
>>34
> Visual Fortranしか入れてなかった気が。
>>31で言ってるのは(まだ発売されてない)Intel製VFのことだよ。
いまCompaq (HP) が売ってるVisual FortranはIDE (Developer Studio)と
MS製リンカが付いてるので単体でコンパイルできるしIDEも使えます。

> VCのリンカがあれば、別に・・・
今のIntel Fortran CompilerはCVF(のリンカ)さえあればコマンドラインからは使えるから
IVFもひょっとしたらリンカさえあれば使えるかも知れない。(当然サポート外だろうけど)

> Visual FortranなしでもVCがあれば、IDEも使える気がするんですが。
すまん。言ってることがよく解らん。
VS/VCは単体でもそれだけでIDEやCコンパイラが使えるけど、
Visual Fortran(Fortranコンパイラ)がなければFortranのコンパイルはできない
と言う意味なんだが・・
>>35
> >>31で言ってるのは(まだ発売されてない)Intel製VFのことだよ。

うわ、そうでしたか(^^;失礼しました。
375:03/11/17 14:14
ど素人なのですが、教えてもらえますか?
y=3x**2+4x+3
うえの式を微分するプログラムは、どうすればいいのですか?
大学に入って、初めてプログラムをするので、まったく分かりません。
教えてください。
>>34
リンカとは,ソースプログラムをコンパイルしてできた中間オブジェクトファイル群を結合して
1つの実行可能なプログラム形式を作成するためのものです
なので,リンカだけがあっても,どうしようもないですよ
39デフォルトの名無しさん:03/11/17 21:03
NAGのライブラリーよこせ.
4221:03/11/19 19:51
富田本とやらを読みました。
先輩からもらったプログラムの中で
USE DFLIB
SECNDS
RAN
などは入門書に載ってないのですがどうすればいいでしょうか?
いろんな関数が載っているリファレンスのような本があればキボンヌです。
44プ〜多浪:03/11/20 16:04
FORTRANの自動並列化コンパイラでオープンソースってある?
4521:03/11/20 17:43
>>43
ありがとうございます。
課題で分からないところがあるのでどなたか知恵を貸してください。

integer*2 k,n,s
read(*,*) n
s=0
k=1
10 s=s+k
k=k+1
if( k .le. n) go to 10
write(*,*) 'n=',n,' s=',s
stop
end

s=1*2+2*3+・・・+n*(n+1)

s=1+1/2+1/3+・・・+1/n

上のプログラムを参考にして修正するものです。
凄く初歩的なものですがお願いします。
47デフォルトの名無しさん:03/11/21 04:11
f77か。
この程度は自分でやれよ。
わからないところって、丸投げじゃねーか。

S[n]=1*2+2*3+・・・+n*(n+1)
つまり
S[n=1] = 2
S[n] = S[n-1] + n*(n+1) [n=2,3...]

S=1+1/2+1/3+・・・+1/n
つまり
S[n=1] = 1
S[n] = S[n-1] + 1/n [n=2,3...]

これでもわからないなら、知恵以前の問題。
>46
s を integerのままにしておくなよ。
何でわざわざ,integer*2なんだろう
あ、ここの話題は66でも77でも90でも95でもいいんだっけ
なんでもいいんだろうけど66はちょっといやだな・・・
>>50
FORTRAN II だけだろ。(→ >>5)
カードやテープがいるの?
最強のカード?

10 CONTINUE
55素人:03/11/26 22:37
FORTRAN77で出力されたデータを、グラフ化する事を学ぶにはどうしたらいいのでしょうか?
相性がいいグラフィックソフトがあったりするのでしょうか?
>>55
とりあえずGNUPLOTかな?
個人的にはExcel+VBAもよく使うけど。
使い方はそれぞれのソフトを紹介している本なりWebサイトなりを探せば
いっぱい見つかるよ。
g77ってもっとスピード上がらないのかな?
もう見捨てられてる?
58デフォルトの名無しさん:03/11/27 02:07
>>55
おそらくプログラム実行中に出力されるデータを逐一グラフ化するんじゃなさそうだから、
FORTRAN77で出力云々はほとんど関係ないと思う。
出力するデータの形式とデータの種類だけが関係してくる。

グラフ化ソフトで読み込みしづらい様な出力データなら、
プログラムのコードを変更してそれに適した出力データを吐かせるのが普通だと思う。
もしくは、すでにある出力データをそれ用にフォーマットし直すスクリプトを組む方法もある。

手元に適当なソフトがあるならそれ使えばいいんじゃないかな。
安く済ませるならGNU PLOT。
しかし、これいまいち使い勝手がわるいんだよな〜

>>57
最新のCPUへ最適化されたコードを作れないなら、すでに見捨てられてるカモね。
これによってプログラムの実行速度が全然違ってくるし。
g95もβ(?)版は出てるようだけど、用途が用途だけに信頼性がまだ今ひとつ…
LinuxならintelのFortran90が無償で提供されてるからそれ使う手もあるけど、
これは使ったことが無いので良く分からない。

3000行未満程度のコードならあまり変わらないかもしれないけど、
コードがある程度の行数があってこれから大幅に変更するんなら、
早めにF95に移行した方が幸せになれるかも。
"F77に比べれば"格段に構造化しやすくなってます。
5957:03/11/27 03:21
>>58
レス有難う
でも僕の書いたソースじゃなくて、僕のいる分野で使われているソースをコンパイルするのに使いたいので
多分g77じゃないとだめっぽいんですよね。
行数はすべて合わせたら数万から十数万行は確実にいってると思います。
>>58 ヽ(`Д´)ノ gnuplot ハイイゾ!
61素人:03/11/28 08:13
>>56-57早速ありがとうございます。

>>56
excel,vb共に、持っていますが、vbは全く使ってません。
今まではexcelは一次元データ列ならそのまま扱えるのですが、
txtで開けないから、どういうフォーマットの細工をしたらいいか検討がつきませんでした。
もっと調べてみます。GNUPLOTも勉強してみます。

>>57
最終的には、2,3次元のデータを微小時間ごとに逐一だしたいのですが、
そこまで全く至るための知識不足です。

>グラフ化ソフトで読み込みしづらい様な出力データなら、
>プログラムのコードを変更してそれに適した出力データを吐かせるのが普通だと思う。
>もしくは、すでにある出力データをそれ用にフォーマットし直すスクリプトを組む方法もある。

GNUPLOTで描画するためには、FORTRANで吐かせるデータのFORMATを工夫すればいいだけですか?

62デフォルトの名無しさん:03/11/28 10:29
>>61
GNUPLOTでグラフを描くなら特にFORMATを指定しなくても
WRITE(10,*) X, Y1, Y2, ...
とかでもOKです。

あとはGNUPLOT側で
gnuplot> plot "hoge.dat" using 1:2, "hoge.dat" using 1:3
等のようにplotコマンドに適当なオプションを付ければ良いでしょう。

ttp://fenix.ne.jp/~cdrtk/misc/gnuplot/plot4.html
>>61
EXCELは配列データをテキストで開けますよ
64素人:03/11/28 16:11
>>62
そのHPでやり方覚えさせてもらいます。ありがとうございます。
>>63
例えば、
   write(7,100) ((u(i,j),j=2,n),i=2,n)
100 format(8(1h ,8f10.5/))
だと、エクセルで開くと、
(i,A)セルに、(i,1)〜(i,n)すべてが含まれてしまうんです。
65素人:03/11/28 16:13
n=9なので、
100 format(8(1h ,8f10.5/))
での、繰り返しは8です。
>>64-65
Excelでデータファイルを開くときに「カンマやタブで区切り区切られたデータ」(CSV)
で開いてない?
区切り文字にスペースを指定するか固定長フィールドのデータとして開くと
きちんと値毎に区切られて開けるよ。
67素人:03/11/28 22:29
>>66
できました!ありがとうございます。
g77 や f77 にて,standard な F77 でないところを指摘してくれる
オプションは無いのでしょうか.
別個の構文チェッカがあるのでしょうか.

これが妥当なのか知りたいのです:

WRITE(UNIT=*, FMT='(A, F3.1, A)') 'It is ', FOO, '.'
とする代わりに,
WRITE(UNIT=*, FMT='(\'It is \', F3.1, \'.\')') FOO
7068:03/11/29 17:25
>>69
サンクスコ.
早速やってみました.後者はダメでした.
みなさんはどうですか?まさか FORMAT 文ではないですよね?
>>68
WRITE(UNIT=*, FMT='("It is ", F3.1, ".")') FOO
これでも同じみたいですね.
7268:03/11/29 19:17
>>71
ほんとだ! ftnchek に怒られなかったよヽ(´▽`)ノ
まだ Professional Programmer's Guide to Fortran77 の 3 章を読んでいる
くらいなので,クォートの違いが何なのかは分からず...
"がF90だからじゃねの
7468:03/12/01 20:14
Professional Programmer's Guide to Fortran77 (どう略せばいい?) の
4 章によると,ダブルクォートは Standard じゃないみたいです.残念.
75デフォルトの名無しさん:03/12/01 21:35
シングルクオートをトイツにしてエスケープするのもダメ?
WRITE(UNIT=*, FMT='(''It is '', F3.1, ''.'')') FOO

>>68
よくわからんが,こうしたいのか?
WRITE(UNIT=*, FMT='(''It is '', F3.1, ''.'')') FOO
7776:03/12/02 12:27
75と同じだった.逝ってくる.
''と"が同じにみえた.
リンク中・・・
79質問者:03/12/04 21:42
質問があります。お願いします。

SUBROUTINE内で定義した、
COMMON /CDXYZ/DX(NSP),DY(NSP),DZ(NSP)
があります。これは、それまでに定義されてません。

  DXP(I)=DX(I)+FX(I)*DT**2/TMASS
DYP(I)=DY(I)+FY(I)*DT**2/TMASS
DZP(I)=DZ(I)+FZ(I)*DT**2/TMASS

なる文が最初に出てきますが、
DX(NSP),DY(NSP),DZ(NSP)は値が入っていないはずです。

この場合、値は全部0になるのでしょうか?
80デフォルトの名無しさん:03/12/04 21:43
◎クリスマスは楽しいなー!!◎お正月も楽しいなー!!◎一発やりてー!!◎
http://homepage3.nifty.com//hot-hot/7254.html
値が入っていないとは?
それらの配列を初期化していないなら、"基本的には"値は不定だよ
いくらcommon文とはいえ、初期化する必要があるなら、するべきだと思う
「いつも0になるから、0で初期化しなくていいや」なんて思わずに
82デフォルトの名無しさん:03/12/06 00:01
>>79
BLOCK DATA で初期化されている可能性がある。
83デフォルトの名無しさん:03/12/06 12:43
>81 :デフォルトの名無しさん :03/12/04 22:47
>値が入っていないとは?
>それらの配列を初期化していないなら、"基本的には"値は不定だよ
>いくらcommon文とはいえ、初期化する必要があるなら、するべきだと思う
>「いつも0になるから、0で初期化しなくていいや」なんて思わずに

そのとおり。Fortranは基本的には最初にメモリを静的に確保して、そこで
閉じている処理系。なぜなら大昔はメモリが極端に少ないから、そうするのが
当然だったんだろう。

今は当然違う。スタックを多用するので、特に副プログラム内の変数はコールさ
れるたびにアドレスが違っている可能性がある。大昔はそんなことやりたくても
できなかった。

だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った
り、全く動かないこともある。そのときには、スタックを使わないオプションで
コンパイルしたりする。

変数の初期化は、愚直にやった方が後々楽だ。
>>83
単にスタックのないプロセサだったんだろ。
普通、サブプログラム/関数のローカル変数を使いまわしができるスタック方式の方がメモリーには優しいよ。

> だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った
> り、全く動かないこともある。そのときには、スタックを使わないオプションで
> コンパイルしたりする。

ちゃんとデバッグしろよ。
8568:03/12/07 12:30
>>75-76
セクション 5.2 「Constants」を読んで,やっと何のことだか分かりました.
文字列リテラル内でシングルクォートを表現するには,
2 つ書けばいいんですね.てっきりパーレンを括っているのかと...
ありがとうございます.

どうでもいい話ですが,2ch や e-mail でも
FORTRANer なら一行 72 文字ですよね?
今まで 80 くらいでやっていたので反省しています.
f77 に完全準拠したコードを書くために ftnchek を使用するにあたって,
IMPLICIT NONE だけを許可したいときには,どんなオプションになりますか?
# ftnchek -f77 -nof77=implicit-none hoge.f
では
No string setting allowed for -nof77=implicit-none: ignored
と言われ,無視されてしまいます.
まさか,-f77= に implicit-none 以外の全てをリスト...?
8787:03/12/09 02:08
すみません、どなたかこのプログラムは、どういった物か教えてください。
フォートランには、まだあまり詳しくないもので、お願いします。
PROGRAM
IMPLICIT NONE
REAL::X
INTEGER::I,M
INTEGER,DIMENSION(20)::DICE

DO I=1,20
DICE(I)=0
DICE(M)=0
END DO
CALL SEED(794)
DO I=1,20
CALL RANDOM(X)
M=INT(20*X)+1
DICE(M)=DICE(M)+1
END DO
DO I=1,20
WRITE(*,*)I,DICE(I)/100000.
END DO
STOP
END
>>87
バグのあるプログラム
>>87
> DICE(M)=0

不定なインデックスのところに 0 を代入.

> CALL SEED(794)

泣くよ?

> WRITE(*,*)I,DICE(I)/100000.

20 回やったのに 100000 で割るのはなぜ?
9087:03/12/09 16:53
すみません、訂正です。
PROGRAM
IMPLICIT NONE
REAL::X
INTEGER::I,M
INTEGER,DIMENSION(20)::DICE

DO I=1,20
DICE(I)=0
DICE(M)=0
END DO
CALL SEED(794)
DO I=1,100000
CALL RANDOM(X)
M=INT(20*X)+1
DICE(M)=DICE(M)+1
END DO
DO I=1,20
WRITE(*,*)I,DICE(I)/100000.
END DO
STOP
END
>90
細かいバグは目をつぶって変数名などから想像すると
たぶん「20面体のさいころを10万回振ってそれぞれの目の出た確率を出力する」プログラム。
「目の出た*確率*」っていうのは妙だな。 「目の出た割合」か。
93デフォルトの名無しさん:03/12/09 18:47

>> だから、大昔のFortranプログラムをコンパイルすると実行時に答えが全く違った
>> り、全く動かないこともある。そのときには、スタックを使わないオプションで
>> コンパイルしたりする。
>
>ちゃんとデバッグしろよ。

10万行のプログラムをね。あんた、どれくらいの問題をやってる。
20年以上使われるとね、バグが本物になってしまうんだよ。

ここはバグですから直しておきましたと言って、余計なことをするなと
殴られる。
>>93 勉強になります.南無阿弥陀仏.
95デフォルトの名無しさん:03/12/10 01:12
すみません。質問です。
fortran90で、目的のファイルが更新されたら
自動的にプログラムを実行させるっていうプログラムは
どうやって書いたらいいのでしょうか?
>>90
訂正って,Mは結局不定のままじゃん.

>>95
VFならできなくもないが,Fortranで常駐プログラム作るよりは,Cで組んだ方がいいと思うが.
97デフォルトの名無しさん:03/12/10 19:48
Intel Visual Fortran Compiler 8.0 for Windows 発売age
>>93
オプション変えて、答えが合ってたら安心するんだ...。

まあ、そういうプログラムってことね。(藁
>>95
OS に依存する方法しか無いでしょう (?)
cron.d があるシステムならスクリプト数行!?
100デフォルトの名無しさん:03/12/10 22:25
>オプション変えて、答えが合ってたら安心するんだ...。
>
>まあ、そういうプログラムってことね。(藁
それくらいにしとけ。お坊ちゃん。
10195:03/12/10 23:45

ありがとうございました
相談があります。
学校での授業でこれからしばらくの間、FORTRANを使う事になったのですが、
それに伴って友人数名でコンパイラを買う事にしました。
ちなみに富士通のやつ。

複数のパソコンにインストール可能ですか?
何か複雑極まりないセキュリティが入ってて、パソ一台にしかインストール出来ないって事はありませんか?

無いとは思うんですが、やはり万が一って事もあるので・・・
法律的にはダメだって判ってるんですが、やっぱり一人では高くてとてもとても・・・・

アドバイスよろしくお願いします。
103102:03/12/11 22:31
正確に言うべきでした。
富士通のこれです。
ttp://software.fujitsu.com/jp/fcaca/intro.html
もし俺が>>102と同じ立場なら、1つだけ買って3人で使う。
アカデミック版とはいえ3万近くするから、無理して買うのは薦められないなぁ。

一番お薦めなのは、Linuxをインスコして、g95を入れる
The G95 project
http://www.xlsoft.co.jp/jp/products/intel/compilers/iftnwin.html

学校の授業で使う程度なら、intelから出てるコンパイラの体験版を使う手もある。
使用期限は30日だけど、そこはどうにかして・・・
そのコンパイラを使わない場合でも、オンラインマニュアルをダウンロードしておくと、何かと便利♪
http://www.xlsoft.co.jp/jp/products/intel/download.html
Salford FTN77 Personal Edition Compiler
これじゃ駄目?
106デフォルトの名無しさん:03/12/12 00:19
ifcはノンコマーシャル版がありますが?
107デフォルトの名無しさん:03/12/12 00:23
>>106
いや103を見るとwindowsで使いたいんじゃないかと。
ifc for windowsに非商用版はないでしょ。
108デフォルトの名無しさん:03/12/12 00:27
ついでに
>>104のG95プロジェクトのリンク先はこっちのまちがいだよね?
http://g95.sourceforge.net/

それからfortranコンパイラの定番情報源はこっちだ越前
http://www.mtl.t.u-tokyo.ac.jp/~nminoru/programming/x86-fortran.html
http://gcc.gnu.org/fortran/
とうとうG95プロジェクトから正式にGCCへ...
110102:03/12/12 22:22
winです。
フォートラン90が必要なので・・・・
111102:03/12/12 22:51
オンラインでドコにも売ってないってどういう事だゴルァ
全部古い奴だったし・・・・・
112デフォルトの名無しさん:03/12/12 23:22
>>102,111
オンラインで売ってる安い奴だとここかな?
http://www.lahey.com/index.html
Lahey/Fujitsu Fortran 95 Expressが$249
Essential LF90のEducational Licenseだと$79
あとFedExの送料が$45くらいかかる。

ただ、Essential の方は"古い"文法が使えないのでこっちを買うなら
F言語を使った方がいいかも。
詳細は↓参照
http://cij.jp/lahey/

でもカードが要るから学生さんには買いにくいかな・・・
# 電話orFAXも可、とは書いてあるけど
>>102
90じゃなくちゃ駄目な理由はよく分からんけど
コンパイラ買うなら、その金で良い本買ったほうが良いと思うけどなあ。

授業を担当している先生に、熱心に家でも勉強したいんですって言えば
Fortran90をインストールしたノートパソコンとか貸してくれそうだけど。
どこの研究室でも、ちょい古めのいらないパソコンは転がってるからね。
>>113
> 授業を担当している先生に、熱心に家でも勉強したいんですって言えば
> Fortran90をインストールしたノートパソコンとか貸してくれそうだけど。

「そうか。がんばれよ。学校に来ればいくらでも使えるから。」と言われるに一票。
勉強用ならWin版のコンパイラ買うよりも、古いパソコンにLinuxとIntel Fortran入れた方が安上がりかも。
プログラミングの勉強をするなら Windows なんてやめなさい.
苦労するだけです.
117デフォルトの名無しさん:03/12/13 17:26
>>116
先生、その代わりになるステキなOS名とその訳をお教え願いたいわけですが、
いかがですか?
>>117
たとえば Solaris9 がある.
x86 向けも売られているし,Linux 用バイナリも動くから
Intel の無償コンパイラも走るわけだ.
119102:03/12/13 20:05
Solaris9・・・・・名前しか知らない・・・

90じゃなきゃ駄目な理由。それは学校が指定したから、です。
77って、CASL2みたいに書かなきゃ駄目な奴でしたっけ?

>>114
おいどんもイピョ

ソフトは見つけました。安いトコ。
ttp://www.getplus.co.jp/pr/product641208.asp
>>119
> ソフトは見つけました。安いトコ。

安いどころじゃなくて,Intel 製の無料のがあるんですよ.Linux 用ですが.
http://developer.intel.com/software/products/compilers/flin/flin_noncom_lic.htm
non-commercial 版なので, 30 日限りの試用版とは違うのでしょう.

私は使ったことがないので良く分かりませんが,
今日にもダウンロードして試してみるところです.
>>119
77は1桁目にC, *を書くとコメント行、6桁目に文字を書くと継続行、コードは2〜72桁
と言った具合にプログラムを書く位置が決められている。

> ソフトは見つけました。安いトコ。
学生用は定価で8割引か・・・すごいね。
122デフォルトの名無しさん:03/12/13 23:32
とりあえず、即製品を買うのはお薦めできない。
その富士通のコンパイラ、90日間試用できるみたいだから、とりあえずそれ使ってみたら。
123102:03/12/13 23:58
Linuxですか・・・
レッドハットあたりだと、まあ直ぐに買えるとして、問題はハードディスクですな。
私はリナックスをダウンロードして組むような知識はありません・・・
パーティション分けして空けてやらないと・・・・

めんどくさい・・・・・

完全日本語化のディストリビュータってありますか?レッドハットは英語ばっかし・・・
ターボリナックスとかいっぱいあるけど使った事無い・・・

富士通のは、既に使った事があります。何度も。
VStudioと比べたら凄まじく使い難いけど、ウィンドウを調整したら行けそうです。
それにアカデミックで安いし。
送料込みで25k円弱・・・・うーむ。

インテルって英語版ばっかし・・・・?うわ。英語勉強しなきゃ。まあ単語覚えたら終わりですけど・・・
124アホ:03/12/14 00:34
富士通のコンパイラ、90日間経ったらOSごと再インストールしなおせばまた使えるようになるんじゃない?
>>102
ところで、どんな授業でFortran90を使うんですか?
これから先、自分の研究なりで確実にFortranを使っていく必要があるなら
自宅にもFortranが使える環境があるに越したことはないけど、
「計算機基礎」とかプログラミングの基礎的な講義で使うだけなら、わざわざ
高い製品版を買ったり、新たにOS入れたりする必要はないと思いますよ。

#このスレでこんなことを言うのもナンですが
WindowsでもC/C++やPascalならフリーの処理系がたくさんあるから
これらで勉強すればFortran90でのプログラミングも理解できると思います。
Fortran90なら基本的なことはCやPascalとあまり変わりませんから。
126102:03/12/14 01:42
>>124
いけるんですかね・・・・・?OSごと・・・・・

>>125
情報系の演習です。
ですが、将来、目指す研究室(物理系)で使う予定です。入れたら、の話だけど・・・・
CはVSで頑張ってます。
>>102 いいやつがあるんですよ.

KNOPPIX という,CD-ROM ブートの Linux です.
元からあるシステムを汚さない,とても安心なディスリビュージョン.
http://unit.aist.go.jp/it/knoppix/
特に,これを元にして学生の実習に特化した KNOPPIX-Edu が便利でしょう.
http://www.alpha.co.jp/products/knoppix-edu/
まさか CD が焼けないなんてことはないですよね :D

学生は Visual* を使わない方が学習しやすいんじゃないかと思います.
私は学生ですけど.
Redhat 系は商用ソフトウェアを頻繁に買う人向けですよ.
>>127
CD-Rドライブ持っていませんがなにか。
買いなさい。
>>128 最近は大学の計算機でも CD 焼けます.
VisualFortranで電力計算センターの作画ライブラリCalcPS使いたいんですけどうまく使えません。
リンクも設定してるんですけどなんででしょう。ビルドエラー出ちゃうんですよねえ。
>>131
ビルドエラーの内容を示さない時点でネタと見倣されました.
133デフォルトの名無しさん:03/12/15 16:45
Intel Visual Fortran Compiler 8.0 for Windows ってAMDのプロセッサでも動く?
134デフォルトの名無しさん:03/12/16 00:56
>>133
動く。
しばらく前のAthlon搭載PCで、SSEを有効してコンパイルしたらしっかり動いた。
ベクトル化も可能。
>>134
ありがとう。
コンパックだった頃は必要動作環境が、PC/AT互換機ってなってたのが、
インテルになってから、PentiumあるいはXEONってなってたんで心配だったよ。
136デフォルトの名無しさん:03/12/16 23:16
ttp://cc2.ce.nihon-u.ac.jp/~inui/kamoku/practical-programming-2003/2003-10_file/
ここにあるやつの宿題なんですけれども・・・
どなたか解いてくれませんか、お願い先生。
学校名さらしてんじゃねえよ。常識を考えろ。
138デフォルトの名無しさん:03/12/16 23:27
>>137
そうすね、スマソ
139デフォルトの名無しさん:03/12/18 00:31
FORTRANでいい本ありますか?
初心者です。F90を習いたいです。
140デフォルトの名無しさん:03/12/19 20:40
ポン大かよ・・・
141デフォルトの名無しさん:03/12/19 22:44
>>139
私の知る限り、>>4の冨田博之著「Forrtran90プログラミング」(培風館)か
定番(?)戸川隼人先生の「ザ・Fortran 90/95」(サイエンス社)ですかね。

それにしてもFortran90/95の日本語書籍は少ないですね。
一般書店ではFORTRAN関係の本も見かけなくなっちゃったし。

>>136
宿題は自分でやってこそ意味のあるものです。
また来年もがんばってね♪
142初心者:03/12/19 22:57
FORTRANって一般的に何をする言語ですか?
土木屋がよく使ってると聞いたのですが…
数値計算
144初心者:03/12/19 23:13
なるほど…解析とかに使うんですね。
C++ではできないんですか?
>>144
それは禁句。
146初心者:03/12/19 23:44
ん?禁句とは?できないんですか?
すいません。初心者なので。
これから、言語を学ぼうかと思っているんですが、
有限要素法などの解析をやりたいんですけどどちら
(C++とFORTRAN)が良いでしょうか?
143 名前:デフォルトの名無しさん[sage] 投稿日:03/12/19 23:07
数値計算

144 名前:初心者[] 投稿日:03/12/19 23:13
なるほど…解析とかに使うんですね。
C++ではできないんですか?

一人上手!
148デフォルトの名無しさん:03/12/20 00:02
>>146
「昔からの実績あるライブラリがたくさんあって、高速計算マンセー」
ならFORTRAN
「参考書がたくさんあって、オブジェクト指向マンセー」
ならC++
ってとこでしょうか

↓こんなスレもあるから参考にしてみては?
【科学技術計算】C言語とFortran どっちがいい?
http://science2.2ch.net/test/read.cgi/sim/1042715803/l50
149初心者:03/12/20 00:21
148
ありがとうございます。まさに今私が求めているような
答えがありそうです。

>>143
わざわざありがとうございました。
150初心者:03/12/20 00:22
>>148
">>"つけるの忘れてました。
知名度ってのは恐しいものだね >>C++
g95 はどのくらい使えるんでしょう?
ちゃんと配列の,要素ごとの足し算ができました.
intel のは大きくて使いづらいので,普段は g95 で逝きたいのです.

配列まわりの文には似たような書き方がたくさんありますね.
なるべく f77 と f95 でコンパチブルにしたいので,困ったものです.
なぜ、SUN でf77では
keta=5
write(text,'(i<keta>)') num
ができるのに、
f90ではできんのだ〜。・・・つかわなくて済ますことを考えるか・・・
>>141
ありがとうございます。
ザの方をゲットしました。
155デフォルトの名無しさん:03/12/23 06:24
あーーーー、眠い
シミュレーション用にFORTRANでプログラム組んだ人は、
どの程度の行数書きますか〜?
あーーーー、分子動力学計算の時は3千行程度で済んだのに...
ただいま、13K突破(禿鬱
>>155
眠いところすみません.
1 つのファイルが 13k (行ですよね) にもなってしまうことがあるんですか?
実際にカッコいいシミュレーションプログラムを
組んだことが無いので知らないんです...
FORTRAN では長いプログラムを回避できないのでしょうか?
>>156
合計 13k だろ...。
分割コンパイルくらいできるわ。
>>148
別に FORTRAN の関数を C++ から呼ぶことくらい
いくらでもできるんだがな...。
富士通のコンパイラ買っちった・・・・
で、届いた。
>>159 レポートキボン.速度とか.
学校で富士通のコンパイラ使ってるけど使いやすいよ。
コンパイルログが細かいし日本語だからデバックしやすい。
>>161
> 日本語だからデバックしやすい。

なんとなく悔しい.
>>161
何県?
>>163
愛知県。
なんで?
165159:03/12/26 21:54
>>160
それなりに使える。
ってか慣れかなぁ・・・・・
visualと比べると、かなり劣る。操作性とか。
166デフォルトの名無しさん:03/12/26 23:16
Fortran90は大文字と小文字を区別しますか?
また、キーワードは、大文字限定ですか?
167デフォルトの名無しさん:03/12/27 02:54
>161
デバッ「ク」??
>>168 まぁまぁ.だから日本語じゃないと困ってしまうわけでしょう.
170デフォルトの名無しさん:03/12/28 02:12
Fortranを始めたいのですが、Fortranのプログラムを書くためのソフトってどこ
に売ってるのですか?また、何て名前のソフトを買えばいいのですか?値段とか分かる
ようでしたら、それも教えて下さい。お願い致します。
171170:03/12/28 02:28
独学でFortranを始めたいと思っています。宜しければ、プログラムソフト(フリーの物が
あればそれも教えて下さい)と参考にする本を教えて下さい
Fortran ResQ - Fortran初心者に捧ぐ
http://homepage.mac.com/galois21/fortran/index.html
174170:03/12/28 03:46
>>172,173
早速教えて頂きありがとうございます。ですが
実際にダウンロードしてみて、ホームページに指定されてた通り

WRITE(*,*) 'TEST'
END  

と左から6文字開けて試しに打ってみたのですが、 test と表示されません。
代わりに 「ディレクトリは存在しません」というエラー表示がでてしまいます。
どこが、いけないのでしょうか?もし、宜しければ教えて頂けないでしょうか?
>>174
http://www.vector.co.jp/soft/dl/win95/prog/se153699.html
ここからCPad for Salford FTN77 2.31をダウンロードして解凍する。
解凍したフォルダの中のfcpad.exeを実行するとパスを指定を要求される。
コンパイラのパス C:\win32app\salford\ftn77.exe
ヘルプファイルのパス C:\win32app\salford\Ftn77.hlp
OK押すとCpadが開く。
Tabボタンで先頭の6文字を開けられる。プログラムを書く。
ツールバーの右向き三角でコンパイル&実行
176170:03/12/28 05:56
>>175
タビタビ申し訳ありません。 ご説明通りしてはいるのですが、
『コンパイルできません』とのエラーが出てしまいます。なぜでしょうか?
177170:03/12/28 06:04
>>175
あっ、すみません、上手くいきました。
教えて下さった皆様どうもありがとうございました。
また、分からない時はどうぞ宜しくお願い致しますm(−−)m
・・・
土木屋はFORTRANオンリーユー。
完全に初心者なら、本買え
>>180
プログラミング初心者なら,FORTRAN から始めるのが適切かどうかから
考えた方がいいんじゃない?
このスレ推薦の「Fortran90プログラミング」は,
初めてプログラミングする人も対象になっていますか >持っている人

うかつにも変な本を買っちゃって,しかもそれで勉強しようと躍起になると
後遺症がひどくなるからね.
182デフォルトの名無しさん:03/12/30 20:57
>>181
Fortran自体、簡単な言語だと思うが・・・
>>182
でも,同じことをするのに方法がたくさんあるなぁと.perl みたいに.
うーん、Fortranを勉強しようっていってるだけで、
他の言語知識が全く無いとは、まだわからないわけであり。
170がもうちょっと話しないと。
それとも別スレに行っちゃったかな?

ザ・フォートランの方が易しいと思うぞ。うん。

CASL2勉強してたら、Cやfortranのありがたみが身にしみる・・・
割り算するのがすっげえめんどくさい・・・・

あ、上のほうで、富士通買った者です。
総合的には使い易いっす。
あえて不満を述べるならば、
エディタ画面に「実行」のショートカットが欲しいのと、
作ったソースの拡張子を、オートで.F90にしてくれない所かな。
WRITEやREADなどを色分けして欲しいなぁ・・・・・
あ、エディタで、
これは無いだろ、っていうようなフォントは余計だと思いまつ。
うぷしました。
ttp://dokuo-ha-hitori.dyndns.tv/~dokuo/cgi-bin/zuru/source/dokuo0895.png
こんな感じ。
改行文字がアホっぽくていい感じです。
186デフォルトの名無しさん:03/12/31 02:27
f90gl を使い始めたのですが、どこかに日本語の良い資料等はないでしょうか?

今のところ下記ページの例題をFortran90に直して遊んでいるような段階なのですが
googleで調べても日本語の情報が見つからないので・・・。

GLUTによる「手抜き」OpenGL入門
http://www.center.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
>>181
残念ながら、FORTRANの和書に自信をもってお勧めできるものは無い。
他のメジャーな言語なら、初心者・中級者・上級者用と品揃えも豊富だけど、
化石と言われる言語だけあって、ろくに揃っていない。
大型書店でも、初心者用しか揃えていないのが実情だ。
また、このスレ推薦の書籍も、FORTRAN90の機能を全て網羅している訳ではないので、
FORTRAN90らしいmoduleの使い方を覚えられるとは思えないよ。
F90系の書籍は、どれも基本の文法書って感じ。

>うかつにも変な本を買っちゃって,しかもそれで勉強しようと躍起になると
>後遺症がひどくなるからね.
多少わかりにくい書き方でも、それを読み解く能力は必要だと思うぞ。
多かれ少なかれ、誤植や著者の誤認識はあるしな。
>>188
Larry Nyhoff / Sanford Leestma 「入門 Fortran90」
> 「情報処理技術者試験」のプログラミングの選択科目にあるように、
> 科学技術計算用のプログラミング言語として、まだまだ需要は衰
> えておりません。
読んだことないので内容はどうか知らないが、この紹介文見てると
ちょっと躊躇するなぁ。
最近fortran90/95でコード書いてみたりしてるんだけど、
いわゆる中・上級者用のおすすめ書籍とかあるんでしょうか?
洋書で無問題です。

メモリストライドを工夫した高速化とかの基本的なことは知ってるんだけど、
fortranならではって奴は全然知らないもので。
とりあえず、FORTRANの文法に関しては>>43に書いてるのを嫁

アルゴリズム
ttp://www.amazon.co.jp/exec/obidos/ASIN/4764902451/250-8268012-0962650

蟹半先生の作法本
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756136494/250-8268012-0962650

御クヌース公の暇つぶし
ttp://www.amazon.co.jp/exec/obidos/ASIN/4320023684/250-8268012-0962650
http://www.books.or.jp/ResultList.aspx?scode=&searchtype=0&title=fortran90&writer=&syuppansya=&showcount=100&startindex=0

コレが全部みたい。
今、海女損でフォートラン本の中古出てるけど。
出品者がなんかヤバめ。
193デフォルトの名無しさん:03/12/31 22:56
bit別冊 詳細Fortran90 ってのが好き
白黒で 色気が無いけど
重版してくれないかな

ttp://product.esbooks.yahoo.co.jp/product/all/top?accd=19319404
194デフォルトの名無しさん:03/12/31 22:58
Fortran.netをはじめたのですが、資料がほとんどありません。
いい本がなにかありませんか?
195190:03/12/31 23:38
これってどうなんでしょう。誰か読んだ人居ません?
http://www.amazon.co.jp/exec/obidos/ASIN/0521574390/

あと、これ。評価高いけれど、ちょいと高過ぎ...(しかもペーパーブック
http://www.amazon.co.jp/exec/obidos/ASIN/0070119384/

>>193
禿胴
あるところでたまたま、時間潰しにぱらぱら見たんですが、
思わず欲しくなりました(今も欲しいですけど
復刊希望はまだ無いみたいですね@復刊ドットコム

>>194
Laheyですか?
言語リファレンス(日本語版が9800円)とマニュアルくらいかも。
nrはオンラインでも見れたりする
http://www.numerical-recipes.com/nronline_switcher.html
198190:03/12/31 23:53
>>196
多分そうですね。原著で買ってしまうのも手だなぁ。
199190:03/12/31 23:56
>>197
すいませんでした。検索してたときはてっきりソース乗せてるだけだと思ってた(汗
ありがとうございます。
・・・・・・・ちょっとしか読めない・・・・・クソ
太平洋戦争で日本が勝ってたら、世界の標準語がじゃぱにーずだったのに・・・・・!
詳説FORTRAN90、この前YahooAuctionに出てたよ。
202193:04/01/01 01:26

僕、間違えてましたね。すみません。詳細でなくて、詳解。

Numerical Recipes、手元にあったんで、ぱらぱらみてみた。
アンダスコア で 実数の種類指定できるの知らんかった。
ちょっと勉強になった。3へぇくらい。

PROGRAM TEST
IMPLICIT NONE
INTEGER,PARAMETER :: SP=4,DP=8
REAL(DP) :: x1,x2,x3
REAL(SP) :: y1,y2,y3
!! 倍精度 ; 単精度 ; 単精度
x1=1.e-2_DP ; x2=1.e-2_SP ; x3=1.e-2
y1=1.e-2_DP ; y2=1.e-2_SP ; y3=1.e-2

WRITE(*,'(1P3E)') x1,x2,x3
WRITE(*,'(1P3E)') y1,y2,y3
WRITE(*,'(1P3F)') y1,y2,y3
STOP
END PROGRAM TEST

ファイル出力の書式設定で F型 に Pで位どりするときだけ
値が変わるのすっかり忘れてた。いや、もともと知らんかったのか。
うっかりどこかで使ってるかも。怖いよう〜。
家にあるFORTRANの本何冊あるか数えてみました・・・12冊・・・
会社に確か4冊ぐらいあったから、合計16冊か。
本屋にある本ほとんど買ってしまったからねえ。
古い本だとパンチカードの解説から始まります。
みんなそろってサンプルプログラムはタコ。GO TO文使いまくり・・・
ふぉーとらんらんらん
シェイプアップフォートラン
              __,,,,,,
         ,.-'''"-─ `ー,--─'''''''''''i-、,,
      ,.-,/         /::::::::::::::::::::::!,,  \
     (           i:::::::::::::::::::::;ノ ヽ-、,,/''ー'''"7
      `''|         |:::::::::::::::::::::}     ``ー''"
        !       '、:::::::::::::::::::i
        '、 `-=''''フ'ー''ヽ、::::::::::/ヽ、-─-、,,-'''ヽ 
         \_/     ヽ--く   _,,,..--┴-、 ヽ
                     ``"      \>
207デフォルトの名無しさん:04/01/04 22:46
だれか、go to , common , if(a)100,110,100
とかで、わけわからんソースの効率的な読解法
教えてくれ、もう限界だ…(ToT
208デフォルトの名無しさん:04/01/04 23:51
4*4 行列の逆行列の求め方がわからん。鬱
>208
小行列式をといて、余因子をもとめれば(ここまでならサラスの方法でできる)
4*4行列式もすぐに解けると思うんですけど。
210デフォルトの名無しさん:04/01/05 00:24
>>209
手計算は分かるんですけど、それをどうプログラムするか分からないんですよ。
数値計算の宿題が急に出されて。
プログラミング初心者です。すみません。
211デフォルトの名無しさん:04/01/05 01:07
学生なら線形代数の教科書嫁 .or. ぐぐれ
212デフォルトの名無しさん:04/01/05 02:43
>208
逆行列の求め方
余因子展開をプログラムで組むのが難しいなら、
掃きだし法と同じ操作を単位行列に対しても行う
のが一番簡単。

原理は簡単
逆行列というのは掃きだし法の操作をすべて掛け合わせてできる行列だから。
ただし、ある程度の精度を出したいなら対角要素にはなるべく大きな値を
持ってくるように行列の入れ替えなどを考慮する。
寝れない。 >>210 それほど難しくない。どっか適当なfortranホムペを一通り真剣に読んできなされ。 私もそうやって勉強したfortran。
改行入ってない(´д`;;)
寝よ…
A B 1 0 … (1)
C D 0 1 … (2)
  ↓
1 E F 0 … (1)' = (1) / A
0 G H 1 … (2)' = (2) - (1)' * C
  ↓
1 E F 0
0 1 I J … (2)'' = (2)' / G
  ↓
1 0 K L … (1)'' = (1)' - (2)'' * E
0 1 I J

(A B) -1  (K L)
(C D)   = (I J)
216デフォルトの名無しさん:04/01/05 08:03
Visual Fortran 5.0 で、配列はどれくらいまで取れますか?
メモリーは256MBです
余因子展開は,実際に逆行列を求めるときには使わないと思っていました.
意外と使われるんですね.LU やら掃き出し法が主流かと思っていました.
218デフォルトの名無しさん:04/01/05 10:34
>>208
逆行列をFortranでできますよ
だけど、逆行列が忘れてしまいました
詳しく教えてくれれば、逆行列のサンプルプロ考えます
助詞を変だな。
>>219
あぁ、FORTRANでの逆行列の求め方ならここにかいてあるよ。
本気で理解しようとすれば、すぐ組めるようになるよ。
http://www.geocities.co.jp/SiliconValley/5634/t82A8_0004.html#2107
221219:04/01/05 15:17
>>220
何で俺に言うかな。
222208:04/01/05 15:51
少し本を読んでわかりました。すこしずつプログラム書いてます。ありがとうございます
223デフォルトの名無しさん:04/01/06 04:53
あのお・・・
Visual Fortran 5.0 で、配列はどれくらいまで取れますか?
メモリーは256MBです


224デフォルトの名無しさん:04/01/06 06:12
>>223
自分で実際にテストしてみればすぐわかる。
>>223
配列の型による
配列の確保が動的か静的かによる
コードによってはコンパイルオプションによる
仮想メモリの設定による
配列が大きくなるとスワッピングが激しくなるので,>>223の忍耐力にもよる
OpenMPを使って、研究室で今まで使ってきたコードを並列化してるんですが、
速くならないとか言う以前にNaNNaN攻撃をくらいます。

!$omp do parallel

してるループ内で関数を呼んでるんですが、やっぱこの辺が悪さをしてるんでしょうか…。

で、とりあえずOpenMPでぐぐったんですが出てくるサンプルは単純なものばかり。
どこかに実際にOpenMPを使って配列したコードを公開してたり、実践的な情報を集めたりしてるページを
ご存じないでしょうか?
>>226
どんな関数を呼んでるの?
詳しく教えてplz
229226:04/01/09 11:49
>>227-228

うおっ!まさに228さんのリンク先に書いてあるような関数を呼び出してました!さっそくじっくり見てみます。
情報ありがとうございました。
230デフォルトの名無しさん:04/01/13 17:49
変数に格納されたものがNaN or INFか、否かの判定はどうればいいのですか?
う〜ん・・・
232デフォルトの名無しさん:04/01/13 23:38
>230
処理系の拡張機能に頼る。
VF だと ISNAN(x) つうのがあるね。
>>232
> 処理系の拡張機能に頼る。
> VF だと ISNAN(x) つうのがあるね。

うわ、isnan()ってVF依存だったんですね。Intel Compilerでも使えてるけど、それは単にportlib使うように
してるから動いてただけか…。
>NaN (Not-a-Number)---数でないものを表すIEEE浮動小数点ビット・パターン。
>DIGITAL Fortran 90は、NaN値を出力ステートメントでは「NaN」で識別します。
>NaNは、signaling NaNまたはquiet NaNにすることができます。
>・quiet NaNは、0./0のような計算の結果として発生し、すべてが1の指数部と最初の仮数ビットが1を持ちます。
>・signaling NaNは、意図的に設定する必要があり(計算の結果ではなく)、すべてが1の指数部と最初の仮数ビットが0で、1つ以上の仮数ビットが1となります。
f(x,y)=exp((x-a)**2+(y-b)**2)において、a,bに任意の値を入力して
f(x,y)が最小となるx,yを求めるプログラムの課題を出されたのですが、
全く分かりません。ヒントはニュートン法と数値微分らしいのですが
どなたか手順だけでも教えていただけませんか。

>>235
とりあずそのヒントをキーワードにしてググりなさい。
print *,"aとbを入力してぽ"
read *,a,b
print *,"f(x,y)が最小となるx,yはx=",a,"y=",b,"でふ"
>>230
a=NaNかInfinityとして
if(a/=a)then
write(*,*) "NaNです"
else
b=a*0
if(b/=b) write(*,*) "Infinityです"
end if
とかじゃだめ?
239名無し:04/01/17 00:20
自然数nを代入すればその2,3,4,5,6,7,8,9進数表示を求めるプログラムを教えて
下さい??途中まででもいいんでお願いします。
>>239
ほい。
Objective Caml だけど。

let rec digit n radix =
 if(n == 0) then ""
        else (digit (n / radix) radix) ^ (string_of_int (n mod radix));;

let rec list_digit n radix last =
 if(radix > last) then ""
           else (string_of_int radix) ^ ": " ^
              (digit n radix) ^ "/ " ^
              (list_digit n (radix + 1) last);;

let list2to9_digit n =
 list_digit n 2 9;;
241名無し:04/01/17 00:52
≫238 
ありがたいんですけど誰かfortranでお願いします。
242名無し:04/01/17 00:52
↑≫239の間違いです
>>239
ほい。
途中までだけど。

    PROGRAM HOGE
    WRITE(*,*) 'INPUT N:'
    READ(*,*) N
    DO 100 I=2, 9
     CALL NSHIN(I, N)
 100 CONTINUE
    STOP
    END
244名無し:04/01/17 01:38
プログラムの説明簡単に教えて下さい??
>>239
ほい。
LISP だけど。

(defun digit (n radix)
 (if (zerop n)
  ""
  (string-concat (digit (floor (/ n radix)) radix)
            (write-to-string (mod n radix)) )))

(defun list-digit (n radix last)
 (if (> radix last)
  ""
  (string-concat (write-to-string radix) ": "
            (digit n radix) "/ "
            (list-digit n (1+ radix) last) )))

(defun list-2-9-digit (n)
 (list-digit n 2 9))
算数の問題だな。
p 進数の n 桁目をどうやれば求められるか、という。
頭振り絞って考えれ。
247名無し:04/01/17 01:46
≫245さんへ
いろいろ詳しいですねぇ!!fortranのプログラムの意味が全く分からない
んですけど…。あぁこれができないと留年だぁ。
248名無し:04/01/17 01:51
2^0+2^1+2^3+…2^n乗のようにすれば求められるって分かるんですけど、式
にしろっていわれるとできないんですよね
まず10進数で考えると分かりやすい。
250名無し:04/01/17 01:57
10進数にしたらなおさら分かりにくいような気がするんですけど…
そんなことないって。
得られるべき結果がすぐに分かるから
チェックが楽。

先ず、123 から 1 の位を取得してみ。
252名無し:04/01/17 02:19
1の位は3、10の位は2、百の位は1で…。えっと次は…

n = 123
first = ... 1の位を取得するには何を書けばいい?
254名無し:04/01/17 02:58
すいません。分かりません。
全ての整数nについて、手計算!
例えば66の7進数を手計算で求めるにはどうすればよいか。
その手順を細かくノートに書き出してみる。
あとはそれをプログラムに置き換えればいい。

それでも解らなきゃもう一年勉強し直した方が・・・
257名無し:04/01/17 03:25
これでも某国立大学なんですけどねぇ・・・ トホホ
もしかして、mod しらないのかな。
259デフォルトの名無しさん:04/01/17 03:29
どこの大学?
260名無し:04/01/17 03:35
北陸の大学です。まだ1年生なもので・・・
1年で留年とかあるのか。
262名無し:04/01/17 03:39
これは必須の教科なので絶対単位を落としたらダメなんですよねぇ!!
っていってもそんな難しい課題じゃないんですけどねぇ…
176 ÷ 10 = 17 ... 6

これ見てピンと来ない?
264名無し:04/01/17 03:45
あぁあぁ。そういうことか!!非常に分かりやすいですねぇ。本当
自分馬鹿だ・・・
本当に難しくないならできるでしょ、

といってみるテスト
266名無し:04/01/17 03:46
でもどうやって他の進数に応用を効かすんですか??
もちーと考えてみ。
適当な数値を紙と鉛筆で実際に変換してみ。
268名無し:04/01/17 03:52
今日はちょっと眠いんで寝て考えます。また掲示板に何か書き込むかも
しれないのでヒントをお願いします。ありがとうございました。
とりあえず全部手計算で求めれ。

 16 進数:1F
 15 進数:21
 14 進数:23
 13 進数:25
 12 進数:27
 11 進数:29
 10 進数:31
.  9 進数:34
.  8 進数:37
.  7 進数:43
.  6 進数:51
.  5 進数:111
.  4 進数:133
.  3 進数:1011
.  2 進数:11111
>>268
普通に,x を n 進数で表すなら,
割り算の筆算を上下逆に書いて,x を n で割り続ける.

ex. 60(10) を 7 進で.
60/7
8/7 ... 4
1 ... 1

だから下から並べて 114(7) .下に行くほど重いからね.

答えを言ってスマンかった >all
271270:04/01/17 14:13
>>245 LISP でやるなら,もっとちゃんと書いてくれないとイメージダウンですw
(defun radix-list (x n)
(labels ((f (x n lst)
(cond ((< x n) (cons x lst))
(t (multiple-value-bind (q r)
(truncate x n)
(f q n (cons r lst)))))))
(f x n '())))

(radix-list 60 7) ===> (1 1 4)
めんどっちくて末尾再帰にしなかったのと、
文字列にしたかったんだぁよ。
あと、truncate は知らなかった。
273デフォルトの名無しさん:04/01/17 16:16
>>239
ほい。
Visual Basic だけど。

Option Explicit

Private Sub Command1_Click()

 Dim n As Long
  Dim w As Long
  Dim i As Long
  Dim strn As String
  
  n = Val(Text1.Text)
  
  Text2.Text = ""
  For i = 2 To 9
    w = n
    strn = ""
    Do While w > 0
      strn = CStr(w Mod i) & strn
      w = w \ i
    Loop
    Text2.Text = Text2.Text & vbCrLf & CStr(i) & ": " & strn
  Next i

End Sub
>>273
VBで、

> Option Explicit

ってのはFortranで言うところの

implicit none

と同じでしたっけ?
>>239,241,247,248,252,254,257,260,262,264,266,268 さんは
まだ寝てるのかな?明日提出かもね.
まあ lisp でやれば先生も分かってくれるって (w

ところで,Fortran や C では
先に n 進数で何桁になるか計算して,アロケートしないとなりませんよね?
276再帰も知らんのか ?:04/01/18 10:20
>>275
FORTRAN は知りませんが、C では「ノー」です。
277275:04/01/18 15:48
>>276
再帰にしたところで,どこに格納すれば良いのでしょうか.
出力に書き出すのは無しです.

ところで,末尾再帰をループに直すように仕様に定めないのはなぜですか?
278デフォルトの名無しさん:04/01/18 15:50
integer型の範囲がわかってるなら、結果の桁数もわかるじゃん
>>277
スタック
280275:04/01/18 16:16
>>278
あ,なるほど.でもちょっと計算機を意識しすぎというか,何というか.

>>279
動的アロケート無しにスタックを使う,良い例をお示しください m(__)m
in Fortran.

面白い Fortran スレになってきましたね.
281デフォルトの名無しさん:04/01/18 16:27
recursive subroutine print_shinsu( num, base )
integer, intent(in) :: num, base

integer :: m

if ( num == 0 ) return
m = mod( num, base )
call print_shinsu( int( num / base ), base )
write(*,'(i1)') m
return

end subroutine
282281:04/01/18 16:31
失敬
>write(*,'(i1)') m
write(*,'(i1)', advance='no') m
だわ
fortran 77 compiler (Watcom)が無償配布されたよー
>>280
> in Fortran.

>>276 >FORTRAN は知りませんが

日本語も理解できないのか...。
285275:04/01/18 19:18
>>281 出力吐き出しちゃってる(⊃д`)

>>284 誰が書いてもいいではないですか.Fortran スレなんですから.
誰が書いてもいいけど、話の流れぐらい読んでからにしてくれ。
>275
>あ,なるほど.でもちょっと計算機を意識しすぎというか,何というか.
それを持ち出すなら、当然、入力された数字列に合わせて、
自然数(n)を格納するメモリ領域を決定する訳だ。
入力した数字(桁数無制限)を、1文字ずつ配列に格納して。。。
Fortran -> Fortran90 以降
FORTRAN -> FORTRAN77 以前
上の90のプログラムの完成系はどんなんですか?
>>289
programでprint_shinsu()を呼ぶだけ
>>290
何度もすいません
print_shinsu()の呼び方を教えてください。
はあ?
次は
「別の××の○○が□□してしまいます.」
と言うのかな.
295275:04/01/20 20:30
>>287
> 入力した数字(桁数無制限)を、1文字ずつ配列に格納して。。。

う,,,でもほら,
2 進では 10 進で小さい数でも桁が多くなってしまうではないですか.
と思ったりしましたが,大きさ 64 の配列で十分そうですね...

高速化の妨げになるから動的アロケートを避けるというのが本当なら,
割と仮定が多いプログラムになってしまうのでは,と思っているのですが,
何でも動的アロケートに訴えるのは病気ということでしょうか.
>>295
例えば int を変換する場合、
INT_MAX が 2 進で何桁になるかが分かってれば、
最低でもそれが格納できるだけのサイズのバッファがあれば十分。
これは常に正しく動くという意味で、仮定でもなんでもない。
無駄になる領域はあるかもしれないけど。

動的にアロケートした場合も
16-byte 境界(環境依存)に合わされたりして
若干無駄になる領域はあるけど、
固定長の時よりはまし。
同じinteger型でも、多くの処理系ではinteger(16)=128bitまでだから、
2進数を格納する文字列の長さが128あれば十分。

>ヒープ領域の動的確保
使用する事が問題なんじゃなくて、大きな領域を何度も確保&解放する事が問題なの。
特に数値計算の場合、1ステップに1回だけ動的配列の領域確保&解放をするだけでも、
数十万回も呼ばなければならない事が多々ある。
確保する領域が大きな場合、メモリ使用量がえらい事になる。
一般にdeallocate()によってコード上は解放された領域でも、すぐOS側に返される訳じゃない。

動的配列の確保&解放にともなうオーバーヘッドが気になるなら、動的配列に静的属性をつけて、
可変長の文字列読み込み処理のように、領域を確保&解放する回数をなるべく減らすようにすれば良し。
ただ、何でもかんでもこの方法をとるのは間違い。
ケースバイケースで、「計算機を意識した」処理を汁!

(例)
subroutine sub( n )
integer, intent(in) :: n
integer, :: alloc_sz = 16
integer, save :: sz_array = 0
integer, dimension(:,:), allocatable, save :: array
if ( n > sz_array ) then
if ( allocated( array ) ) deallocate( array )
sz_array = n + alloc_sz
allocate( array( sz_array, sz_array ) )
endif
...
end subroutine
298Nanashi_et_al.:04/01/21 22:21
流れを遮って申し訳ないないです。
Fortranで多倍長演算をしたいのですが
どのライブラリを使ったら良いでしょうか?
GNU のMultiple Precisionは、Fortranから使うには不向きなようでして…
ご助言いただけると助かります
倍精度や四倍精度だったら
プログラム中の変数やパラメータの値を
real(16) : : aとか1.0d0みたいに置き換えてあげればいいだけだと思うけど・・・
コンパイラによるのかな??
300名無し:04/01/22 18:03
≫275
返事遅れました。10進数をn進数にするプログラムの話ですが。数学的には求める
ことができたのですがプログラムで書くとなると余りの部分をどうやって抽出して書けばいいの
か分からないんですけどどうすればいいでしょうか??できればBASICとFORTRANで
説明していただくとありがたいです。馬鹿な質問ばかりしてすいません。…
301仕様書無しさん:04/01/22 21:54
fortran77でSSF法を書きたい板で書いた者です。
本スレは削除依頼を出してきたので、こちらで質問したいと思います。
FFT(高速フーリエ変換)を使ったスプリットステップフーリエ法を
どうかご教授お願いいたします。

Cのソースはあるのですが
http://photonics.ece.umd.edu/software/
fortran77で記述できなくて困っています
どうかよろしくお願いいたしますm(_ _)m
302298:04/01/23 00:00
>>299
記述が正確ではなかった様ですみませんでした。
コンパイラはCygwin 上のgcc(F77)を使っていまして
多倍長整数の演算が主な目的です。
F90が必要であればIntelの評価版を試すつもりではいます。
再度ご助言頂けると大変助かります。
>>301
>fortran77で記述できなくて

CとFortranの文法比較ができないから?
http://www2.odn.ne.jp/~cbn33260/AS400/fort-c.htm
SSFMが分からないから?
http://www.asahi-net.or.jp/~ix6k-smur/Doctor/chap2.pdf
パソコンが無いから?
http://www.a-z.x0.com/cha/pc.html
304301:04/01/23 13:45
>>303
リンクありがとうございますm(_ _)m
CとFortranの文法比較ができないっていうのと
SSFMが分からないのと半分半分です・・
fortranもCも初心者なもので・・・
Fortran2000(?)は95に比べてどの辺が新しくなってるんですか?
というか2000の規格はもう正式に決まったの?
Fortran2000の仕様(ISO/IEC Technical Report)を一部先取りしています。
307デフォルトの名無しさん:04/02/04 20:45
機械工学専攻なんですが、FortranとC++どちらかとらないといけないんですが、
どっちをお勧めしますか?
308デフォルトの名無しさん:04/02/04 20:47
C++覚えれば、Fortranを覚えるのはすぐできると思うから、
ここは難しいほうのC++で・・・。
309307:04/02/04 20:53
>>308
C++の前にCをとるのですが、Cも難しいですか?
プログラミングの知識ゼロなんで、なにがどうなのかC++って何をするため
とか全くわからないんです。。
将来的にはFortranとC++ではどちらが役にたちますか?
310デフォルトの名無しさん:04/02/04 21:12
Cは別に難しくないよ。(というと語弊があるかもしれんが)
入門書も氾濫してるし、応用も利きくから、
初めての言語としてはいい選択かと。

>将来的にはFortranとC++ではどちらが役にたちますか?

気にするな。みんなFortranの子孫だw
Fortran。FORTRANはだめだぞよ。
312fortranran:04/02/05 03:55
どなたかCVF6.6からIVF8.0に移行して
いろいろ試している人いる?

なんか実行速度おそいんだよねぇ
PEN4(HT)だから期待してたのに・・・

最適化レベルを上げようとすると、CVFの時は出なかった
エラーが出てLEVEL2どまりです。

まっ会社のお金でかったんだからいいけど
>>309
> C++の前にCをとるのですが、Cも難しいですか?

結局先に C をやるのね.
すぐ数値計算に使うなら Fortran かと思いますが,
たぶん,数値計算するときにはまた覚え直すことになると思うので,
C++ が良いでしょう.

C は計算機の一般的な知識が無いと使いにくいんですが,
C++ は知らなくても良いように高級になっているんです.
とっても計算量が多いプログラムでは,C++ より C が使われるんだそうです.
そうでないものには,ほとんど C++ なんだそうです.y
むしろ,CとC++のちゃんぽんだな
>>312
移行しました。
全く使いこなせてません。
全然最適化されてる気がしません。
ソースレベルで自ら最適化しないといけないのでしょうか。
>>315
IVF8.0はVS6でもイけますか?
それとも.NETおんりー?
317315:04/02/06 12:59
Microsoft Visual C++ .NET 2002/2003 スタンダード版かそれ以上がないと使えません。
はっきり言って面倒くさいです。
C++のインストールにすごい時間かかりますし。
上にも書いたように全然使いこなせてないので、.NETがどれだけすごいのかも分かりません。
結局DOS窓からコンパイルしてます。
318316:04/02/06 16:21
>>317
そうですか.だめですか
http://www.intel.com/software/products/compilers/fwin/

>The compiler plugs into the Microsoft Visual Studio* 6.0 and .NET environments
>offering developers the leading IDE for Windows*-based Fortran development.
って書いてあるから、6でもいけそうだと思ったんだけど
でも,
http://www.xlsoft.com/jp/products/intel/compilers/iftnwin.html
には.NET 2002/2003以上って書いてるし…
319デフォルトの名無しさん:04/02/12 08:18
質問ですっ

フリーコンパイラ
Salford FTN77 Personal Edition Compiler

をアンインストするにはどうすればいいのでしょうか?
宜しければ教えてください<(_ _)>
>>319
釣られてみる
[スタート]→[設定(S)]→[コントロール パネル(C)]→[プログラムの追加と削除]
>>319
m9(´∀`)アハハ八八ノヽノヽノヽノ \ / \/ \
322319:04/02/13 07:15
一度見たときに無いような気がしてただけで、よく見たらありました;
アリガトございました & スイマセンでしたっ><
323319:04/02/13 07:16
一度見たときに無いような気がしてただけで、よく見たらありました;
アリガトございました & スイマセンでしたっ><
324319:04/02/13 07:16
_no
325デフォルトの名無しさん:04/02/13 22:53
最近CPad for Salford FTN77を使い始めたのですが、
メインプログラム、サブルーチンごとにfファイルが分かれている
場合、どのようにコンパイルしたらよいのでしょうか?市販の
コンパイラーだとメイクファイルを自動生成できるのですが、
手書きの場合、書き方がわからないのです。
たとえばkota1.f(メインファイル)kota2.f,
kota3.f(それぞれサブルーチン)のファイルを
実行するためにはどのような手順を踏めば良いですか?
どなたかアドバイスをお願いします。
>>325
FTN77 User's Guide 265ページ 「21. Using MK and MK32」
リンク中・・・
リンク中...
329デフォルトの名無しさん:04/02/15 15:27
どなたか教えてください。

会社の上司からfortranを勉強するようにと
昔のソースコードをもらいました。
その一部に

IF ( CHAR(MS) .EQ. 1HS .OR.
- CHAR(MS) .EQ. 1HM ) GO TO 1

IF ( CHAR(LCML) .NE. 1H )

のようなソースがあります。

intel visual fortran8.0 の無料体験版を使っているのですが、
上のソースの1HS
1HM
1Hという定数??のところでエラーに
なってしまいます。この1HS
1HM
1Hって何の記号なのでしょうか?
fortran90ではどのように書けばよいのでしょうか?

どなたかアドバイスをお願いいたします。(..)
330デフォルトの名無しさん:04/02/15 18:29
>>329
「ホレリス定数」でぐぐれ。
1HS, 1HM, 1H --> 'S', 'M', ' ' (または "S", "M", " ")
最後の奴はHの後ろにスペースかタブがあるのだろう。

IVFってホレリス定数が使えないの?
IVFのonline helpにはHollerith Constantsは載ってるから使えるっぽいけど.
内容はCVFのhelpと同じこと書いてた.
なんでびじゅある何たらどっとネットが必要なのさintel visual fortran
Intel C/C++ Compiler 8はVS6でOKなのに、Intel Fortan Compiler 8はVS6でだめぽだってさ。
同じようにリリースされているのに…(´・ω・`)

http://www.intel.co.jp/jp/developer/software/products/compilers/fwin/sysreq.htm
http://www.intel.co.jp/jp/developer/software/products/compilers/cwin/sysreq.htm
334デフォルトの名無しさん:04/02/24 21:11
fortranで、400000*400000位、巨大な配列を
扱うには、どうしたら良いのか教えてください
ませんでしょうか。
335名無しさん@Vim%Chalice:04/02/25 01:44
そのサイズはさすがに並列計算すべきかねぇ。
400000*400000 〜 150G
1 つ 8 バイト(倍精度浮動小数)としたら
約 1.2TB にもなるな。
337名無しさん@Vim%Chalice:04/02/25 02:05
生半可な並列じゃだめポ…
ハードディスクを使わないときつそうね。
>>334 は,4e5 x 4e5 の行列を何に使いたいの?
疎な行列の逆を求めたいとかその類じゃないの?
それにはそれのアルゴリズムがある.

見くびってたらスマソ.でも説明不足は否めない.
生半可なハードディスクじゃだめポ…
341デフォルトの名無しさん:04/02/25 13:11
説明不足ですね。申し訳ありませんでした。
4e5*4e5について逆行列を求めたいのです。
確かにアルゴリズムもあることはあるので
あとは、メモリの問題なんですね。皆さま
ありがとうございました。
数値計算を舐めすぎ!
343デフォルトの名無しさん:04/02/26 00:58
>>341
なんにもわかってないのにわかったつもりなのは痛いぞ。
ランチョス法だっけ?
地球シミュレータを使うのかな?
あれFortranできるし
Lahey Fujitsu Fortran では正常に動くのに、
Compaq Visual Fortran じゃー実行エラーになるんだろう?
アドバイスお願いします。
ちなみに、こんな実行エラーです。
forrtl: severe (157): Program Exception - access violation
Image PC Routine Line Source
sp.exe 0040958A Unknown   Unknown Unknown
sp.exe 00402226 Unknown Unknown Unknown
sp.exe 0040167C Unknown Unknown Unknown
sp.exe 0044D9E9 Unknown Unknown Unknown
sp.exe 0043ED84 Unknown Unknown Unknown
kernel32.dll 77E414C7 Unknown Unknown Unknown
>>346
Lahey Fortran でも -chk オプションを付ければ実行時エラーになる
に一票。
346さん この問題、漏れも興味あり。
Compaq Visual Fortranでの解決策はどうなんだべ?
access violation!
access violation!
access violation!
access violation!
access violation!
>>348
> Compaq Visual Fortranでの解決策

/check /traceback で再コンパイル
 ↓
プログラムを走らせてエラーメッセージから問題を起こしている箇所を特定
 ↓
ソースを修正
Lahey Fujitsu Fortran では不正常に動いているに一票
access violation!
access violation!
access violation!
access violation!
access violation!
access violet No.1〜♪
stack fault?
355デフォルトの名無しさん:04/03/07 22:42
>351 に一票
356デフォルトの名無しさん:04/03/08 23:32
FORTRANでシステムコマンドを実行できるのでしょうか?
357デフォルトの名無しさん:04/03/09 00:19
356>
処理系依存の関数が用意されているかと
CVF: SYSTEM, SYSTEMQQ, RUNQQ
358デフォルトの名無しさん:04/03/09 01:09
>>357
サンクスコ
Intel Fortran ってどうよ?
>>359
ただで90使えるから以前使ってたけど、可無く不可無くってところ
今absoft使ってるけど、比べると速度が70%くらいだった
フリーにしては十分かなー
361デフォルトの名無しさん:04/03/14 19:16
WinXP で Lahey/Fujitsu Fortran 95 Express を使っているのですが
この処理系では書式付きで画面に出力すると最初の1文字目が
行送り制御文字にされてしまいます。

これだけで使う分にはこれで良いのですが、他の環境からソースを
持ってきた時に表示がおかしくなってしまいます。

書式を使ったときに1文字目も普通の文字として表示させる方法は
ないでしょうか?
362デフォルトの名無しさん:04/03/16 08:41
初心者です。
MacでFortranやりたいんですけど、
お勧めのソフト教えてください。
出来れば値段の高くないやつ・・・
363デフォルトの名無しさん:04/03/18 00:56
>>361
Compaq Fortran 6.6 では コンパイラオプションで
/ccdefault:none を指定するか、
OPEN文で、CARRIAGECONTROL = 'NONE' と指定(当然処理系依存機能)
することによって復帰制御を無効にできる。

Fujitsu Fortranは持ってないのでスマソ
>>362
MacOS Xならとりあえずココ。

ttp://hpc.sourceforge.net/
>>362
FORTRAN77 なら GCC を使えばいいよ。タダだし。
最初から入ってる GCC には g77 は含まれてなかった気がするので、
自分でインストールする必要があると思うけど。
>>362
ttp://www.hulinks.co.jp/software/pf/
これなんかどうでしょう?
IBMのFortranは新作だし結構安いと思えるが...
>>366
> IBMのFortranは新作だし結構安いと思えるが...

20万で?確かUSでは1000$しなかった気が。
368名無し:04/03/22 16:39
CPad for Salford FTN77 でプログラムを組んでるんですけど,
write文で表示されるテキストをカラー表示することはできないんでしょうか??
だからcommonやめろて
370デフォルトの名無しさん:04/04/02 13:56
大学のゼミでFORTRANを使用する事になりました。
PCは今使ってるXP(Visual Studio .NETがインスト済)と
サーバが組んであるRed Hat Linux 9.0がインストしてあるのを
持っています。

自宅でもFORTRANを使えるようにしたいのですが
何を入れるのが一番簡単に使える環境に出来るのでしょうか?

出来ればFORTRAN77形式で書いても動く環境がほしいです。
初心者なのでどなたかアドバイスをお願いします。
>>370
> PCは今使ってるXP(Visual Studio .NETがインスト済)と
> サーバが組んであるRed Hat Linux 9.0がインストしてあるのを
> 持っています。
> 自宅でもFORTRANを使えるようにしたいのですが
> 何を入れるのが一番簡単に使える環境に出来るのでしょうか?

自宅のPCがWindowsXPであればCygwinをイントールすれば使えるよ.
一番簡単かどうかは知らない.
372370:04/04/02 15:11
>>371
Cygwinはインストしたんだけど
その後が何をすればいいかが;;;
g77とかのインスト方法が今一分からないです;
RHL ならすぐ入るんじゃないすか > g77
77イラネ
>>370

f90を使うなら素直にRedhatにintel fortranの非サポート版をいれとけ
f77も当然サポートしている
377370:04/04/02 23:59
RHLのPCの方に
intel-ifort8-8.0-40.i386.rpmをインストしました。
これでOKなのかな?
>>377
あなた次第.
379デフォルトの名無しさん:04/04/06 00:53
>>361で質問した者ですが、一応自己解決しました。

というかLaheyから新バージョン(v7.1)リリースの通知が来まして
それによるとこのバージョンから新しく追加されたスイッチ
-nconcc を使うとコンソールでの行送り制御を抑制できるようです。

試しに体験版をダウンロードして使ってみたところ、
見事に他の処理系と同じように表示することが出来ました。

要するに表示を他と合わせたかったらバージョンアップしろ
ということらしいです。

まあ、新バージョンはSSE2命令を使った最適化にも対応してるし
そろそろバージョンアップしてもらおうかなぁ・・・
      ,.-‐''^^'''‐- ...,
    ; '          ' ,
   .;'    uvnuvnuvn ;
    ;    j        i
    ; .,,  ノ ,.==-    =; 
   ( r|  j.  ーo 、  ,..of
    ': ヽT     ̄  i  ̄} 救出費用の45億円(税金)?俺は払わないっつーの( ゚,_ゝ゚)プッ
    ': . i !     .r _ j /
    '; | \  'ー-=ゝ/
     人、 \   ̄ノ
-‐  ̄    ' ーイ ̄ー-- 、
        ヽ | ;'     ヽ
381デフォルトの名無しさん:04/04/19 21:48
Intel Visual Fortran Compiler V8を購入しました。
VC++無しでも,コンパイルできるとの事でしたが,
エラーでVC++が必要だと言われてしまいます。
(ifort main.f)
main.fをコンパイルしてmain.exeを作成したいだけですが,
やはり,VC++が必要なのでしょうか?
よろしくお願いします。
Fortranなんか使うのヤメりゃいい。
> VC++無しでも,コンパイルできるとの事でしたが,

どこでそんな嘘を聞いたんですか?必要ですよ。

もしかしたら最近出た
http://msdn.microsoft.com/visualc/vctoolkit2003/
でいけるのかもなー。試してみれ、ただだから。
フォルトラーノ
ヤ〜〜ホ〜〜
フォーート
ラン!ラン!ラン!
388デフォルトの名無しさん:04/04/30 01:29
ヤッホ
Fortranranran
谷保?
fort.777
Yahoo!
>>381
コンパイルできても、リンクできないから実行ファイルできんよ
仕事をFORTRAN使うことになった。
プログラムは基礎はある程度解るが、数学がサッパリ解らん。
どっか中学生レベルの数学を解り易く解説してるサイトないかな。
395デフォルトの名無しさん:04/05/02 19:04
人様のFortran77で書かれているコードを読むハメになったんですが、
インデントがぐちゃぐちゃだったりするんです。でも、vimとかemacs
の整形コマンド使っても
do 10 i=1,100
do 10 j=1,100
    ....
10 continue
みたいな do 数字 連発 & 数字 continue で一発抜け、みたいなコードが
思うように整形されないんですよね。
皆さんはどんなエディタもしくは整形ツールを使っていらっしゃいますか?
なにか良い知恵がありましたら教えて下さい m(_ _)m。
ちなみにできればUnix系で動く環境がいいです。
>>394
数学ってあなた・・
そのコードは何の計算してるコードよ?
FortranIV3.40GHz
>>395
Real programmer don't use indent. (嘘)というのはおいといて、
その場合だと emacs の fortran mode とかで、do 10 i=1,100 と
do 10 j=1,100 の 2 行を無理矢理同じレベルにして先に進むしか
ないような気がしますね。切ないとこだな。
399デフォルトの名無しさん:04/05/07 22:28
Fortranで数値計算しようと思っているのですが、計算専用ののライブラリを用いれば速くなると聞きました。
こういったライブラリとはプログラムにどのように用いればいいのでしょうか?
ライブラリで定義された関数を用いてプログラムを書けばよいということでしょうか?

PCは素人でFortranの組み方ぐらいしか知りません。よろしくお願いします。
用いているPCはpen4でコンパイラはIFCです。
>>399
MKL買ってリンクする。使い方はMKLのマニュアルに書いてある。
>>399
そのFortranにライブラリは無いか?
CVFならCXMLとかみたいに
freeの実装じゃだめなの?
Atlasとか…
AMD Core Math Libraryはどうよ
404デフォルトの名無しさん:04/05/20 21:49
FORTRANが楽しく学べるサイトってないですか?
やはり自分でプログラムを地道にやっていくことでしょうか?
406デフォルトの名無しさん:04/05/26 21:14
IFCとPen4を用いています。
キャッシングのために巨大な配列を作りたいのですが、
巨大な配列を宣言するとsegmentation faultと言うエラーがでます。
何らかの方法で巨大な配列を作る方法はありますか?

REAL CACHE(10^8)

ぐらいの配列にしたいです。もしくは、

REAL CACHE(10^4, 10^4)

という形でもかまいません。
407デフォルトの名無しさん:04/05/28 14:47
>>406
こんなんでどうですか?一応動いたけど。

program ftest

implicit none

real(8), allocatable :: cache(:,:)

allocate(cache(10000,10000))
cache(10000,10000)=1.0d0
print *, cache(10000,10000)

end program ftest
>>407
g95でも動いた.
VS.NET 2002 & IVF 8.0
(Fortran) Static Library & (C++) Console Application
という構成なのだが…

Fortranのサブルーチンに配列を渡す設計なんだけど
/check:bounds 付きでコンパイルすると
_for_emit_diagnostic が参照できない LNK2019 を吐かれる。
どうにかなんないのかな、これ。

教えて、偉い人。
>>410
ありがとうございます。
上記のスレの方法でLNK2019 は出なくなったんだけど
形状引き継ぎ配列だと ubound(array) で 0 が返されます。
よって計算出来ない状態…助けて下さい…

// C++
extern "C" void FortranSub(int, int[]);
int _tmain(int argc, _TCHAR* argv[])
{
int n = 10;
int a[5] = { 0 };

_tprintf("%d\n", a[0]); // => 0
FortranSub(n, a);
_tprintf("%d\n", a[0]); // => 10

return 0;
}

// Fortran
subroutine FortranSub(n, a)
!DEC$ ATTRIBUTES C, ALIAS : "_FortranSub" :: FortranSub
!DEC$ ATTRIBUTES VALUE :: n
!DEC$ ATTRIBUTES REFERENCE :: a
integer, intent(in) :: n
integer, intent(inout) :: a(:)
print*, lbound(a), ubound(a), size(a) ! => 1 5 5
a = a + n
end subroutine FortranSub
412デフォルトの名無しさん:04/05/30 00:28
>>411
形状引き継ぎ配列の場合、引数は配列先頭のアドレスではなく配列記述子を使って渡されます。
(先頭アドレスだけでは配列の上/下限、範囲などの情報が伝わらないため)
詳しくは「ユーザーズ・ガイド Vol I」の「配列と Fortran 配列記述子の処理」等を参照して下さい。
>>412
ありがとうございます。
上記forum内を検索して、Descriptorについて言及しているスレを発見しました。
それに従って、CVFサンプルのDESCRIPTを眺めてはいたのですが…
va_listが出てきた時点で閉じてしまいました。
でもこの方法でやるしか無いようですね。

ざっと見たところこんな感じでしょうか。

extern "C" {
struct Descriptor {..};
void FortranSub(int, struct Descriptor*);
}

// _tmain
int n;
int a[size];
struct Descriptor* dp;
// ここで記述子割り当て処理
// その後実行
FortranSub(n, dp);

実際に作ったらまた書きます。
こんなことやってる人あまり居ないとは思うんですが、参考になれば…
414デフォルトの名無しさん:04/05/30 20:46
>>411
そんなのマニュアルに載ってる
>>414
載ってるには載ってるが淡々とだろ
416デフォルトの名無しさん:04/05/31 18:23
>>411
形状引継ぎ配列として渡さないのが一番じゃないの?
だって、f90の仕様では形状引継ぎ配列はinterfaceでプロトタイプ宣言みたいに
書いてやらないとダメじゃん。C++側でinterfaceが用意できないんだから
無理なんじゃないの?諦めて整合配列にしなよ。
417411:04/06/01 12:59
CVF6.6BとIVF8.0では多少記述子が異なりましたが
なんとかできました。

>>410 >>412 >>414-416
いろいろありがとうございました。

#include <stdarg.h>
enum { DP_ROWORDER, DP_COLUMNORDER, DP_MAXRANK = 7 };

typedef struct {
int number;
int distance;
int lbound;
} DPTRIPLET;

typedef struct {
int address;
int size;
int offset;
int bit;
int rank;
int reserved;
DPTRIPLET dim[DP_MAXRANK];
} DESCRIPTOR, *LPDESCRIPTOR;
418411:04/06/01 13:02
void AssignDescriptor(LPDESCRIPTOR dp, void *address, const int size, const int order, const int rank, ...)
{
dp->address = (int)address;
dp->size = size;
dp->offset = 0;
dp->bit = 1;
dp->rank = rank;
dp->reserved = 0;

int inc = 1, index = 0;
if (order) { inc = -1; index = rank - 1; }

va_list vl;
int distance = size;
va_start(vl, rank);
for (int i = 0; i < rank; i++)
{
int number = va_arg(vl, int);
dp->dim[index].number = number;
dp->dim[index].distance = distance;
dp->dim[index].lbound = 1;
distance *= number;
index += inc;
}
va_end(vl);
}

extern "C" void FortranSub(LPDESCRIPTOR);

で、いけました。改行大杉言われたのでちょっと詰めました。
419デフォルトの名無しさん:04/06/01 23:19
自然数の各桁の数字の和を求めるにはどのようにしたらいいのでしょうか。
教えてください。
420デフォルトの名無しさん:04/06/02 00:10
>>419
#include <stdio.h>
int main()
{
int i, n, total=0;
char tmp[11];
printf("input num:\n");
scanf("%d", &n);
sprintf(tmp, "%010d", n);
for (i=0;i<10;i++) total = total + tmp[i] - '0';
printf("%d --> %d\n", n, total);
return 0;
}
421419:04/06/02 00:26
fortran90でお願いします。
program hoge
 implicit none
 interface
  function foo(n)
   integer, ml_external :: foo
   integer, intent(in) :: n
  end function foo
 end interface
 integer :: n, m
 print *, "input n"
 read *, n
 print *, foo(n)
end program hoge


#include <stdio.h>
int foo(int* n)
{
 int i, total=0;
 char tmp[11];
 sprintf(tmp, "%010d", *n);
 for (i=0;i<10;i++) total += tmp[i] - '0';
 return total;
}
423デフォルトの名無しさん:04/06/02 02:41
>>419
文字列変数に数字を書き込んで、後はそれぞれの桁の文字のアスキーコードを
数字に変換して足し合わせてます。

program nnumber
implicit none
integer :: n, i, isum
character(20) :: cn

write(6,*) 'input natural number'
read(5,*) n

write(cn,*) n

isum=0
do i=1, len(cn)
if( cn(i:i).ne.'' ) then
isum=isum+(ichar(cn(i:i))-48)
endif
enddo

write(6,*) 'result=', isum

end program
424419:04/06/02 16:22
>>423
character(20) :: cn
write(cn,*) n
if( cn(i:i).ne.'' ) then
isum=isum+(ichar(cn(i:i))-48)

のそれぞれのやってることの意味がよくわかりません。
初心者ですみません。おしえてください。
425デフォルトの名無しさん:04/06/02 16:38
>>424
character(20) :: cn
20文字分の文字列変数 cn を定義。

write(cn,*) n
整数を文字列に変換します。これ知ってると便利です。
普通、 cn の場所にはファイルのUNIT番号が入るんですが、
文字列変数を指定することもできます。こうすれば、なんでも(多分)文字列に
変換できます。ファイル名に連番を付けて作成することもこれを使うと楽です。

if( cn(i:i).ne.'' ) then
文字列変数の i 番目の文字が空白だったら読み飛ばしの意味です。
あんまり意味ないかもしれません。ここは適当に書いてます。

isum=isum+(ichar(cn(i:i))-48)
ichar()組み込み関数で文字列 cn の中の i 番目の文字のアスキーコードを
取得します。アスキーコードでは、"0"が48, "1"が49, "2"が50
のように順番に数字キャラクタとコードが対応してるので、アスキーコード値から
48を引くことで文字列型から整数値への変換をしてます。
文字から整数へ変換する組み込み関数が見つからなかったので、自前でやってます。
program test
implicit none
integer(kind=4) :: num
integer(kind=4) :: i
integer(kind=4) :: keta=0
integer(kind=4) :: isum=0
read(5,*) num
if(num<=0) stop
do
if(num/(10**keta)>0) then
keta=keta+1
else
exit
endif
enddo
do i=keta-1,0,-1
isum=isum+num/(10**i)
num=mod(num,10**i)
enddo
print *,isum
end program test
427419:04/06/02 17:00
>>425
大変大変勉強になりました。ありがとうございました。
>>425
> 文字から整数へ変換する組み込み関数が見つからなかったので
こんなときこそ内部ファイルを使って
program hoge
 implicit none
 integer(kind=SELECTED_INT_KIND(9)) :: n
 integer, dimension(10) :: a
 integer :: m
 character(len=10) :: str
 read *, n
 write(str, "(I10.10)") n
 read(str, "(10I1)") a
 m = sum(a)
 print *, m
end program hoge
program test
implicit none
character(len=100) :: cnum
integer :: i
integer :: iwa=0
read(5,'(a)') cnum
write(cnum,'(a)') adjustl(cnum)
do i=1,len_trim(cnum)
iwa=iwa+ichar(cnum(i:i))-ichar('0')
enddo
print *,iwa
end program test
このスレは勉強になるな〜!
431デフォルトの名無しさん:04/06/02 17:55
コンパイルはできたのですが、実行がされません
以下のようなメッセージが出てきました。

list in: end of file
apparent state: unit 10 named inpdt
last format: list io
lately reading direct formatetd externalIO
Aborted (core dumped)

どうすればいいのか.......
>>431
読み込むファイルの中身がおかしいか、読み込むデータと
プログラム側のread文が正しく対応してないかのどちらかだと思われ。
デバッガでトレースすれば?
>>419
10 で割っていくのが最短のような気がしますが...

9876 ==>
mod(9876,10) + mod(987,10) + mod(98,10) + 9
勘違いでしたらごめんなさい.
でも、全部文字列で扱って、最後の足し算のところで整数の結果にすれば
何百桁の自然数でもオケーなので、割り算するより強力だね。
実用上は意味無いだろうけど。
フォートラン始めたばっかの初心者ですが、
*10**40
など、ある実数に大きな数字をかけるとへんてこな答えが出るか NAN となってしまいます。
*10**10とかくらいからおかしくなってきます。
これはどうすれば良いんでしょうか?

コンパイラはGnu Fortran 77です。
>>436
単精度・倍精度・浮動小数点などについて調べてみてください。
比較する演算子は, <,>,= よりも .gt. 等の方が
エディタの色付けの恩恵があって見やすいと思ってしまう orz
>>436
質問の仕方がなんだかアレですね。

・目的は何なのか?
・何を解決したいのか?
・解決しようとする過程で、自分が詰っている箇所の詳細な説明。

を丁寧に説明すれば助けてもらえると思います。
>437,439
すいません。ちゃんと書きます。(^ ^;;

以下の式でf(500)を求めようとするとエラーが出てしまいます。
それで、部分部分に細かく分けて試したところ、*10**40等を含む部分の結果がおかしいのです。
そのためexp(...)=1となってしまい、/0 になってしまうようです。
(関数電卓で計算すると約3.27E+62になるはずです)
そこを*10**9くらいにすると、それに応じた正常な結果がでるので、どうしたもんかと。。。
ちなみに、コンパイラはGnu Fortran77です。

double precision f,h,c,k
integer t,x1
f(x) = 8*pi*h*c*(10**45) /x /(exp(h*c/(k*t*x*10**(-9)))-1)
pi = 3.1415
h = 6.6261*(10**(-34))
c = 2.9979*(10**8)
k = 1.3807*(10**(-23))
t = 200
x1 = 500
write(*,*) f(x1)
整数は整数であると見抜ける人でないと(FORTRANを使うのは)難しい。
10 という整数定数を 45 乗することになっちゃうので、
その段階で整数の桁あふれが起こってるんでしょう。
倍精度浮動小数点型の定数の表現を調べること。

h=6.6261d-34

あと g77 使ってる環境なら ftncheck もあると思うので、
使えるようになっときましょう。

さらについでにいうと、t とか x1 とかは integer では
なく double precision にすべきだと思う。これはモデル
の段階での話だけど。
>>440
単位系も大きすぎる気がする。原子単位系とか使ったら良くないか?
444デフォルトの名無しさん:04/06/04 19:57
IFCを使っているのですが、実数の値が

?????????????????

となる時があるのですが、これは実数がNaNになっているのですか?
それともINFになっているのですか?
isnan文で判定できなくて困っています。
さらに、

++++++++++++++

なる時もあるのですが、これは何ですか?
445444:04/06/04 22:37
自己レス
IFCでは、

+++++++++++++++++ 正の無限大
----------------- 負の無限大
???????????????????? 非数

らしいです。
質問変更
変数が無限大かちゃんとした値かを
判定できる関数ってないのですか?
>>445
今ifcが手元にないので分からないけど、ひょっとして
xが無限大だと「x+1.eq.x」が真になったりとかしない?
447444:04/06/04 23:08
>>446
なります。
448デフォルトの名無しさん:04/06/05 00:17
fortran77ソース読み込んでフローチャート描いてくれるツールないかね?
さすがにフローチャートまではしらないなあ。
call tree くらいだったら前出の ftnchek で
出してくれるけど…
>>445
環境依存になるが、IVF(CVF)なら
fordef.for で定義されてるシンボルと
FP_CLASS関数を使えば判別出来る。

>>448
こんなのがあった。
解析・構図(FORTRAN 用)
http://www.vector.co.jp/soft/win95/prog/se308859.html
使ったことないが。
フローチャートって、役に立ったことが無い。
プログラミングの知識が構造化以前で止まっている上司に
プログラムの内容を説明するときに役立ちます。



イベントドリブンなプログラムを
「フローチャート書いて説明しろ」
なんて言われてもねぇ・・・(泣
do i=1,10
do j=1,10
write(1,*)x(i,j)
end do
end do

テキストファイルに i 行 j 列の表として出力する方法はありませんか?
>>453
出来たファイルをawkで整形しる
$ awk '{if(NR%10==0)print;else printf"%s ",$1}' 1.txt
>>453
do j=1,10
write(*,*)(x(i,j),i=1,10)
end do
なんかまた宿題スレみたいになってきたな…
457デフォルトの名無しさん:04/06/05 14:42
>450
解析・構図(FORTRAN 用)
はちゃんとしたフローチャートじゃないんだよね・・
テキスト出力だし。やっぱしないのかねぇ。。
458453:04/06/05 16:43
>>454
良いもの教えてくれてありがとう御座います。
awk使ってみます。

>>455
それだと倍精度実数からなる要素の場合みたいに
データが長いと、途中で勝手に改行されちゃいませんか?
459デフォルトの名無しさん:04/06/05 18:01
またまた内部ファイルを使ってもいいんなら、こんなんでどうですか?

program main
implicit none
integer i,j;
character(len=1024) :: ch
integer, parameter :: n=10
real(8) :: x(n,n)

do i=1, n
write(ch,*) (x(i,j),j=1,n)
write(*,*) trim(ch)
enddo

end program main

>>458
勝手に改行は書式が*の問題だろ
書式を指定尻
nmax=10
do j=1,nmax
write(1,'(<nmax>f10.6)')(x(i,j),i=1,nmax)
end do
461デフォルトの名無しさん:04/06/07 22:49
ブレネリ
あなたのお家はどこ
私のお家はスゐッツランドよ
綺麗なおすぎのピーコなのよ

ヤーッ


ホーッ

Fortranranran
ヤホ
Fortranranran
さむい
なつい
FORTRANが滅亡してしまえば勉強しなくてすむのに
ベクトル化や並列処理を考えたら、まだまだ存在価値はあるんじゃ?
言語仕様が簡単だから、最適化もやたらと効きそうだし
言語仕様が簡単ですか...混沌としてて鬱ですよ.
ガイドラインキボンヌですよ.

しかも,リストとかツリーってどうやって作るの? fortran77 で.
>>466
そうっすか?C++と比べると、かなりストレートな言語だと思うけど
>>467
それは比べる対象が悪いかと
Fortranも正直使いたくないんだが、使う分には許容出来なくもない。
問題なのは未だにFORmula TRANslaterとして、モジュール化もへったくれも無
いコードをこのクソ言語で書かれるとどーしよーもない事なんだよな。

ま、Cでポインタ覚えたてのアホが書くコードも、C++でtemplate覚えたての
カスが書くコードも一緒か。
>>469 がいいことを言った.

ftnchkek みたいな使い方で,望ましくないコーディングも教えてくれる
やつがあればいいのにね w
MATLABって、どのあたりがFortranと関わりがあるんでせうか?

最近授業で習い始めて、「Fortranから派生した」みたいなことを聞いたんですが、、
473デフォルトの名無しさん:04/06/17 13:01
最近フォートラン始めたんですがこれってマック剥けコンパイラありますか?
474473:04/06/17 13:25
ってか前に出てますね。ごめんなさい。
475466:04/06/17 19:28
自己レス.

リストとかツリーを使おうと考えるからいけないんですね.
Fortran には Fortran の考え方がある,と.


また,紙に書いて煮詰まったものしかコードに表せないのも,
Fortran の仕様ですね.
ツリーだろうとハッシュテーブルだろうと、ある程度機能をわりきれば、
Fortran77の制限内でも案外楽に実装できるぞ。

メモリ空間なんて所詮一次元の配列だし(暴論)、
その配列の添字がポインタの代わり、
ポインタのポインタが使いたかったら、その添字を値とする整数配列を作る。

>>466 がんばれ
477466:04/06/19 12:31
>>476
うほっ.別の意味で教育に良い言語ですね.
ちょっと試してみます.
とある subroutine の中で,

IMPLICIT REAL*8(A-H,O-Z)
common /hoge/ arr(10)
data arr(1) /'Yo'/

と宣言された変数がありました.これを g77 でコンパイルすると

         data arr(1)/'Yo'/
                     ^
Type disagreement between expressions at (?) and (^)

と言われます.しかし,文字列を Hollerith 定数にするとコンパイルが通ります.
なぜなのでしょうか?できれば Hollerith 定数は避けたいのです.
arr はなぜか実数として宣言されています.
common の前で character と宣言してもコンパイルが通りませんでした.
479デフォルトの名無しさん:04/06/23 18:57
どなたかフォートランでパスカルの三角形の逆三角形を作れる方いらっしゃいませんか?
どうかよろしくおねがいします。
480デフォルトの名無しさん:04/06/23 21:31
>>479
パスカルの三角形(>>4)を求めて、メモリに保存して、逆から出力していけばええんで内科医
>>479
./a.out | tac
483479:04/06/24 12:39
>>480-482
ありがとうございました! なんとかがんばってみます。
484479:04/06/24 12:42
と、思ったのですが。 どうやったらピラミット型に…?
>>484
宿題の文面を晒さないと何がしたいのかさっぱり分からないよ.
1 2 1
1 1
1
やっほー♪ふぉーとらんらんらん♪
てのはガイシュツ?
>>484
逆じゃない三角形は作れるの?
まず普通にできてから,逆を考えた方がいいかもよ.
出力は write (fmt='()') で整形しないといけないよ.
>>484
program joke
write(6,'("1 2 1")')
write(6,'(" 1 1")')
write(6,'(" 1")')
stop
end
490484:04/06/26 15:10
1 みなさんすいません… Fortran77で、こういった三角形をつくれというものでした。
1 1   また、これをピラミッド型にしろともいわれました。
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
つまり四角錐にしろと言うのか。難問だ
492484:04/06/26 15:17
もとのプログラムはこれです

integer k(8,8)
n=8
k(1,1)=1
do 1 i=2,n-1
k(i,1)=1
k(i,i)=1
do 2 j=2,1
k(i+1,j)=k(i,j-1)+k(i,j)
  2 continue
  1 continue
 do 3 i=1,n-1
 write(*,5)
  3 continue
  5 format (' ',714)
 stop
 end

です。
493484:04/06/26 15:21
>491

言葉が足りずすいませんでした! こういった形です。

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
494デフォルトの名無しさん:04/06/26 15:22
::::::1
:::::1 1
::::1 2 1
:::1 3 3 1
::1 4 6 4 1
:1 5 10 10 5 1
1 6 15 20 15 6
714?
>>492
配列のインデックスが逆になっている (C 言語みたいな) ところが多いですね.
修正しないと直角三角形にもなりませんよ.


ところで >>484 ではありませんが,
きれいに三角形を出してみようとしました.
ところが,fortran の経験がほとんど無く,文字列を操作して
write() に与える fmt 文字列を作ることさえできません.
adjustl() とか trim() は fortran77 にありますか?これが無いと話になりません.
Professional Programmer's Guide to Fortran77 には書いてないのですが...?
497デフォルトの名無しさん:04/06/26 23:37
FORTRANでは配列の外にアクセスするのってOKなんですか?
   dimension XX(120)
   XX(0)=0.
   XX(300)=1.5
みたいな代入があって、これが通るのが信じられません。単にコーディングミス
かとも思ったのですが、作者も用途も全然別なのに古いプログラムでは結構見ます。
そしてなぜかまともに動いています。(理解に苦しみますが)

-fbounds-check等をつけてコンパイルすると当然動きません。
C等ならまず駄目だと思いますがFORTRANは仕様としてOKなのでしょうか?
498496:04/06/27 00:13
とりあえず大きくても 5 桁だと決めないと大変ですね...
write() が勝手に改行しないようにするために,fmt='(I5$)' のようにドルを
付けましたが,これが fortran77 か何を見れば分かるのか教えてください.
気軽に仕様を調べられないと,すごくストレスを感じますよね.

>>492
_____|_____|_____|_____|____1
_____|_____|_____|____1|_____|____1
_____|_____|____1|_____|____2|_____|____1
_____|____1|_____|____3|_____|____3|_____|____1
____1|_____|____4|_____|____6|_____|____4|_____|____1
アンダーバーは空白,縦棒は本当は出力しません,
ということで,等幅フォントで見てください.
どういう順番で出力すればできるか気付いてもらえるかと思います.
>>498
英文で良ければ
ttp://www.swcp.com/~walt/F77_std/f77_std.html
ttp://www.fortran.com/fortran/F77_std/rjcnf0001.html

日本語では良い資料が見つからなかったのですが

富士通Fortran文法書
(標準規格からの拡張部分に色分け有り。ただしFortran95)
ttp://www.cc.nao.ac.jp/fsunman/japanese/Fortran/index.html

JISデータベース(こちらもFortran95相当の規格しか閲覧できない)
ttp://www.jisc.go.jp/
500デフォルトの名無しさん:04/06/27 02:24
>>496
ADJUSTL, TRIM, 書式末の'$'はFORTRAN77の仕様ではないよ。
大抵の処理系はサポートしてると思うけど。
>>484
FORTRAN90で書いても結構面倒だったよ.
>>497
普通にプログラムでは、配列の外にアクセスするのってOKではないでしょう。
FORTRANでは配列は先頭アドレスからいくらでアクセスするから、エラーチェックをかけなければ走らないということは
ないでふ。real*8だとして
XX(300)にアクセス=XXの先頭アドレス+8bit*300にアクセス
>>492の様に結果が配列に格納されているとして
IW=6
DO 10 I=1,N,1
WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-I)*IW/2+1, I, IW
WRITE(*, FMT) (K1(I,J), J=1,I,1)
10 CONTINUE
504496:04/06/27 11:42
>>499
(・∀・)イイ!! ケド、改行の抑止の valid な方法はどこだろう?
例が少ないのは仕方がないのでしょうが,用語を覚えるまで実際に書けないです.

「手元の処理系で動くから」って,悪名高い BASIC のマネか知らん.

>>500
ですよね...
文字列処理がこんなに貧弱なのに,fortran で処理系を書かれる方も
いらっしゃるそうですね.

出力の整形ルールだって,今からでも C の printf 作ろうよ,って思います.

>>503
すごい...write が低機能なんじゃなくて,私が低いんですね.
しかも配列のインデックスの順番がわざとだったとは orz
>>502
thanks. 結構業界では有名なプログラムだったのでひょっとしたら、と思いまして。
>>492 はちゃんと動かんぞ。

>>503
折れのコンパイラ (Compac cfal for Alpha Linux) では駄目だった。何故だろう?
f90: Error: ***.f90, line **: This format specifier must be of type INTEGER. [FMT]
WRITE(*, FMT) K(I, 1:I)
---------------^

ということで自分で書いてみた。
INTEGER, PARAMETER :: N=12, IW=6, M=N*IW
INTEGER :: I, K(0:N) = 0
CHARACTER*M :: S = REPEAT(' ',M)
K(1) = 1
DO I = 1, N
K(1:I) = K(1:I) + K(0:I-1)
LL = (N-I)*IW/2+1
WRITE(*,'(A,20I6)') S(0:LL),K(1:I)
END DO
507506:04/06/29 02:03
ちょこちょことイタいミスしてるな(はづかし
改訂版
INTEGER, PARAMETER :: IW=6, MAX=30, MS=(MAX-1)*IW/2+1
INTEGER :: I, N
INTEGER :: K(0:MAX) = 0
CHARACTER*MS :: S = REPEAT(' ',MS)
write(*,*) "Pascal's triangle. Enter N:"
read(*,*) N
K(1) = 1
DO I = 1, N
K(1:I) = K(1:I) + K(0:I-1)
WRITE(*,'(A,50I6)') S(1: (N-I)*IW/2+1), K(1:I)
END DO
>>496
テキトーに書いてみた。

parameter (nmax=20)
integer*4 iv(nmax),ivp(nmax)
character cfmt*17
open(61,file='output.txt',RECL=256)
len = 6
isp = len*nmax/2
do 10 k = 1, nmax
cfmt='(0000x,0000i0000)'
ni = k
do 20 i = 1, ni
iv(1)=1
iv(ni)=1
if ((i.ge.2).and.(i.le.ni-1)) then
iv(i) = ivp(i-1) + ivp(i)
end if
20 continue
do 30 i = 1, ni
ivp(i) = iv(i)
30 continue
isp = (len*nmax/2) - (k-1)*len/2
write(cfmt(2:5),'(i4)') isp
write(cfmt(8:11),'(i4)') ni
write(cfmt(13:16),'(i4)') len
write(61,cfmt) (iv(i),i=1,ni)
10 continue
close(61)
stop
end
509506:04/07/01 03:26
>折れのコンパイラ (Compac cfal for Alpha Linux) では駄目だった。何故だろう?
>f90: Error: ***.f90, line **: This format specifier must be of type INTEGER. [FMT]
>WRITE(*, FMT) K(I, 1:I)
>---------------^

すいません。FMT を character で宣言していなかったせいでした。
character*11 FMT
を入れたら動きました。(はづかし
てことは、これでいいんだな。
INTEGER, PARAMETER :: IW=6, MAX=30
INTEGER :: I, N
INTEGER :: K(0:MAX) = 0
CHARACTER*11 :: FMT
write(*,*) "Pascal's triangle. Enter N:"
read(*,*) N
K(1) = 1
DO I = 1, N
K(1:I) = K(1:I) + K(0:I-1)
WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-I)*IW/2+1, I, IW
WRITE(*, FMT) K(1:I)
END DO
END
g77 だったらこんな感じかな。
parameter (max=30, iw=6)
integer c(0:max), d(0:max)
character*11 FMT
data c /(max+1)*0/
write(*,*) "Pascal's triangle. Enter N:"
read(*,*) N
c(1) = 1
do i = 1, N
do j = 0, i
d(j) = c(j)
end do
do j = 1, i
c(j) = d(j) + d(j-1)
end do
WRITE(FMT, '(2H(T,I2,1H,,I2,1HI,I2,1H))') (N-i)*iw/2+1,i,iw
write(*,FMT) (c(j), j=1,i)
end do
stop
end
スレ違いだが Python だったらこんな感じだな。
import Numeric
iw = 6
N = input("Pascal's triangle. Enter N: ")
c = Numeric.zeros(N); c[1] = 1
for i in range(2,N+1):
c[1:i] = c[1:i] + c[0:i-1]
bln = ' '*((N-i)*iw/2+1)
fmt = ('%' + str(iw) + 'd')*(i-1)
print bln + fmt % tuple(c[1:i])
>>502
私は >>497 ではありませんが,ちょっと 1995 年頃に書かれたプログラムを
コンパイルする過程で,大量の warning に出逢いました.
out of definition range です.
わざわざ dimension を使っておきながら,越えた範囲に堂々とアクセスしているんです.
しかも,そのプログラムは bug fix 済みな感じで使われています.

目的が知りたいです.
浅学の私では,dimension の数字を増やせば済むのでは,と考えてしまいます.
商用Fortran90だとIntelとPGIの名前がよく出るけど、absoftってどうなんでしょ?
amd64 + Linux な環境でIMSL使いたいので検討中なのです。
ttp://www.hulinks.co.jp/software/pf/

速度や安定性について、>>360 さんみたいな体験談や情報の在処お持ちの方いらっしゃいますか?
515479です:04/07/04 11:52
みなさんこんなにたくさんの御返事ありがとうございます!
516デフォルトの名無しさん:04/07/08 21:56
結局 >>497 が言うようなプログラムが
堂々と出回っている理由を知る者はいないのですか... orz
517デフォルトの名無しさん:04/07/08 23:04
>>516
サブルーチンで引数として長さが不定の配列をもらうとき、今だと
   subroutine sub(a, ...)
   dimension a(*)
      …
みたいに宣言するよね。
でも、これが正式な規格となる前(FORTRAN77以前?)は、
   dimension a(1)
や、>>497みたいに、適当な配列サイズの宣言をしてコンパイラを騙す
「テクニック」があったそうな。

もちろん、今となっては過去の遺物。
>>497
EQUIVALENCE で他の配列に重ねていないか?
>>517
過去の遺物とは言え、fortran90コンパイラでコンパイルしてもエラーにはならなくない?
自分の場合、全てのsubroutine, functionに対してinterfaceを宣言したヘッダファイルを
includeしてバグを回避してたりする
520516:04/07/09 01:48
>>517
そうだったんですか!ありがとうございます.
使うときは,ちゃんとそれなりの大きさで定義済みだから
正しく動いていたんですね.
今度 dimension a(*) だと意識しながら読んでみようと思います.

! あれを書いている人のコンパイラは warning を出さないのだろうか...
521名無しさん@そうだ選挙に行こう:04/07/11 10:14
Linux用intelFORTRANコンパイラの導入方法と使用方法教えてください
>>521
ディストリビュージョンは?
>>521
自分で調べろ
524デフォルトの名無しさん:04/07/12 11:50
fortran90でライフゲームができるプログラムを教えてください。
卒研くらい自分でやれ。
>>524

program hoge
use DFPORT
integer :: r
r = system('lifegame.exe')
end program
>>524
まずは簡単そうなライフゲームをのソースコードを探して,
Fortran90 に書き直してみるとか?
0,1なら八桁で遺伝的アルゴリズムが上手く機能すると聞いたことがある
529デフォルトの名無しさん:04/07/13 19:12
>>522
fedoracore1です。
おながいします。
>>529
man gzip
man tar
man rpm
>>529
ttp://jp.xlsoft.com/documents/intel/flin/relnotes_j.pdf
これで分からないようなら入れてもどうせ使いこなせないので諦めた方がいい。
532522:04/07/13 19:49
>>529
ゴメンネー.Debian に入れる方法しか知らないの.
でも,配布の .rpm はもともと Fedora に向けたパッケージ (?) だから,
きっと簡単に入ると思うよ.ちょうどいいスレもあるし.
ttp://pc5.2ch.net/test/read.cgi/linux/1007024009/

インストールできればすごく速い生活が送れるよ.ガンガレ.
533ど素人:04/07/15 19:44
助けてください、課題レポートなんですけど
どうやってもわからないんです
--------
150までの任意の整数値Nをあたえ、以下を求めるプログラムを作成する
・N番目に小さい素数
・N番目までの素数の和
・N番目までの素数の逆数の和
--------------

というもので”エラトステンスのふるい”を使うことや、
大体、素数の個数を170ぐらい出せばいいと言う事は思いつくんですけど
プログラムに書き表すことができません。
手の空いている方がいらっしゃいましたら、
何卒手助けをお願いいたします……(´Д`;)
"エラトステンス"ってのは始めて見た。typoなのか「表記のゆれ」なのか判らんけど。
「エラストテネス」か「エラトステネス」で検索してみそ。きっとヒントが見つかるから。
>>533
小さい方からN個の素数が分かれば後は簡単.
150までなら、素数のデータベースを作ればいいだら
ttp://www.vector.co.jp/soft/win95/edu/se319061.html
この辺で素数を探して、
a(1)=2
a(2)=3
a(3)=5
・・・・・
>>533
Fortran90で書いたら,60行位で終わった.
夏休みの課題だとすれば短過ぎるか.
コメントと空行は除き、継続行はまとめて1行とカウントするルールで
何行で書けますか?
540538:04/07/15 23:15
>>539
空行を抜いたら57行だった.ただし,150と言わず何個でも
対応出来るようにde/allocateしている.150に制限して,
飾りのprintを外すともう少し短くなるか.
FORTRAN77でも
充分な大きさの配列を用意して
ふるいにかけて素数だけ集めて
Nを入力して
和を計算して
 ・・・
と、だらだらやっても50行程度で終わるな。
サブルーチンに分けたりするともうちょっとかかるかもしれないが。
542ど素人:04/07/17 04:48
>>533のど素人でございます

>>534
ご指摘の通りエラトステネスです
期限が迫りテンパっておりました申し訳ないです


>>手助けをしてくださった方々
本当にありがとうございます
ぢつは上の課題というのは再履修に与えられた課題でありまして
……これが出来なければ4年目の情報処理となってしまうわけでして
無理を承知でお願いいたします。プログラム文を教えていただけないでしょうか
助けてください
「必死だな」と罵られても構いません、むしろ罵ってくださいませ
もう必死です(;´Д`)
必死だな.
まあ,わからないんだったら,もう一年やってもいいんじゃない.
>>542
本当に必死なら、どんな物でもいいから自分でつくったプログラムを
晒して下さい。

多少なりとも自分で考えた上でプログラムの間違いを指摘して欲しい、
と言うのであれば協力もしてやろう。

だが、授業内容を理解していないのに課題を人に丸投げするような奴は
単位取れなくて当然だ。
>>512
これは3年前の質問ですか?
http://fc2bbs.com/bbs?action=reply&uid=5595&tid=1947619

エラトステネスのふるい法は>>4でもソースはあるし、ぐぐればあちこちにあるんだけど。
546545:04/07/17 07:26
間違えた昨年度だ
547538:04/07/17 15:21
>>541
subroutine 2つとfunction 1つを使っていた.
それらをprogramに押し込んだら34行になった.
>>547
ソースをうp plz
549538:04/07/17 18:28
program test
implicit none
integer :: n
integer,dimension(:),allocatable :: iprime
!自然数を入力
read(*,*) n
allocate(iprime(n))
!分割してサブルーチンを作ると読み易い
call get_nprime(iprime)
!できた素数配列を処理
!やることはN番目の素数,N個の素数の和,N個の素数の逆数の和の表示
call work(iprime)
deallocate(iprime)
!れぽーと提出おめでとう!
end program test

多分講義はFORTRAN77でやっていると思うから,講義と全く触れて
いないプログラミングをしている時点でレポートとして認められない
と思う.
9行ででけたー (Fortran95 固定形式)
integer::Il(1:11)=(/0,(lI,lI=2,11,1)/)
do1l1=3,2,-1
1 forall(ll=l1*2:11:l1)I
ll(ll)=0
do11lI=2,11,1
Il(l1)=Il(lI)
11 If(Il(lI)/=0)l1=l1+1
read*,l1
print*,l1,Il(l1),sum(Il(1:l1:1),1),sum(1./Il(1:l1:1),1)
end
10行に見えるのは継続行があるためです。
どこかは自分で探しましょう。

また、このままではN=5までしか計算できません。
どこを直せばよいかは自分で探しましょう。
さあ,お次は 7 行プログラミングかな?
さすがに7行はつらいな。

っていうか、配列の宣言と入出力、END文書いたら残り3行しかない。
マルチステートメント使ってもいいなら書けるけど。
; は無し?
554デフォルトの名無しさん:04/07/24 14:31
WindowsXP proでVisual Fortran6.1Aを使ってどのプログラムを実行しても

Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
The thread 0x940 has exited with code 0 (0x0).

という警告がでます。dllが壊れてるんでしょうか?直し方が分かる方教えてください。
554
自己レス。
実行ボタン以外の場所を押してました。情けない・・・・・
CASE1
-------------------------
open(1,file='hogehoge')
do i = 1, 60*60
  :
  :
 何か計算しつつ、ファイルへ書き出し
  :
  :
end do
close(1)
----------------------
とするのと、

CASE2
----------------------
do i = 1, 60*60
  :
  :
 何か計算。
  :
  :
end do
open(1,file='hogehoge')
do i = 1, 60*60
 ファイルへ書き出し
end do
close(1)
-----------------------------
とするのでは、明らかに速度が違います。
CASE2のほうが速くなるんですが、この理由って何でしょうか?
ただの気のせいでしょうか?
今回の件と関係あるかどうかは知らないけど、
CPUの計算速度 >>> ファイル等入出力の速度
なので一般的に入出力はなるべくまとめた方が速くなります。
558デフォルトの名無しさん:04/07/31 23:25
至急、質問があります。
FFT(高速フーリエ変換)のプログラムを作ってます。
今まで処理データ数が16000個くらいで、順調に計算できていました。
しかし、データ数を70000個くらいに増やすと、出力ファイルに
『*』印がたくさん出てきます。
ちなみに言語はフォートランで出力はCSV形式で出力してます。
これはフォーマットの設定が悪いんでしょうか?
559デフォルトの名無しさん:04/08/01 00:00
560デフォルトの名無しさん:04/08/01 07:07
ブレネリ
あなたのお家はどこ
















しらねーよ
ボケッ



良いこのみんなはこういう無慈悲なことを言っちゃいけないぞ
561デフォルトの名無しさん:04/08/01 10:39
やーふぉー

FORTHらんらんらん
562デフォルトの名無しさん:04/08/06 19:06
Salford Software のFortran95コンパイラ FTN95 Personal Edition が
非商用・個人利用に限り無料で利用できるようになりました。
ttp://www.silverfrost.com/32/ftn95/ftn95_personal_edition.asp

 ・Win32ネイティブ及び.NET managed code が出力可能
 ・IDE、デバッガ、C++コンパイラなどが付属
 ・Visual Studio .NET 2002/2003 のIDEでも利用可能
 ・動作環境は98/NT4SP6/2000/XP (98の場合は.NETデバッグ不可)

これでコンパイルした実行ファイルを実行すると、強制的にバナーが表示されますが
それ以外に機能的な制限はないようです。

ただし
> If you with to use FTN95PE on an educational establishment's
> equipment then you must buy an academic licence.
とのことなので、学校の先生は注意が必要です。
>>562
ifc が強力すぎて,なんかパッとしないね.
564デフォルトの名無しさん:04/08/08 18:25
Windows上で使えるフリーのFortran90/95はほとんど無かったから
これはこれで良さそうな気がする。
ifc (IVF)は製品版と期間制限付きの体験版しかないし。

しかし、Fortranで .NETするメリットってあるのかね?
>>564
windows となると,minGW + g77 でも fortran77 までか...
もうちょいですね.
minGW で gcc だと IDE (統合開発環境) が使えますが,g77 でも使えるんですか?
触れておきながら使ったことないんですが w

> しかし、Fortranで .NETするメリットってあるのかね?

数値計算プログラムのインターフェース???
.NET である必要はないけど.
"すれ立てるまでもない質問はここで" の方でも
質問したんですが,どうやらアソコではレスもらえなさそうなので,
こちらにも書きます.
マルチっぽくなってしまい,申し訳ありません.

質問は fortran77 (g77) についてなのですが,
C でいうと

struct pos{
double x;
double y;
double z;
};
struct pos pos[64];

みたいなかんじの構造体の配列は使えますか.
もし使えるのなら宣言の方法まで教えていただけるとうれしいです.
よろしくおねがいします.
レスありがとうございました
g90 の登場が待ち遠しいですね.
>>568
g95のバイナリを試してみるとか
http://www.g95.org/
なぜ>>562を使わない?
571566:04/09/05 20:59
ゴメンなさい
ボク linux なので...
>>562 は wine でも動くのかな?
とりあえず >>569 を試してみます.

>>569, >>570 ありがとうございました.
>>571
intel のすごくいいやつがあるよ.無料の.
573566:04/09/06 00:08
そういえば以前のレスで
コンパイラごとにコマンドの実行速度を
比較したページがありましたね.
gnu よりも intel の方が3倍くらい早かった記憶がします.
そこで intel をダウンロードしようと思ったんですけど,
non-commercial 版なのに会社を書けといわれてしまいました
う〜ん学生なんですけど学校の名前書いちゃっていいんですかね?
>>573
もう登録したかも知れないけど「personal」とか「personal use」でいいんじゃない?
まあ、別に学校名で登録しても問題ないと思うけど。
MATLABのFFTSHIFTに相当する機能をFORTRANで簡単に
やるには、どうしたらいいんですか?
576ダメ名無し:04/09/08 19:07
かなり初歩的な質問で恐縮なのですが、
値をTAB区切りで出力するにはどうしたらよいのでしょうか?
テキストファイルをエクセルファイルに変換したいのですが・・・
VFなら、C文字列使えるから、\tでいけるが、ほかはしらね。
おとなしく、カンマ区切りテキストにすれば。
タブはCHAR(9)でだめ?
別にスペースでもエクセルでセル分割できるよ。
ファイルから開くで、種類をテキストファイルとしてみ。
580ダメ名無し:04/09/08 20:45
わ!ほんとだ!解決しました!
ありがとうございます〜!!!
もっとはやくここにくるんだった _| ̄|○
ほんとありがとうございます!
581デフォルトの名無しさん:04/09/08 20:58
しょうもない質問ですがどなたか教えてください。
メモリー512MBで1024×1024の配列の計算を行なおうとすると、
上手くいきません。512×512ならできるんですが。
やっぱり、メモリーを1GBとかにしないとだめですか?
ちなみに、計算内容は速度u,vをフーリエ変換してエネルギースペクトル
を出すというものなんですけど。。。
そんな質問で答えられるやつはネ申
583デフォルトの名無しさん:04/09/09 00:18
以下のスタイルのプログラムを書いたとき
メモリーは変数xとyの1024*2個分を消費されるのでしょうか
それとも メモリーは共有され1024個分だけ消費されるのでしょうか?
数十万の配列サイズを設定するので、なるべくメモリ消費は避けたいので
うまく共有したいのです。 アドバイスください 詳しい人。

program main
integer :: x(1024)

call sub(x)
   ・
   ・
end program main
   ・
   ・
subroutine sub(y)
integer :: y(1024)
   ・
   ・
return
end subroutine sub
>>583
subroutineへの受け渡しは配列の先頭アドレスとサイズですよ
585デフォルトの名無しさん:04/09/09 08:59
>>584さん ありがとうございます
ってことはsubroutineとで同じ物理メモリ領域を共有してるってことでいいんですよね?
586デフォルトの名無しさん:04/09/09 13:55
ポインタ 使うってのはどうなんかな?
>581
スタックが溢れてるね。
自動変数だとスタック領域が足りなくなるので
グローバル変数を使うしかない。
てか、最近のVCとかではスタックとかデータ領域とかって
どうやって指定するの?9801のころは気にしながらプログラミング
しなきゃならなかったから。
>>587
CVFならコンパイル時に/4Naオプションを付けると
すべての局所変数が静的に割り付けられる。

個別に指定するときは変数宣言時にSAVEかSTATIC
属性を付ける。
めもりは動的に確保してもいいんだが
590デフォルトの名無しさん:04/09/10 16:11:47
長年UNIX上でFortran使ってるせいか、Windows上のVisual Fortranが使いにくくて
たまらないんですが。なんであんなワークスペースファイルなどのいらないファイル
を作るんだろ。
591デフォルトの名無しさん:04/09/10 16:26:13
>>590
浦島太郎ですか?
592デフォルトの名無しさん:04/09/10 19:21:23
>>590
コマンドラインから使いなさい。
593デフォルトの名無しさん:04/09/10 23:14:52
594デフォルトの名無しさん:04/09/11 00:33:55
>>590
同意。それと、いろいろごちゃごちゃウィンドウがあって、肝心のコード見るためのウィンドウが狭い。
漏れも結局Windows上でもEmacs(Meadowだけど)使ってます。
595デフォルトの名無しさん:04/09/11 13:44:56
Windows上のVisual Fortranで数値計算ライブラリをコンパイルする方法ってないですかね?
もともとはソースコードが沢山入っててLinuxやUnix上ならMakeユーティリティで一発と
いう奴なんですが。
596デフォルトの名無しさん:04/09/11 14:34:48
普通にソースをプロジェクトにくわえれいいんでないかい。
fortranの場合、訛りがあることがあるから、ソースの修正が必要かもしれんが
597581:04/09/11 18:05:50
>>587,588
ありがとうございます。とりあえず無駄な配列を省いて
何とかできました。ただ、もうメモリの限界っぽいです。
金たまったら1Gにします。
598デフォルトの名無しさん:04/09/12 02:18:47
>>595
そういう状況では、うちではcygwinのGNU make + Visual Fortranのコンパイラという組み合わせで対処してます。
599デフォルトの名無しさん:04/09/13 17:12:28
>>590
おれも昔はそうだったが、IDE環境も良いもんだよ。デバッグも楽だし。
600デフォルトの名無しさん:04/09/16 04:13:51
Intel版のVisual Fortranでetime関数を使いたいのですが、やり方がうまく行きません。
ライブラリ・リファレンスをビルド時にオプションで指定しなければならないようなんですが、
どうしたらよいのでしょうか?
601デフォルトの名無しさん:04/09/16 17:32:52
FORTRANの基礎的な事は分かったのですが
数学的に難しい計算をするときにやり方が分かりません。
例えば2次元フーリエ変換はどのようにすればいいのでしょうか?
602601:04/09/16 17:33:49
コンパイラはVISUAL FORTRANを使ってます。
603デフォルトの名無しさん:04/09/16 21:34:50
>>600
もうちょっと具体的に、どんなエラーが出るとか書いてくれないと答え難いんだが。

ETIMEを使っているプログラムまたはサブルーチンの先頭に
USE IFPORT
を追加すれば特に追加のライブラリを指定しなくてもコンパイルできるはずです。

「未解決の外部シンボル_ETIMEが…」とエラーが出る場合は
プロパティ ページの Fortran --> Compatibility で
Use PowerStaion Portability Library が Yes になっているか確認して下さい。
デフォルトでは Yes ですが No になっていると ETIME を含むライブラリが
リンカに渡されません。(コマンドラインでは /fpscomp:nolibs)
604デフォルトの名無しさん:04/09/16 23:23:59
>601 にマジレス
別段FORTRANに限った話ではないが

1. 数学的に難しい計算を、自分でプログラムにする。
2. 数学的に難しい計算を、人にプログラムしてもらう。
2-1. 新たに書いてもらう
2-2. すでに書いてあるものを探してきて利用する
2-2-1. 買ってくる
2-2-2. フリーの物を使う
3. あきらめる

605デフォルトの名無しさん:04/09/17 01:47:13
>601 にマジレス
FORTRANの基礎的なことがわかったら
数学の基礎的なことも勉強しておく。
でないと、間違ってプログラム使っても気づかなかったりする
606デフォルトの名無しさん:04/09/17 01:50:10
フーリエ変換は簡単なようで奥が深い
607デフォルトの名無しさん:04/09/18 05:23:49
>>603
ありがとうございます。
早速ためしてみます。
608604:04/09/18 20:16:10
>601
2-2-1 ?
CVFのプロフェッショナル版であれば、IMSLがついてくるから、
その中に2次元FFTのルーチンがある。

2-2-1
ttp://www.xlsoft.com/jp/products/vni/fortran.html
でもIMSL売ってる。

2-2-1 ?
Numerical Recipes (書籍) あたりからソースを拾ってくる。
ただし、日本語版は C言語版
ttp://www.gihyo.co.jp/books/syoseki.php/4-87408-560-1
元ネタはFORTRANだったはず。

蛇足ながら Microsoft Powerstation (MS-FORTRAN の Windows版)には
Numerical Recipes (FORTRAN)がついてた。

2-2-2
ttp://www.netlib.org/fftpack/index.html あたりにあるかもしれない。
609デフォルトの名無しさん:04/09/20 00:57:46
今仕事でFORTRANのプログラムで演算処理させてるんですけど、時間が
50分くらいかかってしまって、とてもじゃないけどこまめに修正できない状態
です。で、新しいPCを入れて半分以下に短縮させたいんですが、どのくらいの
マシンを入れたら効果的でしょうか?プログラムは繰り返しの部分はサブルーチンで
記述されています。

現在、Cerelon2.66GHz+Visual Fortran 6.0+WindowsXP Proで動かしています。
これをXeon2.8GHz+Visual Fortran8.0に変更したら約半分くらいになるでしょうか?
また、Itanium1.3Gくらいにしたら1/10くらいになるでしょうか?
それならそれぞれ30万、150万近くでも金をかける価値があるのですが...

多くの人が理解できるように、OSはWindowsでプログラムの改良については、
下手にいじくると結果に保証が持てないので、行わない前提で良いアドバイス
をご教授いただけたらと思います。
610609:04/09/20 01:02:56
読みにくい文章ですいません。
あと、XEONを入れる場合は、Xeon2.8G×2です。

Visual Fortran6.0でもデュアルPCを活かして処理できるのであれば
それで行きたいです。

以上、よろしくお願いします。
611名無しさん@Vim%Chalice:04/09/20 07:04:09
半分とか1/10とかって…CPU変えるだけでそこまで上げるのはキツくね?
とりあえずプロファイル取ってみてボトルネックだけでも直した方が速くなる
んじゃないのかねぇ。
612609:04/09/20 11:19:08
>>611
やっぱそうですか。
デュアルCPUを使って、マルチスレッドのコンパイラを使えば約2倍になって
くれるのかな、と思ったのですが。
613デフォルトの名無しさん:04/09/20 13:23:26
>609 十年ほどじっと待ってみるのもよいかと。

しかし、経験的には611の言うようにプログラム見直したほうがよいかと。

ただし、経験的にはこれを行うと(もとのプログラムのほうにバグがあり。
思わずこれを直してしまったという事象も含めて)新たにバグを埋め込む
可能性も非常に高いということも否定できない。
614デフォルトの名無しさん:04/09/20 19:19:18
バージョン管理システムは必須だぜ!
615デフォルトの名無しさん:04/09/20 19:42:38
>>609
要するに、「プログラムを変更しないで計算時間を速くさせるにはどうしたらいいか?」
ということなんですね?どういう種類のプログラムで50分かかるのか分かりませんが、
メモリが足りなくてスワップしまくりで50分なら、メモリの追加で計算時間が1/100に
なるかもしれませんね。
616609:04/09/21 00:30:03
>>613-615
アドバイスさんくすこです。
ところで、今日、こんなページを見つけまして、
ttp://www.v-t.jp/techinfo/faq/answer/nt/nt_a05.html
言われた通りにしてみたら15分程度になりました。

気になるのが、
・ Math LibraryをFastに変更します。但し、演算速度よりも演算精度が重要な場合はAccurateを選択します。
のところなんですが、このときの演算精度ってどの程度のものなのでしょうか?
計算結果は、10^3〜10^7の範囲で合っていれば問題は無いのですが。

>>615
メモリ不足は無いと思います。PCには1GB積んでますし、一番大きい
行列が1400×1400程度ですので...
617デフォルトの名無しさん:04/09/21 01:09:45
>>616
CVF6.6 のマニュアルによると
> /math_library:fast
> ia32 システムでは,/math_library:fast は,数学ルーチンに対する
> 引数を検証しないことで性能を向上させます。 /math_library:fast
> を使用すると,予期しない例外値が生じる原因の追跡が困難にな
> ります。 ia32 システムでは,/math_library:fast は計算された浮動
> 小数点値の精度に影響を与えません。

ただし、コンパイラのバージョンによって違いがあるかも知れない。
#選択項目がFast/AccurateではなくFast/Checkになってるし

ちなみにCVF6.6 では精度と計算速度に影響するオプションは
Enable Floating-Point Consistency
618609:04/09/21 01:38:22
>>617
ということは、引数に変な値を入れない保証があればFastにしても問題
無いってことですね。

過去ログ読んでみましたが、1400×1400くらいの配列を作っていては、
1GB積んでいてもメモリがスワップしているようですね。
なので、なるべく固定できるものは固定する方が良いのでしょうか?

会社が新PCを購入することも検討してくれているので、40万くらい出すの
ならどのように使うのが一番効果が高いか悩んでいるところなのですが...
(金の割に性能がイマイチだったら肩身が狭いので...)
619デフォルトの名無しさん:04/09/22 05:32:11
勉強になるな。
大学の研究でやってるのが一回の計算がパラメータによっては50時間くらいかかる。
予算の時期的な都合で大型計算機使えないし上にかかれてる事試してみよう。
620デフォルトの名無しさん:04/09/22 22:54:25
でも >>616の通りにして50分→15分っていうのは
ただ単に今までデバッグ版で使ってただけじゃ…
621デフォルトの名無しさん:04/09/23 00:05:54
Optimization LevelをMaximamにはしないのかい(ny
622デフォルトの名無しさん:04/09/23 01:53:45
FujitsuのFortran&C(v2.1)でプログラムをビルドすると、

Fatal error LINK.1070:Cannot open object input file -- No such file or
directory "c0x32.obj"

と出てビルド処理が中断されてしまいます。
マニュアルもなくて対処法が分からないのですが、これは何が問題なんでしょうか。
623デフォルトの名無しさん:04/09/23 02:03:48
>>622
c0x32.objがなくてリンクができないってことが問題なんでしょうね.
624デフォルトの名無しさん:04/09/23 02:04:11
>>622
No such file or directory "c0x32.obj"
625622:04/09/23 02:18:50
>>623
>>624
どうもありがとうございます。
ズバリc0x32.objがないのが問題なのですね・・。
このc0x32.objというファイルをどこからか探してきて、
Fortran&Cのフォルダのどこかにコピーすれば動くでしょうか。
何度か再インストールしても同じエラーが出続けて参ります。
626622:04/09/23 05:26:26
探したところFortran&Cのlibフォルダ内にありました>c0x32.obj
設定ができてないのかもしれませんが、まだ解決してません。
いろいろいじってみます。もし正常に動作したらまた報告します(いりませんかね・・
スレを汚して申し訳ありませんでした。失礼します。
627622:04/09/23 12:39:21
正常に動きました。この使い方で合っているかどうか分かりませんが、
libフォルダ内の全ファイルとソースファイルを同じ場所に置いてやって
ビルドするとリンクまで正常に行えました。役に立たない報告かもしれませんが。
どうもありがとうございました。          
628デフォルトの名無しさん:04/09/23 13:39:32
環境変数でPATHが通ってないんじゃないの?
629622:04/09/23 16:53:35
>>628
たぶんどこかでlibフォルダにPATHを通す必要があるんだと思いますが、
どこで設定するのか分かりません。翻訳オプションという項目があって、
ここっぽいのですが、ヘルプを呼んでもそれらしいことも書いてなくて、
お手上げです。ソースファイルと一緒にlibフォルダ内のファイルを一緒に
置いてやれば動くので、とりあえずこのまま使用しています。
630しろうと:04/09/27 23:56:48
現在Salford FTN77 Personal Edition Fortran 77 Compilerを使っているのですが、これでグラフの作成もできると聞きました。どのように操作するのかご存知の方いらっしゃいませんか?
631デフォルトの名無しさん:04/09/28 22:56:16
>>630
FTN77 Library Reference P.45〜
632しろうと:04/09/28 23:01:32
>>631
ありがとうございます。がんばって読んでみます。
633デフォルトの名無しさん:04/09/29 00:58:50
>>630
気分がいいので、マジレス
>>55あたりから、見直せ
634609:04/10/01 00:20:26
>>383
それを使ってIVF8.1の試用版をやったら動きました。サンクスコ。
VC6.0なんかは入っていないほうがいいみたいです。
(PATHの設定でなんとかなるのかもしれないけど。)
635デフォルトの名無しさん:04/10/01 21:19:11
複素数の虚数部分を取り出す関数を教えてください。
636デフォルトの名無しさん:04/10/01 21:20:55
age
637デフォルトの名無しさん:04/10/01 21:33:29
>>635
IMAG()

が使えなければ

(a - CONJG(a) )/2

で定義する。
638635:04/10/01 22:05:34
サンクス。
IMAGで検索したら分かった。
日本語で調べるときは「虚数部」じゃなくて「虚部」なんだな…
639デフォルトの名無しさん:04/10/03 21:52:19
AMDのプロセッサにもっとも最適化されているコンパイラって何ですか?
640デフォルトの名無しさん:04/10/03 23:54:05
>>639
AMD Core Math Libraryをリンク
641デフォルトの名無しさん:04/10/04 20:49:11
ヤーッ

ホーッ


FORうわなにをするやめ亜wせdrftgyふじこlp;@
642デフォルトの名無しさん:04/10/04 20:54:20
        ヾ  /    < 仮面ライダー1000が>
       ,. -ヤ'''カー、   /Y⌒Y⌒Y⌒Y⌒Yヾ
 ー―ァ  /r⌒|:::|⌒ヾ
   _ノ オ{(  |0|  )} オオオォォォォ!!!!!
     __,ヽ,ヾ,_|V|,_ノ、/ ,r-,,=
    ,゛==ゝ_ViV_ノ~i/ 〃 `ー―-、
    /  /⌒`//´⌒c/^^^ ))))))))))
 ,,―イ  {ー''"~{ {~゛`ー`/'`'~/ー--―'
))   ,./ゝ_/∧ゝ_ノ  ノ
 ー''"  |ロ  ロ    |
 人,_,人,_,人,_,人,_,人,_,人_,人,_,人
< 華麗にスイス民謡をを阻止!>
 Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒
643デフォルトの名無しさん:04/10/05 22:53:26
遺伝的アルゴリズムのサブルーチンがおいてあるとこってないですかねぇ???
644デフォルトの名無しさん:04/10/06 00:04:02
>>643 英語でググればいっぱいひっかかるぞ
645デフォルトの名無しさん:04/10/06 20:28:44
>>643
遺伝的アルゴリズムを利用したサブルーチンは探せば、いっぱいある。
ただ、あくまでアルゴリズムなので、>>643がそのまま流用できるソースはないかと。
646デフォルトの名無しさん:04/10/07 08:42:41
プログラムのどこの処理で時間がかかってるか知りたいけど
それを解説したサイトってないですかね?
例えばただの計算、IF文、乱数の発生などをそれぞれの処理ごとに時間を計った例とか。
647デフォルトの名無しさん:04/10/07 19:32:25
前任者から引き継いだコードがメインの部分に延々と全ての処理を書いているんです。
どうみても分かりにくいです。
前任者はITの鬼という評判なのでが、なにかこの書き方のメリットはあるのでしょうか?
私はもう書き直そうかと思っているのですが。
648デフォルトの名無しさん:04/10/08 01:53:30
Staticオプションを付けるとどう変わるのでつか?
649デフォルトの名無しさん:04/10/08 06:07:26
>>647
メリットは色々あるが、主なものを挙げると
1.サブルーチンの呼び出し/復帰がない分、処理速度が向上する(ような気分になれる)
2.万が一ソースが流出した場合でも、処理の流れがわかり辛いので機密保持に役立つ
3.サブルーチンの名前を考える手間が省ける


「ITの鬼」というより鬼門な人だな。
まあ、世間一般の評判というのは必ずしも実力で決まるもんじゃ無いから・・・
650デフォルトの名無しさん:04/10/08 09:30:24
>>646
$ g77-3.4 -pg hoge.f

$ ./a.out    # ここで gmon.out が作られる

$ gprof a.out

すると,ズラーっと役に立ちそうな情報が出てきます.
651デフォルトの名無しさん:04/10/09 02:21:43
プログラムというのは
最適化をかけない場合と
極限まで最適化をかけた場合では
おおよそどのぐらい計算速度に差が出るのでしょうか。

4倍くらいにはなりますか?
652デフォルトの名無しさん:04/10/09 02:25:51
implicit none の無いソースを受け継いだ。

動かない。でかい。資料は六法全書のような厚さ。

いったいどうしろと・・・・・・やるしかないか・・・。
653デフォルトの名無しさん:04/10/09 03:12:09
数字を文字列に変換する関数は何でしょうか?
1.dat 2.dat 3.dat ...
というファイルを次々に出力したいのですがやり方が分かりません。
また、>>635も私ですが必要な命令の調べ方も教えてくれるとうれしいです。
Visual Fortranをもっています。
654デフォルトの名無しさん:04/10/09 05:10:31
>>653
> 数字を文字列に変換する関数は何でしょうか?
> 1.dat 2.dat 3.dat ...
> というファイルを次々に出力したいのですがやり方が分かりません。

こんなんどうですか?

implicit none
character*1 A
integer d

write(unit=6,fmt=*)"A= ",A

d = 5
write(unit=A,fmt="(i1)" )d

write(unit=6,fmt=*)"d= ",d
write(unit=6,fmt=*)"A= ",A


関数の方は知りません。そんなんあるのかな?
655デフォルトの名無しさん:04/10/09 08:50:29
Cとfortranはどっちが速いの?
656デフォルトの名無しさん:04/10/09 11:03:33
>>655
アルゴリズムも同じとして,,,
高度なコンパイルが出来るコンパイラがある fortran の方が速いらしい.
だから,どうしても fortran でないとできない問題もあるんだって.
実際に見たわけじゃないけど.

個人で問題になるのは完成までの時間の方だと思うし,
だいたい fortran を使ってたら出来るものも出来無い (俺が問題) よ.
657デフォルトの名無しさん:04/10/09 11:54:34
>>653
VFなら、ENCODEという数字を文字列に変換する関数があるが、拡張子をつけて、
ファイル名を作るなら、>>654のようにwriteで文字列に書き込んだほうが簡単かも。

implicit none 
character*1 fnm1
character*5 fnm2
integer i
integer ide(9)

101 format(i1.1)

do i=1,4
encode(1,101',fnm1) i
open(ide(i),file=fnm1//'.dat')
end do

do i=5,9
write(fnm2,'(i1.1,a4,)'
) i,'.dat'
open(ide(i),file=fnm2)
end do
658デフォルトの名無しさん:04/10/11 00:47:46
>>653
>必要な命令の調べ方も教えてくれるとうれしいです。

マニュアルに組み込み手続きの一覧が載っていると思うので
それを概要だけでも眺めてみると良いかと。
659デフォルトの名無しさん:04/10/11 01:09:36
先に処理系のマニュアルを見ると,移植性のないコードを書きそうだけれども,
Fortran では普通なのかな?
660デフォルトの名無しさん:04/10/11 14:01:32
>>659
まともなマニュアルなら、標準と独自拡張ぐらいちゃんとわけて書いてあると思われ。
661デフォルトの名無しさん:04/10/11 22:54:25
Visual Fortran のマニュアルも拡張部分は色分けされて書かれてますよ。

FORTRAN 77はともかく、F90/95は処理系のマニュアル以外に
ろくな日本語の参考書が無いからなぁ…
662若葉マーク:04/10/12 15:53:44
微分が式の中に入ってる時のprogram上での式の書き方がわからないです。
オイラーとかで展開していくのか、何かコマンドみたいなのがあるのか教えて下さい。
下の式では(∂f/∂s)の表現の仕方がわかりません。

f=(k-h)ln(s'/s)
dt=r・(∂f/∂s)

k,hは既知です。sは変数です。
print,readで入力します。
誰かお時間ある方・・・教えて下さい
663デフォルトの名無しさん:04/10/12 16:02:35
windowsで使えるフリーのコンパイラを教えてください
664デフォルトの名無しさん:04/10/12 20:03:33
>>662
勘違いがありましたらすみません.

read で読んだ式を処理するのですか?
とても難しい問題だと思います.
(GNU bc のソースコードを見てみてください)

また,一般にプログラムには,用意された演算しか書けません.
+, -, *, /, ^ などの演算子の他は (計算機で言う) 関数しか使えません.
「数値計算」について調べてみてください.
微積分などを加減算だけでやる方法の学問といった感じです.
方法はいろいろあります.

解析的な答えを出したいときは,数式処理ができるプログラムを
使用します.数値ではなく記号を扱うので「記号処理」などと呼ばれます.
665デフォルトの名無しさん:04/10/12 20:06:20
>>663
g77 を使うなら,cygwin 以外にもありますよ.
MinGW や DJGPP というプロジェクトがあります.
DJGPP にあるプログラムを持ってくれば Unix なコマンド群も
あるから作業しやすいかも.
環境をインストーラでサッサと作ってしまうなら MinGW でしょうか.
666若葉マーク:04/10/12 21:18:24
>>664の方
有難うございます。
dos画面でsの値をとりあえず手入力してdtの値を一つ一つ計算してもらいたいです。
「数値計算」で調べてみてそれでも駄目ならまた戻ってこようかと思います…
では
667デフォルトの名無しさん:04/10/12 21:24:57
レポート厨うざい
668デフォルトの名無しさん:04/10/12 23:07:46
>>666
元の関数 f を変形しないのならば,

function f(...) を定義して,

eps=1e-6
dt = r * (f(s+eps,...) - f(s, ...)) / eps

とやればいいと思います.微分の定義そのままです.
変形するなら,df/ds を手で求めてその導関数を使えばいいだけのことです.
669デフォルトの名無しさん:04/10/13 00:55:16
670デフォルトの名無しさん:04/10/13 14:39:16
PGI fortran win版でdtime命令使うと、0.00000となって経過時間が取得できないのですが、
何をすればよいのでしょうか?
671デフォルトの名無しさん:04/10/13 17:33:32
64ビットXeon用のFortranコンパイラは無いのかなー。
672デフォルトの名無しさん:04/10/13 17:42:20
>>670
スタート個所と終了個所で合計2回呼ばないといけないとか
673デフォルトの名無しさん:04/10/13 20:23:44
ある配列変数の値をファイルに出力するoutputという名のサブルーチンがありまして、
ソースファイルに

call output                --------------------A
call subfunc

という様に並び、subfuncの中身は

subroutine subfunc
common変数をまとめたファイルのinclude
局所配列変数の宣言
call output                --------------------B
やりたい計算処理

というように並んでいます。
AとBの値は同じになるはずなのですが、Aは数値でBは!!!!!!!!(非数表示)となってしまいます。


皆様の経験上、この原因としてどのようなミスが考えられますでしょうか?


674デフォルトの名無しさん:04/10/13 21:45:17
>>673
fortran90にして、全てのサブルーチンとファンクションの interface を書いておけば
そういうのは無くなるよ。commonも使わないほうがいい
675デフォルトの名無しさん:04/10/14 00:17:46
俺もcommonによるバグを最後まで取りきれずに、結局全部
引数渡しにした事があったっけな・・・。
学部の頃はモジュールなんて知らなかったよ。

個人的にはimplicit noneとinterfaceが強制されない仕様が気に入らない。
どうして自由形式になった時に変更されなかったんだろ?
676デフォルトの名無しさん:04/10/14 08:39:18
>>672
以下のように2回呼んでいるのですが、
program dtimetest
real dtime
real st,ed,j
real dtime_array(2)
integer i

st = dtime(dtime_array)

do i=1,5000000
j = j + j*j
enddo

ed = dtime(dtime_array)

print *,' elapse=', ed,' user=', dtime_array(1),' system=',dtime_array(2)
stop
end
677デフォルトの名無しさん:04/10/14 13:07:26
>>676
dtimeってのはよく知らないけど,system_clockとおなじなら,
ed-stにしないと意味がないような.
678デフォルトの名無しさん:04/10/14 14:08:56
>>677
ed-stでやってみたけど、0.00000となった。
ユーザーズ・ガイドのsystem_clockの例を試したけど、
ビルド後の最初の実行時は、経過時間が表示されたが、2回目以降の実行時は
0.00000の表示になった。プログラムを変更しないで、もう一度ビルドした後、
実行すると、経過時間が表示されるが、再度実行すると0.00000の表示になる。

ちなみに、timeコマンドで
time a
とすると、実行時間が正しく表示される。

なんでだろう?
679デフォルトの名無しさん:04/10/14 18:10:00
>674
>675

返答ありがとうございます。

なぜ、commonは使わないほうがいいのでしょうか?
680デフォルトの名無しさん:04/10/14 21:52:31
>>678
PGI Fortran ってのは知らないけどググったら、こんなん出た。関係あるかい?

ttp://scs.ictp.it/manuals/pgi/pgf77_ref/f77ref08.htm

>The routines dtime and etime are only available in a SYSVR4 environment.
>These routines are not available in all environments simply because
>there is no standard mechanism to resolve the resolution of the
>value returned by the times() function.
681デフォルトの名無しさん:04/10/15 02:05:16
>679

・COMMON は グローバル変数のようなものだから、
どこのルーチンで何をされるかわからない。
バグの原因。メンテナンスが困難。

・COMMON は グローバル「変数」というか グローバル「メモリ」。
変数並びの部分はルーチン間の整合性をコンパイラが担保してくれない。
整合を取るのはプログラマの責任。
バグの原因。メンテナンスが困難。

・COMMON変数が多くなると、どれがローカル変数でどれがCOMMON変数だか
よくわからなくなる。(せめてIMPLICIT NONE であればまだ救われるが...)
バグの原因。メンテナンスが困難。

ってなかんじかな
682デフォルトの名無しさん:04/10/15 08:00:26
変数のスコープが細かくないのは,Fortran のアプローチなのかな.
C で言うブロックを作って,狭い範囲だけで名前を使いたかったりするんだけれど.
これができないおかげで速いコンパイラが作れるということなんでしょうか?
683デフォルトの名無しさん:04/10/15 08:00:43
>>680
どうもありがとうございました。
NT環境だからなのか?
PGI Fortran winXP環境で、プログラム内で経過時間を測定する
まともな方法を誰か教えてください。
684デフォルトの名無しさん:04/10/15 12:12:13
>>682
> C で言うブロックを作って,狭い範囲だけで名前を使いたかったりするんだけれど.
> これができないおかげで速いコンパイラが作れるということなんでしょうか?

狭い範囲で名前付けられるならむしろその方が速いコンパイラ作れそうな気がするなぁ。

685デフォルトの名無しさん:04/10/15 18:34:13
デバッガって話題になりました?

gdbはFortranに対応ということですが,どうにも情報が少ない気が...
idbはintelにバンドルされている以上Fortranに対応していると思うのですが,こちらもあまり情報がありませんよね...

静的なツールに関しても詳しい方いらっしゃったらお願いします.
686デフォルトの名無しさん:04/10/15 20:06:02
>>683
Cで計測ルーチン作ってリンクするとか
687デフォルトの名無しさん:04/10/15 23:34:26
>681

ありがとうございます。
688デフォルトの名無しさん:04/10/16 08:47:39
>>685
なんとなく,フリーソフトウェアの開発している人って,速度より可搬性,移植性を
優先するから Fortran 使ってなさそう...
機能は限られるものの, C でやるように gdb できるみたいですから,それでいいのでは?
gcc, g77 のオプションも gcc が基本ですから.
689デフォルトの名無しさん:04/10/16 09:55:13
INTELのFORTRAN(Windows版) の開発環境(VS.NETでしたっけ?)の
使い心地って、どうなんでしょうか?
690デフォルトの名無しさん:04/10/16 16:13:41
>>688

ええと,おっしゃるとおりだとは思うんですが, gdbに関するドキュメントってほとんどCのデバッグについてですよね?

Fortranをターゲットにしたドキュメントってないのかなあ?と思ったわけです.
691デフォルトの名無しさん:04/10/17 14:45:05
簡単な解析(固有値解析等)をしたいのですが、FortranとC++で
したらどちらを使用した方が良いでしょうか?
また、Fortranはどのような目的で使用するものなのでしょうか?
692デフォルトの名無しさん:04/10/17 15:28:11
コンパイルすると
Error: Illegal character in statement label field [.].
といるメッセージが出てしますのですが、これは何を意味しているのでしょうか?
お願いします。
693デフォルトの名無しさん:04/10/17 23:31:38
>>691
C++ で,ライブラリを使うのがベストかと.
Fortran は環境が特殊な場合以外は,強制されるまで使わなくていいと思う.
なんというか,マゾっぽかった (´Д`)
694デフォルトの名無しさん:04/10/17 23:34:55
>>692
ifc かな?
f90 からサポートされる free format で書いているのに,
f77 としてコンパイルされているのでは?
ファイル末尾を .f90 にするかコンパイラオプションを使いましょう.
695デフォルトの名無しさん:04/10/17 23:41:48
>>691
簡単な解析ならどちらでもいいが、その程度の計算でオブジェクト指向の恩恵はほとんど受けられないと
思われ。CじゃなkてC++にしたいのは何故?
696デフォルトの名無しさん:04/10/18 00:52:47
>>695
>>691 じゃないけど,C99 に沿って書かないと言語仕様の制限がキツくないですか?
STL があるだけでも幸せなプログラミングが出来ますし.
やっぱり複素数が無いと.
数値以外のデータには std::list を使いたいものです.
697いなむらきよし:04/10/19 18:33:17
FORTRANのコードをカードにパンチしてた頃が懐かしいキケー!
698デフォルトの名無しさん:04/10/20 17:51:05
今日、初めて「Compaq Visual Fortran」を使い、簡単なプログラムを書いたんですけど、
エラーが出て困っています。
助けて下さい。

状況は
http://www.mcmd.ne.jp/mc/1st/vfhowto.files/frame.htm
のHPを参考に開いて、参考書に載っている簡単なプログラムを書いたんですけど
、何をやっても一つのエラーが出てきます。
しかし、以下の方法で開くと、エラーは出ません。
@「Developer Studio」を開き、file→new(新規作成)をする
A「fortran console application」を選択し、プロジェクト名と場所を指定する
Bここで「OK」ボタンを押さずに、Filesタグを押し、file nameを指定し、OKボタンを押す
C最後に、プログラムを書いても、エラーは出ません。

参考にしたHPとはBの過程が違うだけです。
どうしてですか!?
よろしくお願いします!
699デフォルトの名無しさん:04/10/20 20:46:16
何と言うエラーメッセージが出るのか教えてもらわないと対処できないよ。
何も「一つのエラー」とかわざわざ曖昧にぼかさなくても...
エラーメッセージはエラーの内容を伝えるために存在してるんだろうに。
700デフォルトの名無しさん:04/10/21 00:29:00
>699
699さん、返事が遅くなり、ごめんなさい。
以下にエラーメッセージを載せます。
よろしくお願いします。

Compiling Fortran...
D:\研究2004\FORTRAN\練習\sample\sample.for
f90: Severe: Invalid argument
... file is 'D:\?????Q?O?O?S\FORTRAN\?u?K\sample\sample.for'
Error executing df.exe.

sample.obj - 1 error(s), 0 warning(s)
701デフォルトの名無しさん:04/10/21 00:56:38
フォルダに日本語使ってるのが悪い。
2バイト文字イクナイ!
702デフォルトの名無しさん:04/10/21 01:18:39
>701
701さん、ありがとう御座います!!!
フォルダを直したら、問題が解決しました。
感謝です!
早速、プログラムを書いてみます(^^)
703デフォルトの名無しさん:04/10/21 20:58:36
教科書に載っていたプログラムで解らないことがあったので、教えてください!
質問1.
変数の宣言で、
complex*16 xin(2,0:ndata),y(0:ndata),ww(2,0:ndata+1)

と書かれているのですが、*16とは何を意味しているのですか!?

質問2.
変数に値を代入する所で、
pow1=1.0do
のように数字の後にdoという文字がありました。
これは何を意味していのですか?
よろしくお願いします。
704デフォルトの名無しさん:04/10/21 21:18:15
1.倍精度
2.倍精度(doじゃなくてd0)
705703:04/10/21 21:26:56
704さん、ありがとうございます。
そのキーワードを参考に、もう一度勉強してみます。
706デフォルトの名無しさん:04/10/22 00:14:43
リテラルに d0 を付けるのはなぜ?
式に double precision があればコンパイル時に直してくれるような.
変数は double precision 以上しか使いませんよね.最近.
707デフォルトの名無しさん:04/10/22 22:37:52
>>706

組み込み関数の「個別名」が嫌いなんで、
例えば、 πが欲しい時なんか 4*atan(1.0d0) ってしてまつ。
atan(1.0)のままだと単精度。


708デフォルトの名無しさん:04/10/22 23:04:39
>>706
d0を付けて明示的に倍精度にしないと定数はデフォルトの
realのサイズ(たいてい単精度)になるから。

double precision a, b, c
c = 0.0
a = c + 0.123456789
b = c + 0.123456789d0
write(*,*) a, b

コンパイラのオプションで倍精度をデフォルトにできる場合も
あるけど、古いプログラムを使い回してたりすると COMMON
ブロックのサイズがずれてきて…
709706:04/10/22 23:28:17
>>707
そうですね.忘れていました.orz

>>708
桁が多い実数が,コンパイル時に丸められる可能性もあるんですね.

結局,今どきの実数は全部 `d' を付けておかないとなりませんね.
! 他の言語でも大抵 `e' と `d' はサポートするからいいか...
710デフォルトの名無しさん:04/10/23 04:16:50
/Opか/Qprecオプション付けたらいーんでネーノ?
Intel Visual Fortranの場合だけど。
711デフォルトの名無しさん:04/10/23 07:20:25
これからfortran勉強する価値はあるの?
fortranの他の言語に対する利点て何?
712デフォルトの名無しさん:04/10/23 14:12:15
無い


資産が利点になるかどうかは微妙.
他の言語から呼べればいいんだし.
713デフォルトの名無しさん:04/10/23 14:42:12
>>712
VBから呼べるの?
714デフォルトの名無しさん:04/10/23 16:36:32
>>711
数値計算に限れば、Cで開発するくらいならFortran90/95使ったほうがはるかにまし。
715デフォルトの名無しさん:04/10/23 17:48:23
>>713
呼べないとしたら、今すぐ手放すことをお勧めします。
716デフォルトの名無しさん:04/10/23 21:37:32
>>714
どこらへんがましか、教えていただけませんか?
私的には C/C++ と変わらないように感じるのですが。。。
ちなみに FORTRAN 初心者です。
717デフォルトの名無しさん:04/10/24 09:09:08
>>716
>>714じゃないが、配列機能が最強なところとか?
Fortran90/95の多次元配列の扱いやすさは他言語の比じゃないよ。そのお陰で
より数式に近い形で書けるし。
あと、Cに比べてある程度ハードウェアを覆い隠してくれるのでコーディングしやすい
っていうのもあるね。

しかし、Fortranの文法に古臭さを感じるのも事実・・・。
718デフォルトの名無しさん:04/10/24 13:44:40
>>717
これって、C++ の演算子オーバーロードとか使えば
C++ でもあまり変わらないってことありませんか?
719デフォルトの名無しさん:04/10/24 14:50:41
fortran は数値計算用だから,
昔から言語の方でそういう仕組みが用意してあったということですね.
ちゃんとした C++ 用行列ライブラリもいっぱいあって使いやすいです.

C だけでは辛いのは同意.あれは OS を書く言語です.
720デフォルトの名無しさん:04/10/24 15:37:18
C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...
721デフォルトの名無しさん:04/10/24 15:42:38
>>720
> C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...
それは分かるが、節度をもって使えば便利だと思うよ。
722デフォルトの名無しさん:04/10/24 15:53:06
>>720
> C++はCを基礎に作られたSM用具です。ゆめゆめ手を出さぬよう...

漏れは使いたくないのに強制されるんだよぅ...
723デフォルトの名無しさん:04/10/24 17:38:43
C++は必要なものだけを使えばCより使いやすいと思う。

最近までは数値計算の分野ではオブジェクト指向プログラミング
の恩恵が少ないと思っていたけど、オートマトンの様に内部状態
を持つモデルの構築をやり始めるとその必要性を感じてきました。
724デフォルトの名無しさん:04/10/24 18:39:20
>>723
内部状態!? ならば lisp でクロージャを使うんだ!
725デフォルトの名無しさん:04/10/24 19:37:39
C++初心者がOOPを駆使して作ったプログラムはFortranの何倍も遅い場合がある。
コンストラクタとデストラクタが死ぬほど呼び出されてるのも気にせず組んだりするから。
その点、Fotranは良いアルゴリズムさえ用いれば、初心者でもプロでもそれほど実行スピードに
違いは無い(例外はもちろんあるが)。
726デフォルトの名無しさん:04/10/24 23:05:26
>>725
> その点、Fotranは良いアルゴリズムさえ用いれば、初心者でもプロでもそれほど実行スピードに

この言語仕様で良いアルゴリズムが組めれば上級 w
727723:04/10/25 02:16:23
>>724
クロージャがどういったものかは分からないけど、C++もboostにありますね。
仮にそこまで勉強して実装したとしても、他の院生や学部生には扱えない罠。

僕の所属している研究室(音声信号関連)では、学生が20人もいるのにどういう訳かCを
扱える人間が一人もいません・・・全員f90コンパイラでFORTRAN77つかってます。(; ;)
728デフォルトの名無しさん:04/10/25 17:35:04
FORTRANのプログラミングってもうフリーソフトでないんですか?
サイトに行ってもライセンス取得しないとだめみたいで・・・。
729デフォルトの名無しさん:04/10/25 17:48:29
>>728
g77 ってのがある。
http://www-rocq.inria.fr/~kern/G77/g77.html
Cygwin からでも使えるゾ。
730デフォルトの名無しさん:04/10/25 19:53:30
731デフォルトの名無しさん:04/10/25 21:24:57
GCC には Pascal やら Ada も入ってるんだよね.
ちょっとやってみる人や,やらされる学生はこれでいいのに.
732デフォルトの名無しさん:04/10/25 21:30:28
>>729-730
ありがとうございます!
とても助かりましたww
733732:04/10/25 21:41:53
>>562 の使い方いまいちわかりません。
教えていただけないでしょうか?
734デフォルトの名無しさん:04/10/25 21:45:52
>>733
何がわからないのか
何を教えてほしいのか

が全然わかりません。
735俺はエスパーだぜ?:04/10/25 22:59:41
>>733
たぶん,統合開発環境が初心者にやさしいとは限らないのでしょう.
いろいろありすぎますからね.
私も最近のボタンをポチポチやる開発には嫌気がさして出来ません.

g77 で hellow, world! から始めた方がいいと思います.
そういうサイトがあるのかは知りません.
736デフォルトの名無しさん:04/10/25 23:42:03
>>733
> >>562 の使い方いまいちわかりません。

1. >>562をクリックします。
2. IEのアドレス欄に半角の「h」を書き込み、その後ろに562の3行目
   (ttp://〜)をコピペして「移動」を押します。
3. 出てきたページの第一段落の最後、
   「You can download FTN95 Personal Edition (FTN95PE) here.」
   の「here」の部分をクリックします。
4. ダイアログが出てくるので「ftn95_personal.exe」を適当な場所に
   保存します。
5. 保存できたら「ftn95_personal.exe」を実行し、プログラムを
   インストールします。

6. 飽きたら「コントロールパネル」の「アプリケーションの追加と削除」
   から「Salford FTN95 x.xx」を選択し、アンインストールします。
737デフォルトの名無しさん:04/10/30 14:56:45
xの初期値、終了値、増分を読み込んで
exp(x)とlog(x)の値を求めるプログラムを作成したいのですが、
実行結果が
 x= 0.1 exp(x)= 1.105171 log(x)= -2.3025851
x= 0.2 exp(x)= 1.2214028 log(x)= -1.609438
x= 0.3 exp(x)= 1.3498588 log(x)= -1.2039728
x= 0.4 exp(x)= 1.4918247 log(x)= -0.9162907
x= 0.5 exp(x)= 1.6487212 log(x)= -0.6931472
x= 0.6 exp(x)= 1.8221189 log(x)= -0.5108256
x= 0.70000004 exp(x)= 2.0137526 log(x)= -0.35667487
x= 0.8 exp(x)= 2.2255408 log(x)= -0.22314353
x= 0.90000003 exp(x)= 2.4596033 log(x)= -0.10536048
x= 1.0 exp(x)= 2.7182817 log(x)= 0.0E+0

このようになってしまいました。
xの値の誤差をどうやって消すのか教えてください。
738737:04/10/30 14:59:05
すいません。自分が作った物を張り忘れました。

   real a,b,c,x,y,z
write(*,*)'xの初期値、終了値、増分を入力して下さい。'
read(*,*)a,b,c
write(*,*)"初期値:",a,"終了値:",b,"増分:",c
if(a>b) then
write(*,*)'もう一度初期値と終了値を入力し直して下さい'
stop
else
write(*,*)" x exp(x) log(x)"
do x=a,b,c
y=exp(x)
z=log(x)
write(*,*)"x=",x,"exp(x)=",y,"log(x)=",z
end do
end if
end
どこを修正すればいいか教えてください。
お願いします。
739デフォルトの名無しさん:04/10/30 16:47:58
b
740デフォルトの名無しさん:04/10/30 17:26:38
>>738
>write(*,*)"x=",x,"exp(x)=",y,"log(x)=",z
に書式指定付けて、xの小数点以下の桁数を短くすれば?
741デフォルトの名無しさん:04/10/30 18:39:29
realのdo変数って廃止予定事項だったような。
742デフォルトの名無しさん:04/10/31 16:40:56
>>738
これは慣用句だ:

do
  if(x.ge.100.0) exit
  ...
  x=x+1.0
end do
743デフォルトの名無しさん:04/11/01 12:07:50
xの値を0〜360度まで可変し(10度刻み)、sin(x)の値を求める。

但し、2次元配列にxとsin(x)の値を収めて、その中身を出力する事。
xとsin(x)の値は一列に並べ、データ個数分の行数(37行)を出力する事。

という問題が解りません。何方か御教授お願いします。
744デフォルトの名無しさん:04/11/01 12:18:19
for を使え
745デフォルトの名無しさん:04/11/02 00:09:45
>>743
--
program hoge
implicit none
real(8) :: array(2,37)
integer :: i
do i = 1, 37
array(1, i) = real(i - 1)*10.0
array(2, i) = sin(array(1, i))
print *, array(1, i), array(2, i)
end do
end program hoge
--
コンパイルしてないけど,こんな感じかな.
それとも,

>但し、2次元配列にxとsin(x)の値を収めて、その中身を出力する事。
>xとsin(x)の値は一列に並べ、データ個数分の行数(37行)を出力する事。

という問題の意図がわからないというのであれば,私も分かりません.
746デフォルトの名無しさん:04/11/02 02:45:49
こんな感じにすると、いかにもFortranっぽい。

program hage
implicit none
real, parameter :: PI = 3.14
real, dimension(0:36, 2) :: a
integer :: i
a(:,1) = (/(i*1.0, i=0,360,10)/)
a(:,2) = sin(a(:,1) * PI / 180.0)
print "(2F10.5)", (a(i,1:2), i=0,36)
end program hage
747デフォルトの名無しさん:04/11/02 03:44:47
if文を使ったソースで解らないことがありました。
それは、
if(abs(y(i,in)) .lt. 1.0d-5) then
dr(i,in)=1
else
dr(i,in)=1/abs(y(i,in))*y(i,in)
end if

の部分で、
1行目 y(i,in)) .lt. 1.0d-5の後半部分の1.0d-5の意味が解りません。
1-5という事ですか?
dは倍数精度で使われると調べたのですが・・・。

是非、教えていただけませんか?
宜しくお願いします!!

.
748デフォルトの名無しさん:04/11/02 09:27:42
10の-5乗
749デフォルトの名無しさん:04/11/02 13:57:33
単精度 →1.0E-5
倍精度 →1.0D-5
4倍精度→1.0Q-5
750デフォルトの名無しさん:04/11/02 14:55:36
>>745
>>746

どうも有難うございます。大変助かりました。


751747:04/11/02 20:42:07
749さん、ありがとうございました。
勉強のし直しです。
また、よろしくお願いします。
752478:04/11/02 23:39:34
・・・。
753747:04/11/03 11:56:17
748さん、失礼しました。本当にごめんなさい!!
ありがとう御座いました。
1.0d-5とは10の-5乗という意味なんですか?
749さんの説明と違いますよね?
これは、何か意味のある事なんですか?
それとも、どちらも正しいことを言っているのかなー??

754747:04/11/03 12:08:38
何度もすみません。
748さん、749さんの説明の意図がようやく解りました。
ありがとう御座いました。
また何かあったら相談にのってください。
では、失礼します。
755デフォルトの名無しさん:04/11/03 12:18:48
当然ながら、748も749もどちらも正しい。
756デフォルトの名無しさん:04/11/04 17:11:31
fortranを勉強できるサイトを教えてください
757デフォルトの名無しさん:04/11/04 17:42:08
>>756

要求している程度が分からんケド,こんなもんで。
最後のは g77 の話なので文法とは無縁カモ(基本的に)。
探せばイッパイ出てくる・・・カナ?

FORTRANプログラミング初級編
http://svr01.damp.tottori-u.ac.jp/~akimoto/Fortran/

FORTRAN 77 入門
http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/f77-enshu/index.html

Using and Porting GNU Fortran
http://www.delorie.com/gnu/docs/gcc/g77_toc.html
758デフォルトの名無しさん:04/11/04 17:50:02
↓のHTML講義ノートも

ttp://www.ip.media.kyoto-u.ac.jp/htomita/
759デフォルトの名無しさん:04/11/05 02:42:45
Fortran 90のリファレンスとして良く利用してます。

ttp://www.rs.kagu.tus.ac.jp/yama/
760デフォルトの名無しさん:04/11/05 12:06:14
>>759

おお『入門Fortran90実践プログラミング』の人ですね。
この本が絶版と知って吃驚してます。
761デフォルトの名無しさん:04/11/05 23:25:48
FORALLとDO〜END DOは最適化すれば同じでしょうか?
762デフォルトの名無しさん:04/11/06 11:14:43
>>761
違う。
763デフォルトの名無しさん:04/11/07 12:05:18
fortranでのファイルの読み書きがわかりません。
書き込みだけでもいいので教えてください。
Cの経験はあります。
764デフォルトの名無しさん:04/11/07 12:11:16
Visual Fortran(~o~)
765デフォルトの名無しさん:04/11/07 12:31:37
open(unit=10,file='unko.txt')
write(10,*)'うるせーバカ'
766デフォルトの名無しさん:04/11/07 13:27:57
>>765
ワラタ
確かに答えになってる
767デフォルトの名無しさん:04/11/08 20:49:28
Fortran 90ってC99みたいに可変長配列をサポートしていましたっけ?
当方使っているコンパイラはHP Fortran90とFortran Power Station 4.0
ですが、両方ともコンパイルが通って(一見)きちんと実行できますが・・・。

↓たとえばこんな感じです。

SUBROUTINE SUB(n)
    INTEGER n

    REAL ary(n)
    INTEGER i

    DO i=1,n
        ary(i) = i
    END DO

    WRITE(*,*) SIZE(ary)

END SUBROUTINE SUB
768デフォルトの名無しさん:04/11/08 23:00:23
>>767
Fortran 90ならサポートしてるよ >自動割付け配列
769デフォルトの名無しさん:04/11/08 23:44:06
「自動割付け配列」って、ヒープじゃなくてスタックに確保するのかな?
割付けに失敗した時のエラー処理とかもできないよね。
やっぱり、デカイ配列を動的に確保したい時はallocate文を使うほうが無難?

770デフォルトの名無しさん:04/11/09 00:32:19
>>769
どこに割り当てられるかは処理系依存だろうけど
どちらにしろ、大きな配列を確保しようとすると
エラーになる可能性がありますね。
エラー処理の方法は私もわかりません(ないのかな?)

エラーで強制終了させたくなかったら、ALLOCATEを使って
ちゃんと確保できたか調べるのが無難みたいですね。
771767:04/11/09 01:52:00
>>767
ありがとうございます。良く見たらマニュアルにも書いてありました。
(かなり簡単な説明でしたが。)
あまり大きな配列でなければ、allocate()、deallocate()を使わなくて済む分便利かもしれませんね。
772名無しさん@ピンキー:04/11/09 01:54:00
間違えた・・・
×>>767
>>768
773デフォルトの名無しさん:04/11/09 12:38:24
FORTRAN77の問題お願いしてもよろしいですか?
774デフォルトの名無しさん:04/11/09 12:41:34
>>773
マルチは駄目です
775デフォルトの名無しさん:04/11/09 12:47:58
マルチってなんですか?素人なんでまったく知らないんです
776デフォルトの名無しさん:04/11/09 12:49:48
いちいち断らずに質問書けばいいじゃないか。
答えたい人は答えるだろ。
777デフォルトの名無しさん:04/11/09 13:07:30
FORTRAN77でお願いします。
ある数xとyのそれぞれの約数xとyの最大公約数と最小公倍数を計算しなさい

関数副プログラム、サブルーチン副プログラムのどちらかを用いること。
778デフォルトの名無しさん:04/11/09 13:16:10
779デフォルトの名無しさん:04/11/09 13:16:29
>>>777
とあるテキストの演習問題と全く同じ文体ですね。
780デフォルトの名無しさん:04/11/09 13:31:26
マルチではなくて、あっちには間違えてカキコしちゃったんです
781デフォルトの名無しさん:04/11/09 13:35:22
あっちで一言間違ったと書けば何も問題無かったであろうに。
合掌。
782デフォルトの名無しさん:04/11/09 13:37:54
謝罪と保障を要(ry

検索エンジンで調べても答が見付かりそう。
783デフォルトの名無しさん:04/11/09 13:48:31
Fortran70から77になっているぞ。
784デフォルトの名無しさん:04/11/09 17:32:27
fortranでOOPする方法を教えてください
785デフォルトの名無しさん:04/11/09 17:58:20
>>784
http://www.amath.washington.edu/~lf/software/CompCPP_F90SciOOP.html

とか読めば?所詮OOPの真似っこしかできないけど
786デフォルトの名無しさん:04/11/09 18:03:53
>>784
とりあえずモジュール内にprivate属性の変数とサブルーチンを書いておけば、少なくとも
データの隠蔽は実現できます。
787デフォルトの名無しさん:04/11/13 00:18:38
>>784
そして、get_hoge と set_hoge を大量に書けよ!
788デフォルトの名無しさん:04/11/13 09:24:08
>>784
OOP な言語から Fortran を呼びなさいってこった.
789デフォルトの名無しさん:04/11/13 11:39:22
>>784
Fortran 2003 完全準拠のコンパイラを使う。
ftp://ftp.nag.co.uk/sc22wg5/N1551-N1600/N1579.pdf
http://www.fortran.com/fortran/fcd_announce.html

FortranでOOPするつもりはないからよく読んでないけど
Finalization とか Polymorphic entities とか
Deferred bindings とか書いてある。
790デフォルトの名無しさん:04/11/13 13:00:16
Fortran++がいいよ!
791デフォルトの名無しさん:04/11/15 12:31:27
fortranをこれから学ぶ価値ってあるの
792デフォルトの名無しさん:04/11/15 13:56:22
>>791
可能性: 技術的な理由 <<<<<<... (越えられない壁) ...<<<<< 人的な理由

特殊な用途では必要かも知れませんが,そんな時はどうせ特殊なわけで,
fortran をかじった程度の経験では無きに等しいのでしょうね.
というわけで目的なしに学ぶ価値は無しだと思います.

プログラミング全般に言えそうですが > 目的無しに学ぶ
793デフォルトの名無しさん:04/11/15 14:34:21
>>792
私の場合、まさに人的な理由ですね・・・。
・過去の資産がすべてFortran
・プログラミングを教える時間に余裕が無い
・ゼロからコーディングする人がいない
・教授がFortranしか知らない
(なんだか愚痴っぽくなってしまった。)

開発環境がPC/WSの場合で、C/C++に対する決定的な
アドバンテージをどなたか教えてください。
794デフォルトの名無しさん:04/11/15 17:02:49
>>793
別の高級な言語で書いて,単純で計算量の多いところだけ
Fortran や C で書くと,設計がしっかりしていなくても
動くものが早く (not 速く) 作れますよ.

書くのが大変だと作る前からしっかり設計しないとならなくて大変です.
何も作れません.


って,私のスキルの場合です w
795デフォルトの名無しさん:04/11/18 15:55:17
Cよりfortranの方が速いって本当ですか?
どこかにベンチマーク結果とかあるのでしょうか?
796デフォルトの名無しさん:04/11/18 22:40:44
うちのがっこうのぱそこんでつかえるもの
C
Pascal
Fortran
797デフォルトの名無しさん:04/11/18 23:13:48
>>795
それは「自動車より電車の方が速いって本当ですか?」
と聞いているようなもんだぞ。

使用するコンパイラやプログラムなどの前提条件によって
結果が変わってくるから、答えようがない。
798F77:04/11/19 20:47:16
program ...

integer v
real m
v=func(m)
write(*,*) v     ...(1)

stop
end

integer function func(a)
real a
...(途中の処理)...
write(*,*) func     ...(2)
return
end

というプログラムで(1)と(2)の出力が違ってしまいます。
なぜですか?

えろい人おしえてくだちい
799retrun func:04/11/19 21:58:00
じゃないか。
>>798
主プログラムに関数FUNC の宣言がない。
   ↓
頭文字が"F"の関数FUNCは主プログラムでは実数を返す関数と仮定される。
   ↓
「v=funv(m)」で呼ばれた関数FUNCが整数値を返す。
   ↓
主プログラムは戻ってきた値をむりやり実数として読み込む。
(当然、その値はでたらめなものになる)
   ↓
出力が違ってくる(運が良いとエラーになる)
   ↓
(゚д゚)マズー
801デフォルトの名無しさん:04/11/20 07:17:05
すみません、プログラマ板に書いてしまいました。こっちのほうが適切なようなので、こちらに書かせていただきます。

以下のプログラでは、配列Aの部分配列(スライス)をポインタPと結合しています。

このとき、ポインタの添字の下限値 lbound(P)が1、上限値 ubound(P) が 4 になってしまうんだけど、なんとかポインタPの下限値を結合先Aと一致させる方法はありませんか?ポインタの下限値と上限値をそれぞれ 0 と 3にしたいのです。

program main
integer,dimension(0:3,0:3,0:3,0:10),target :: A
integer,dimension(:,:,:),pointer :: P
p => A(:,:,:,2)
print *, lbound(P), ubound(P)
print *, lbound(A), ubound(A)
end program main

添字の偶奇が本質的なコードを書いているので、ポインタ結合で偶奇がズレてしまうのは、致命的なのです。方法がなければ、cppで対応するしかないのですが、cppはバグの温床となるので、なるべく Fortran の機能範囲内で書きたいと思っています。助言ください。

ちなみに、以下のように、配列A全体を結合させると、結合先と添字の下限値が一致しますが、目的はこのようなコードではありません。

program main
integer,dimension(0:3,0:3,0:3),target :: A
integer,dimension(:,:,:),pointer :: P
p => A
print *, lbound(P), ubound(P)
print *, lbound(A), ubound(A)
end program main
802デフォルトの名無しさん:04/11/20 10:06:35
COMMONとDIMENSIONの概要がわからないのですが、
どなたか教えていただけませんか?
803デフォルトの名無しさん:04/11/20 13:24:39
common禁止。module使え
804デフォルトの名無しさん:04/11/20 15:32:02
>>801
事故フォロー。
できたー。関数を2枚ラッパにつかった。
805tsuru:04/11/22 00:03:55
Salford FTN77でプログラムを実行していたところ
途中で

Floating point stack fault at address 〜

という見たことも無い文章がでてきてプログラムが異常終了してしまいました。
今まではちゃんと動いていただけに原因がわかりません。
Googleで調べてみたところ、
はっきりとしたことはわかりませんがメモリーを超過したということなんでしょうか?
どなたか教えて下さい!!
806デフォルトの名無しさん:04/11/22 00:57:10
>>805
それだけの情報じゃよくわからんが、
多分関数の呼び出し側と関数の型があってないんだろう。

今までも「ちゃんと動いてた」んじゃなくて
「たまたま実行時エラーがでなかっただけ」の可能性が高い。

FTN77にはデバッガが付属してるから、それでデバッグしろ。

1./BREAK オプションを付けてコンパイルすると
 コンパイル正常終了後デバッガが起動するので
 「GO」のボタンを押してプログラムを実行する。
 
2.エラーの発生した箇所で止まるので、
 その前後の部分をよく見てデバッグする。
807デフォルトの名無しさん:04/11/22 09:10:20
808デフォルトの名無しさん:04/11/22 17:13:32
integer N, M
parameter(N = 4)
parameter(M = 5)
real a(N, M), pivot, w
integer k ! pivot
integer i ! row
integer j ! column
C
data ((a(i, j), j=1,M), i=1,N)
* /11, 13, 17, 19, 279,
* 23, 29, 31, 37, 547,
* 41, 43, 47, 53, 817,
* 59, 61, 67, 71, 1133 /
C
write(*, *) "多元連立一次方程式の係数行列と右辺"
call matprint(a, n, m)
C
do k = 1, N
pivot=a(k,k)
write(*, *)
write(*, *) "PIVOT:", k, ",", a(k, k)
do j = 1, M
a(k, j) = a(k, j) / pivot
end do
call matprint(a, n, m)
809デフォルトの名無しさん:04/11/22 17:14:04
C
do i = 1, N
if(i /= k) then
w = a(i, k)
do j = 1, M
a(i, j) = a(i, j) - w * a(k, j)
end do
end if
end do
write(*, *)
call matprint(a, n, m)
end do
end
C
subroutine matprint(matrix, n, m)
real matrix(n, m)
integer n, m, i, j
C
do i = 1, n
write(*, 600) (matrix(i, j), j= 1, M)
end do
600 format(1h , 10(G15.7:))
end
810デフォルトの名無しさん:04/11/22 17:15:57
>>808
>>809
のプログラム(808の続きが809です)を次の様に改良せよ。
1.PIVOTが0になると、割り算が出来ないので、
  「0」で割らないようにする。
2.PIVOTより下の要素を計算しないようにせよ。

また、PIVOTがほぼ0(10のマイナス20剰ぐらい)になって
しまう数値の例を試し、正しくプログラムが動くことを確認せよ。
どういう根拠で正しく動いたと言えるのか説明せよ。

という課題が解りません。どのように改良すればいいか教えてください。
宜しくお願いします。
811デフォルトの名無しさん:04/11/22 17:19:49
レポート厨うざい。
812810:04/11/22 17:22:54
ちなみにPIVOTより下の要素を計算しないようにせよ。というのは
a(1,1)
a(2,1),a(2,2)
a(3,1),a(3,2)a(3,3)
a(4,1),a(4,2)a(4,3)a(4,4)  

の値は計算しないようにすると言う意味です。

何方かどうか宜しくお願いします。
813デフォルトの名無しさん:04/11/22 20:05:42
ある意味すごいな。
814デフォルトの名無しさん:04/11/22 23:33:45
>>810
冬休み前の宿題か?

それにしても固定形式なのにF90風の文法を
多用していて中途半端な書き方だな。

ここまでするなら完全に自由形式で書くか
互換性重視でF77準拠の固定形式で書くか
どちらかにした方が良いのに。
815デフォルトの名無しさん:04/11/23 11:47:47
>>814
下手な煽りだな
中途半端な煽りなら止めとけばいいのに
816デフォルトの名無しさん:04/11/23 14:16:28
>>810
奥村先生の「C言語による最新アルゴリズム事典」を参考にすると良いかも。
俺は似たような問題(学校の課題ではないけど)を解くのに
中身のプログラムをそのままFortranに直して使った。
817デフォルトの名無しさん:04/11/25 22:14:12
>>810
Fortranより算数の勉強からはじめてください
818デフォルトの名無しさん:04/11/25 22:17:52
age
819デフォルトの名無しさん:04/11/25 23:05:49
お勧めのコンパイラってなんでしょう?
820デフォルトの名無しさん:04/11/25 23:38:00
821デフォルトの名無しさん:04/11/26 00:49:40
DECというか、Compaqというか、hpというか、x86だとIntelのFortranが使われることが多い。
(買収とかでややこしいことになっていますが、もとはDigitalのFortran)
http://h18009.www1.hp.com/fortran/
822819:04/11/26 07:59:25
>>820,821
ありがとうございます。
>>820
さすがに買えません。
823デフォルトの名無しさん:04/11/27 08:07:46
>>819
何をしたいのか書いてくれないとネタカキコしかできませんよ.
824デフォルトの名無しさん:04/11/30 17:21:14
fortranでメールサーバはかけますか?
825デフォルトの名無しさん:04/11/30 18:10:11
書けないことも無いが、お勧めしない。
826デフォルトの名無しさん:04/11/30 21:27:56
fortranって・・50年も前の言語なの?wwwwww
827デフォルトの名無しさん:04/11/30 21:40:01
>>826
古いものを笑ってはいけない。
FORTRAN は私も笑うけど、Lisp を笑ったらあかん。
828819:04/11/30 22:46:29
>>823
その通りですね、すみません。
昨年研究室で買ったアスロン64FX−51のマシンを
使ってCFDの計算がしたいのです。OSはwindows2000が入ってます。
829デフォルトの名無しさん:04/12/01 03:25:57
>>828
visual F
830デフォルトの名無しさん:04/12/01 10:34:51
FORTRANは古いがFortranは古くない.
そういや最初のLispはFORTRANで書かれたらしい.
831デフォルトの名無しさん:04/12/01 12:15:35
>>830
うそーん。FORTRANで構文解析なんて、いくらS式がparseしやすいっていったって無理だろう。
832デフォルトの名無しさん:04/12/01 12:41:14
C++ beta2005じゃだめなのかぁああああ!visual fortran
833デフォルトの名無しさん:04/12/01 18:26:20
>>831
それが出来るんだよ。
834デフォルトの名無しさん:04/12/01 18:54:46
>>831
比較的最近のやつだけど
「FORTRAN によって実現された会話型LISP システムとその応用」
ttp://www.ipsj.or.jp/members/Journal/Jpn/2304/article002.html

ついでに、Prologも最初はFORTRANで記述されていたようです。
ttp://www.shoeisha.com/book/pc/20c/chap07/gen.htm
835デフォルトの名無しさん:04/12/01 18:59:51
初期のフォートランて、間にスペースがなくても大丈夫だったんだよね。クレージーな言語だとオモタネ
836831:04/12/01 23:41:56
>>833-834
す、すげーぜ…。俺なんかわかりやすいフォーマットの入力データ読むときのFORMATでも右往左往してる。

_| ̄|○
837デフォルトの名無しさん:04/12/02 00:01:12
まあ、昔はどのコンピュータでも汎用的に使える言語が
FORTRANくらいしかなかったからね。
今なら迷わずC言語で書くようなプログラムもFORTRANで
つくってたんだよ。

>>835
最新のコンパイラでも固定形式で書くと
空白を無視したり、73桁目以降を読み捨てたりしてくれる
とってもステキな言語です(泣
838デフォルトの名無しさん:04/12/02 05:21:17
f77とf90の違いを教えてください
839デフォルトの名無しさん:04/12/02 21:41:39
>>837
> 今なら迷わずC言語で書く
今なら C++ で書くのが普通だろ。
840デフォルトの名無しさん:04/12/02 21:47:12
Fortranで書くメリットはデバッグのしやすさが一番かな。
C/C++で書いたときに出る例外エラーはつきとめるのがFortranと比べると遥かにややこしいと思う。
841デフォルトの名無しさん:04/12/02 21:57:59
>>840
Fortran ではデバッグの段階まで書くこともできない私は OTZ

みなさん,どの言語でも同じ期間に完成させられるという
前提に立っているように感じます.
842デフォルトの名無しさん:04/12/03 19:46:54
複素数aの実部と虚部をキーボードから入力し、偏角θを求めるプログラムの作り方を教えて下さい。
おねがいします。
843デフォルトの名無しさん:04/12/03 21:15:37
>>842
read(*,*)ar,ai
write(*,*) atan(ai/ar)
end

バグあり。デバッグは任せる。
844デフォルトの名無しさん:04/12/03 21:53:12
FORTRAN 77, Fortran 90, Fortran 95 の中で、どれを一番勉強すべきでしょうか?
77 と 90 でずいぶん言語仕様が違うようなので選択に困っています。
よろしくお願い致します。
845デフォルトの名無しさん:04/12/03 22:35:51
>>844
Fortran90はFORTRAN77のすべての仕様を含んでいる。
Fortran95はFortran90のほぼすべての仕様を含んでいる。
(一部古い機能が廃止されているが、今となってはほとんど使わない機能ばかりだ)
よってこれから勉強するのなら、Fortran95が良い。

>>838
f90 = 数値計算向けの手続き型言語
f77 = 縄文式スパゲッティ製造器
846デフォルトの名無しさん:04/12/03 22:42:00
全部。
ひとつしかやりたくないんなら、C++とか他のやったほうが良い。
847デフォルトの名無しさん:04/12/03 22:58:17
>>845
ありがとうございます。
大変参考になりました。
848デフォルトの名無しさん:04/12/03 22:58:48
cygwin g77じゃ わけのわからんメモリ関係のエラー?
FTN95じゃstackoverfllow
しっかし・・・visual fortran?なら動く・・・
なぜ?
849デフォルトの名無しさん:04/12/03 23:42:47
>>848
たぶんVisual Fortranでも /check:all オプションを付けてコンパイルすると
実行時エラーがDELL。
850デフォルトの名無しさん:04/12/04 01:22:27
FTN95 コマンドプロンプトからなら動いた・・・
Plato3で作ったexeはoverflowするのに・・・orz
意味わからん・・・orz
851デフォルトの名無しさん:04/12/04 22:37:32
>>850
落ちたところでデバッグしないの?
852デフォルトの名無しさん:04/12/06 00:58:48
こういう場合ってどうなるの?
subroutinの中の話だけど

if (条件) goto 10
 文
 文
 文

10 continue
853デフォルトの名無しさん:04/12/06 01:11:07
条件が満たされてなければ、文文文がただ実行されるだけでは?
854デフォルトの名無しさん:04/12/06 01:18:13
条件がTrueならば?
スルーするってこと?
とんだ先のcontinueには意味ないってこと?
実際には↓みたいになってるからさっぱりわからん(TT)
昔の人はすごいな〜


if (条件) goto10

ごちゃごちゃ

if (条件) goto20

 ごちゃごちゃ

20 continue
ごちゃごちゃ
10 continue
855デフォルトの名無しさん:04/12/06 01:32:17
>>854
if (条件1) go to 10
文1
if (条件) go to 20
文2
20 continue
文3
10 continue

1. 条件1が .TRUE. なら何もしない。
2. 条件1が .FALSE. で
 2-1. 条件2が .TRUE. なら文1、文3の順で実行される。
 2-2. 条件2が .FALSE. なら文1、文2、文3の順で実行される。

> とんだ先のcontinueには意味ないってこと?
入門書読んで出直してこい。
856デフォルトの名無しさん:04/12/06 12:11:18
データの個数をキーボードから入力し、その個数分だけ整数を入力。

入力された整数を1次元配列に格納し、値が小さいものから順に(flagを使って)出力。

というプログラムってどうやって作るんですか?誰か教えてください。
857デフォルトの名無しさん:04/12/06 20:52:59
>>856
Fortranとは関係ない。
プログラミング初心者は素直にアルゴリズムから勉強しろ。
858デフォルトの名無しさん:04/12/07 05:38:15
>>856
program hage
integer :: n, i, a0, a(1073741824), flag
print *, "データの個数を入力しろ."; read *, n
print *, n, "個の整数を小さい順に入力しろ."; read *, a(1:n)
a0 = a(1)
do i = 1, n
flag = a(i)
if (flag < a0) then
print *, "入力データが不正だ!気分が悪いので終了する."
stop
end if
print *, flag
a0 = flag
end do
end program hage
859デフォルトの名無しさん:04/12/08 11:43:29
fortran中級者向けのホームページを教えてください
860デフォルトの名無しさん:04/12/08 20:13:53
8611つめ:04/12/09 17:34:47
数字を入力したら三桁ごとにコンマうつプログラムを作りたいのだけども、
誰かたすけて(例  12,345,678)fortranをつかっています。

character(100) x,z(1:100),v,k,kk
integer y,s,w,i,a,b,amari

write(6,*) '正の整数を入力してください。'
read(5,*) x

k=adjustl(x)
x=adjustr(x)
y=len_trim(k)
if(y<3) then

write(6,*) y
write(6,*) '3桁以内なのでプログラムを終了します。'
else
a=103
b=101
w=y/3
amari=mod(y,3)
kk=k(1:amari)
s=100-y-w+2
8622つめ:04/12/09 17:35:47
do i=1,w

a=a-3
b=b-3
z(i)(b-1:a)=','//x(b:a)
if(i==1)then
v(b-1:100)=z(i)(b-1:a)
else

v(b-1:100)=z(i)//z(i-1)
end if
end do

end if
write(6,*) trim(trim(kk)//trim(v(s:100)))
end

配列の使い方とかおかしいかも知れません。
大分考えましたが解決できないのでお力を貸して頂きたいです。

863デフォルトの名無しさん:04/12/10 07:40:19
>>861
難しく考えすぎだと思います.
文字列をコピーする方法を考えてください (後ろからの方がいいです).
で,3 文字コピーするごとに ',' を入れればいいんじゃないでしょうか.

もっと簡単な方法もあるかも知れませんが.
864デフォルトの名無しさん:04/12/11 08:16:53
>>861
数値を文字列に変換する方法がある。
FORTRAN66のENCODE/DECODE文。
FORTRAN77の内部ファイル。
Fortran90のTRANSFER文。

内部ファイルでのやり方を書いておこう。
CHARACTER*5 buff
....
n = 1
WRITE(buff(1:1), '(i1)') n
WRITE(buff(5:5), '(i1)') 2 * n

こうするとbuff = '1 2' となる。
あとは、>>863の言うように、MOD(n, 10**k) で1桁ずつ切り出して
文字列に書き出して、3文字毎に','を書き出せばよい。

補足:
パソコン、WSでよく使われるASCII CODEを用いた文字−数字変換は、
EBCDICが普通だったメインフレーム、スパコンでは使えなかった。
865デフォルトの名無しさん:04/12/11 14:01:50
>>864
焦点がずれてるよ.
861は最初から文字列で数字を入力させてるんだから,内部ファイルとか関係ないし.
863がいうのはこんな感じかな?

--
program test
implicit none
integer, parameter :: MAX = 100
integer :: i
character(MAX) :: number, sepd_number

print *, '正の整数を入力してください。'
read(*,'(a)') number
number = adjustr(number)
sepd_number = number(MAX-2 : MAX)
do i = MAX-3, 1, -3
if (number(i : i) == ' ') exit
sepd_number = number(i-2 : i) // ',' // sepd_number
end do
print *, sepd_number
end program test
--
866デフォルトの名無しさん:04/12/11 16:20:39
intel fortran compiler for linux 8.1を使って
NCAR Community Atmospheric Model (CAM3.0)を使うとき
gmakeして
undefined reference to `history_mp_fincllonlat_'
というエラーがでたらIFCを最新のversionにかえるとよい。
867デフォルトの名無しさん:04/12/13 18:21:04
real変数に1を代入するとの1.0を代入するのって違うの??
real x
x=1
x=1.0
868デフォルトの名無しさん:04/12/14 11:01:56
結果は同じだが余計な処理が入る可能性がある,かな?
コンパイラのオプションには,「アセンブリコードにする」ものがあるから
双方のアセンブリコードを比較することができます.
でも始めから型に合わせたリテラルを書くのがいいと考えています.

x が double precision なら「x = 1.0d0」と書くなど.
869デフォルトの名無しさん:04/12/14 17:04:48
出力書式fmtの使い方教えてください!
870デフォルトの名無しさん:04/12/14 17:33:11
初心者の質問で申し訳ないのですが
急にFORTRANのプログラムを使わないといけなくなったのですが、どうしたら良いのか分かりません。
どうやらMS-FORTRANで作ったそうで、実行ファイルはあっても動きません。
ソースファイルは残っているのですが、どうすれば良いのでしょうか?
よろしくお願いします。
871デフォルトの名無しさん:04/12/14 19:24:21
Salford FTN77 Personal Edition Compiler

には、組み込み関数は入っていないのでしょうか?
乱数の生成プログラムを書きたいのですが。
872デフォルトの名無しさん:04/12/14 19:51:54
>>870
実行ファイルが動かない原因が判らないなら、ソースをコンパイルしても動かない確率が高いな。
どう動かないのか詳しく書かないと全然分からない。動かないなら、エラーメッセージなんかが出るの?
873デフォルトの名無しさん:04/12/14 20:10:43
>>871
組み込み関数は入ってますが、乱数生成ルーチンはFORTRAN77標準ではありません。
FTN77用の乱数関係の組み込み関数ならUserGuide.pdfの344頁に説明があります。
integer i
double precision a
double precision random
read(*,*) a
call set_seed@(a)
a = random()
C 0.0D0 < a <= 1.0D0
write(*,*) a
call date_time_seed@
do i = 1, 10
a = random()
write(*,*) i, a
end do
end
874デフォルトの名無しさん:04/12/14 20:44:57
>>873
どうもありがとうございます。
もう少し勉強してみます。
875デフォルトの名無しさん:04/12/15 07:33:57
>>869 質問が曖昧すぎるが、外し気味に答えてみるw

write(*, fmt='(a)') 'mako-tan sama'
write(*, '(a)') 'kako-tan sama'
print '(a)', 'aiko-tan sama'

みな同じこと。コンソール出力。

fmt=は省略可。文字列の中身はFORMAT文中に書く物と同じ。
文字列は文字定数である必要はなく、変数であってもよい。
つまり出力データ毎にフォーマットを動的に変えるという荒技も出来るがバグの元。
876デフォルトの名無しさん:04/12/15 08:52:28
>>875
曖昧な質問なのに丁寧にありがとうございました。
877デフォルトの名無しさん:04/12/15 10:41:42
Visual Fortranで3次元の高速フーリエ変換をしようと思っています。
ISMLライブラリを使ってみたのですがどうも結果がうまく出ません。
80*80*80の立方体を変換したいのですが要所だけを以下にコピペします。
結果は全ての座標が0になります。
どこがおかしいのでしょうか?

USE NUMERICAL_LIBRARIES
・・・
CALL FFT3F(80,80,80,GC1,80,80,GC2,80,80)
878デフォルトの名無しさん:04/12/15 13:09:04
サンプル数が2のべき乗に制限されてるとか
単に多すぎるだけとか。
何なら16x16x16 ぐらいで試してみそ。
879デフォルトの名無しさん:04/12/15 22:45:53
最適化のレベルによって計算結果がおかしくなってしまう場合
最適化しても同じ結果になるようにソースを書き換えるのか
最適化しないオプションを指定してこんぱいるするのか、どっちが基本でしょうか。
880デフォルトの名無しさん:04/12/16 02:56:00
最適化したら結果がおかしくなるって・・・・コンパイラのバグじゃんそれ。
881デフォルトの名無しさん:04/12/16 05:02:06
>>877
それだけでは要所にならない。せめて使用配列の宣言部が必要だ。
FORTRAN77だと、型のチェックと整合配列のチェックを人間がやらないといけないからだ。

一般論だが、外部ライブラリでうまくいかない場合。
1.イニシャライズのし忘れ。(配列のクリア。イニシャライズルーチンの呼び忘れ。等)
2.配列の型、サイズを間違えている。
というパターンが、多い。

今回のチェックポイントは
0.GC1、GC2は単精度複素行列になってるか?
1.GC1、GC2の大きさが、呼び出し時の引数と矛盾していないか?
2.変換前のGC1に値がちゃんと入っているか?
   (呼び出しは正しいが、0しか入ってないと、当然GC2は0だ)

>>878 の意見に関してだが、
IMSLのマニュアルを見る限り、配列サイズが2のべきである必要はないようだ。
まず小さいマトリクスで試してみよという意見には賛成だ。
882デフォルトの名無しさん:04/12/16 05:08:28
>>881
さすがは糞言語だ。
883デフォルトの名無しさん:04/12/16 09:42:24
>>880
intel fortran compiler 8.1なんですけどね。
CPUもintelのXEON使ってます。
884デフォルトの名無しさん:04/12/16 11:50:17
FORTRANでの変数の型のキャストについて質問させてください。
現在、ソース中で、

A(B+C) = D

となっている部分があります。A(*)は配列です。
コンパイルしますと、
"A has non-integer subscript" と表示されます。
添え字の(B+C)が整数だと認識されていないようですので、
(B+C)を整数にキャストしたいのですが、その方法を見つけることが出来ませんでした。
とりあえず、勘に頼って

A(int(B+C)) = D

としたところ、エラーは出なくなったのですが、
コンパイラのマニュアルやFORTRAN入門書をみても、web検索をしてもint(*)という関数がみつからず、
これでいいものかどうか悩んでおります。
BおよびCの変数宣言をINTEGERを用いて行うのも1つの方法かと思われるのですが、
ソースが自分のものではないため、出来る限り問題のある箇所以外は触らないようにしたいと考えております。
利用コンパイラはSalfordのFTN77です。
よろしくお願いいたします。
885デフォルトの名無しさん:04/12/16 12:08:36
基礎的Fortran文法のまとめ
http://wwwst.sc.musashi-tech.ac.jp/~bulletin/fort77.htm
【13】組込関数
整数型へ変換 INT(X) 整,実,倍,複 → 整
886デフォルトの名無しさん:04/12/16 12:12:56
暗黙の型
 明示的に型宣言をしない場合,下記の約束がまもられる.Fortranの特徴の1つである.

I, J, K, L, M, N で始まる変数は 整数型 と解釈される.
 例 IJ, NO, JX, KOSU

A〜H, O〜Z で始まる変数は実数型
 例 ATOM, XCORD, COORD, MAX
887884:04/12/16 12:26:33
>885,886

ありがとうございます。
おかげさまで解決いたしました。
888デフォルトの名無しさん:04/12/16 12:50:25
はじめまして。どうしても分からないのが2つ。
1+2+3+4+5+6+7+8*9=100のように、1,2,...,9の9つの数字の間に
+−×÷の記号を1つずついれて、計算結果が100になるような算術式を全て求めよ。
ただし、除算はFORTRANの整数除算ではなく、通常の算術計算であるとする。
という問題と、
n×nの実数正方行列A={a(i,j)}の行列式|A|を、再起手続きを使って求めよ。
Aの第1行第j列を抜いた残りの部分行列をA'(j)とするとき、行列式|A|は、
|A|=a(1,1)|A'(1)|-a(1,2)|A'(2)|+a(1,3)|A'(3)|...
=破=1〜n a(1,j)|A'(j)|*(-1)**(j+1)
で与えられる。ただし、1行1列の行列{a}の行列式は要素aそのものである。
という問題の2つなのです。助けてくださいm(- -)mお願いします。
889デフォルトの名無しさん:04/12/16 15:09:02
とりあえず何が分からないのかを考えてみよう.
おそらく,何が分からなくてできないのかがわかってないみたいだから.

単に宿題の丸投げなら誰も助けてくれないだろうけどね.
890デフォルトの名無しさん:04/12/16 15:46:38
最初の問題だと、+とか÷などの記号は文字配列だとその意味をなさないので、
どうすればいいのかいきなり詰まっています。
891デフォルトの名無しさん:04/12/16 17:45:55
>>888
Fortran90だと再帰呼び出しが使えるが、FORTRAN77だと使えない。
どちらが対象かで難易度がずいぶん変わってくる。特に2番目。
どっちかな?
892デフォルトの名無しさん:04/12/17 00:34:37
>>890
じゃあ,記号の意味をFortranに教えればいいよね.
893877:04/12/17 05:57:08
だめです。
16*16*16でやってみましたが結果は全部0になります。
変数は全て正しい型で宣言しています。
少しいじくって2次元のFFTではうまくいったんですがお手上げです。
便乗質問ですが、
今回の3次元FFTはそれ自体が目的ではなく他の計算の確認のためです。
3次元の立方体で特定方向に各配列の要素の和をとって2次元配列を作ります。
その2次元配列をフーリエ変換しフーリエスペクトル(実数部の二乗と虚数部の二乗の和)を求めます。
数学に疎いのでよく分かりませんがスペクトルのイメージは上下左右対称のはずらしいですが
私の作ったコードでは正確に対称にはなりません。
3次元FFTはコードが正しいかどうかの確認のためです。
しかし、私は任意のイメージのフーリエスペクトルが対称型になることがいまだに理解できないのですがどうなのでしょうか?
894デフォルトの名無しさん:04/12/17 08:44:00
フリーのVisual C++を使おうとしているWinプログラマ初心者です。 あるソースを
落としてきてビルドしようとしているのですが、途中でNMAKEが以下のエラーを
吐きました。
NMAKE : fatal error U1071: cycle in dependency tree for target 'c:\Documents'

ファイルはC:\Documents and Setting\washi\..... の下に置いているのですが、
ファイルパス名に空白が入っているのをNMAKEがチョチョギっているような
気がします。 どう対処したらよいのでしょうか? 
8951/2:04/12/17 09:17:59
>>890 参考にしてちょ!
MODULE mod_eval
IMPLICIT NONE
INTEGER :: inum(5) = (/1,2,3,4,5/)
CHARACTER :: ops(5) = (/ '*', '+', '-', '/', '='/)
CONTAINS
SUBROUTINE eval(res, op_next)
IMPLICIT NONE
REAL , INTENT(OUT) :: res
CHARACTER, INTENT(OUT) :: op_next
INTEGER, SAVE :: ipos = 1
res = REAL(inum(ipos))
DO
SELECT CASE (ops(ipos))
CASE ('+', '-', '=')
op_next = ops(ipos)
ipos = ipos + 1
EXIT
CASE ('*')
ipos = ipos + 1
res = res * REAL(inum(ipos))
CASE ('/')
ipos = ipos + 1
res = res / REAL(inum(ipos))
CASE DEFAULT
PRINT *, 'ipos=', ipos, ' op=', ops(ipos)
STOP 'eval'
END SELECT
END DO
RETURN
END SUBROUTINE eval
END MODULE mod_eval
8962/2:04/12/17 09:19:21
!==================================================
PROGRAM main
USE mod_eval
IMPLICIT NONE
INTEGER :: inum(5)
REAL :: sum, tmp
CHARACTER :: op, ops(5)
sum = 0.0
op = '+'
DO
SELECT CASE (op)
CASE ('+')
CALL eval(tmp, op)
sum = sum + tmp
CASE ('-')
CALL eval(tmp, op)
sum = sum - tmp
CASE ('=')
EXIT
CASE DEFAULT
PRINT *, 'op=', op
STOP 'main'
END SELECT
END DO
PRINT *, 'value =', sum
STOP
END PROGRAM main

インデント死んだw >>895,896
897デフォルトの名無しさん:04/12/17 11:11:02
>>893 これで試して味噌。 
PROGRAM test
USE NUMERICAL_LIBRARIES
IMPLICIT NONE
INTEGER :: i, j, k
REAL :: pi
COMPLEX :: gc1(8, 8, 8), gc2(8, 8, 8)
pi = 4.0 * ATAN(1.0)
gc1(1:3, 1:3, 1:3) = (1.0, 1.0) / REAL(3**3)
CALL FFT3F(3, 3, 3, gc1, 8, 8, gc2, 8, 8)
print *, gc2(1, 1, 1)
!
DO i = 1, 6
gc1(i, :, :) = EXP( CMPLX(0.0, 2.0 * pi * REAL(i - 1) / 6.0 ) ) / REAL(6**3)
END DO
CALL FFT3F(6, 6, 6, gc1, 8, 8, gc2, 8, 8)
print *, gc2(2, 1, 1)
END PROGRAM test

最初のFFTはδ関数を出すので、gc2(1,1,1)に1が立つ。
2個目のFFTは、x軸方向にのみexp(i2π(k−1)/N)の変化があるのでgc(2,1,1)に(1.0,0.0)が立つ。

出力例:
(1.000000,1.000000)
(1.000000,3.8894690E-08)
これ以外は0になる。E-7~E-8 のオーダーの数は単精度の誤差で0とおなじ。

対称になるのは、折り返しとかの事情だろう。行列要素は実onlyかな?
898デフォルトの名無しさん :04/12/17 13:36:06
2問を書き込んだ者です。
FORTRAN90を使っています。
記号の意味をFortranに教える、というのは、どういうことなのでしょうか?
a(4) = (/ '*', '+', '-', '/'/)で、
a(1) = * のようなことではダメですよね。
文字を計算式に使うと変なことになってしまいますし、
お手上げの現状なのですが...
899デフォルトの名無しさん:04/12/17 14:41:51
>>898
>記号の意味をFortranに教える、というのは、どういうことなのでしょうか?
その書き込みは無視したほうがいいw

CHARACTER :: a(4)
a(1) = '*'
なら文法にかなっている。

900884:04/12/17 15:00:19
昨日、型変換について質問させていただいたものです。
もう一点、お聞きしたいことがあるのですがよろしいでしょうか。

比較演算子に関してなのですが、現在、

IF (A . NE . B) THEN

と記述されている箇所がありまして、コンパイルを行いますと、
"The use of .EQ. or .NE. with non-integer operands can produce misleading results"
と表示されます。コンパイラはSalford FTN77です。
論理素子AとBが整数型でないことが原因だと思われ、ソースを

IF (int(A) . NE . int(B)) THEN

と改変するとエラーは消えます。
ただ、実際にはAやBが実数で、その値を比較している場合もあると思われ、
勝手に整数にまるめても良いものか、悩んでいます。
FORTRANでは.NE.および.EQ.で比較する場合、その値は整数で無ければならないという決まりがあるのでしょうか?
参考書やweb等で調べた限りでは、そのような約束事はみつかりませんでした。
何度も申し訳ありませんが、もしよろしければお教えくださいますか。
お願いします。
901デフォルトの名無しさん:04/12/17 16:01:50
>>900
結論から言うと、INT型にはしないほうがいい。変にいじらないほうがいい。
それは、エラーではなくウォーニングだろう。コンパイラによっては、この種の警告を与える。

浮動小数点の実数の場合、イコールを取る意味が曖昧なので注意しろと言ってる。
その辺の事情が分かった上でイコールを取るなら問題ない。
移植しているのならば、とりあえずプログラムを書いた奴を信じるしかないw
これはFORTRANに限らず、浮動小数点一般の問題だ。

”その辺の事情”を知りたいなら、桁落ちとかで検索して浮動小数点の誤差について調べてみるとよい。
たぶん実数ではイコールを取る意味が無いとか色々書いてあるはずだ。
902デフォルトの名無しさん:04/12/17 16:06:19
>>900
a = 0.0
do j=1,10
a = a + 0.1
do i=1,10
b = i * 0.1
if (a .eq. b) then
write(*,*) a, ' = ', b
else
write(*,*) a, ' <> ', b
end if
end do
end do
end
903あるのかな?:04/12/17 17:22:56
プログラムの実行時間を測定したいときはどういう関数を使えばいいの?
904デフォルトの名無しさん:04/12/17 17:41:19
>>903
Fortran95から CPU_TIME という関数が用意されている。
大概のFortran90コンパイラでは、規格先取りで採用されている。
これ以外にはDATE_AND_TIMEという時計サブルーチンが存在している。これは90の正式規格。

FORTRAN77時代は、FORTRANの規格としては時間がらみの関数・サブルーチンは存在しない。
しかし、各ベンダーが用意した固有のルーチンが大抵用意されている。
マニュアルのお終いの方の非標準関数のあたりをあさってミソクソテクニック。
905903:04/12/17 18:01:39
現時刻を得る関数もあるのかな?
プログラムはC言語から始めたので何とも使い勝手が悪く感じるんだが,
気のせい?
906デフォルトの名無しさん:04/12/17 18:18:25
>>905
気のせいではない。計算速度の速さを除いては、糞言語ですから。
907デフォルトの名無しさん:04/12/17 18:43:26
>>905
サブルーチン DATE_AND_TIME
西暦と時刻を返す。

FORTRANはバッチ処理で実行されることが多い。
TSS処理が前提のC言語とは歴史的な事情が違っている。
908884:04/12/17 19:59:19
>901

そうです、ウォーニングでした。
なるほど、実数だと厳密にイコールであるという意味が曖昧なのですね。
感覚的にですが、なんとなくわかる気がします。
非常に勉強になります、ありがとうございました。


昨日から色々と作業しておりましたが、
皆様のおかげで先程なんとか希望の結果が得られるプログラムができました。
どうもありがとうございました。
909デフォルトの名無しさん:04/12/17 23:32:26
#include <stdio.h>
void main() {
FILE *fp_in, *fp_out;
int gen, kob, average;
int n;
fp_in = fopen("seiseki.txt", "r");
if( fp_in == NULL ) {
printf("Can't open 'seiseki.txt'\n");
return;
}
fp_out = fopen("kekka.txt", "w");
if( fp_out == NULL ) {
printf("Can't open 'kekka.txt'\n");
fclose(fp_in);
return;
}
910909の続き:04/12/17 23:33:23
         for(;;) {
n = fscanf(fp_in, "%d%d", &gen, &kob);
if(n != 2) {
if(n != EOF) {
printf("fscanf error.\n");
}
break;
}
average = (int)(
( (float)(gen + kob) / 2.0 )
+ 0.5
);
n = fprintf(fp_out, "%d %d %d\n", gen, kob, average);
if(n < 0) {
printf("fprintf error.\n");
break;
}
}
fclose(fp_in);
fclose(fp_out);
}
プログラム1で現国と古文の点数を入力し、プログラム2でその平均点を出力するという問題を解きたいんですが、
FORTARNでのプログラム2がどうにもうまくいきません。
何方か上記のCのプログラムをFORTARNに翻訳して下さい。
どうかよろしくお願いします。
911デフォルトの名無しさん:04/12/18 00:24:01
エクセルでやれ。
912デフォルトの名無しさん:04/12/18 00:48:50
913デフォルトの名無しさん:04/12/18 01:25:56
>>903
system_clockっていうサブルーチンがなかったけ?
intelとpgiにはあるけど規格外かな.
914デフォルトの名無しさん:04/12/18 05:20:03
>>913
あります。Fortran90の規格です。
でも、CPU消費時間ではなく、ある原点からの積算の秒数を返していたと思います。

ずーーーと1,2,3・・・・と指折りしながら数えてる律儀なサブルーチンさん!
915909:04/12/18 11:38:50
>>912

すいません。どれをダウンロードしてどう使えばいいか解らないです・・・。
教えてください。
916デフォルトの名無しさん:04/12/18 12:37:49
>>915
c2f.zipだけでいいだろ。
で、cというフォルダにdebug.cを、fというフォルダにc2f.fdとc2f.fiとc2f_lib.f90を
入れる。
c2f.exeを起動し、debug[enter]と押すと、debug.cがfフォルダにdebug.f90という
名前で生成される。

で、>>909>>910のプログラムを翻訳してみたが、fscanf()とfprintf()がうまく翻訳
されなかった。どうも一文字単位の入出力しか現在の所サポートしていないようなので、
その部分は手でちまちまとエディットするしかない。

あと、FORTRAN90のソースになるので、FORTRAN77に変える場合は、他の翻訳
プログラムを探そう。探してないが、さすがにあるだろう。
917デフォルトの名無しさん:04/12/18 14:13:29
質問です。
一つのファイルの中にデータが複数個あり、(例えば、"DATA.TXT"というファイルの中に、1,2,2,4,3,3,1,1,4,3,2,1という12個のデータが入っている)
それらを読み込み、データの数字ごとのファイル(ファイル名=データの数字)をプログラム中で新たに作り、
それぞれのデータを該当番号のファイルの中に出力する(仕分けする)というものです。
(例では、"1"は"1.TXT"というファイルを作り、そこへ出力し、結果、"1.TXT"の中には"1"が4つ入っている。"2.TXT"には"2"が3つ。他同様。)
GO TO文は使わず、DOループとIF文のみで作りたいと考えています。
当方プログラム初心者でして、また、ファイル中のデータ量が多い(10万個)ため、苦戦しています。
初歩的な質問で申し訳ありません。宜しくお願いします。
918デフォルトの名無しさん:04/12/18 14:58:48
>>917
そういう処理ならawkなんかのスクリプトでやった方が
手っ取り早いと思うけど。

BEGIN { FS = ","; max = -1 }
{
for (i=1; i<=NF; i++) {
data[$i]++
if ($i > max) max = $i
}
}
END {
for (i=1; i<=max; i++) {
if (data[i] != 0) print data[i] > i ".TXT"
}
}
919909:04/12/18 15:15:24
>>916

おかげで何とか完成できました。
丁寧な解説有難う御座います。
920デフォルトの名無しさん:04/12/18 15:21:09
>>918
ありがとうございます。
しかし、残念ながらFORTRNしか分からないものでして・・・
せっかく教えていただいたものも、理解できない状況です。
申し訳ありません。宜しくお願いします。
921デフォルトの名無しさん:04/12/18 18:07:59
>>920
Fortran が使えて awk が使えない人はいないから,
とりあえず使い方を調べてみませう.
Fortran を捨てたくなるかもね.
awk で扱うのが自然な問題は awk でやるのが一番楽です.
922デフォルトの名無しさん:04/12/19 23:07:24
宿題は他にないのか?
923デフォルトの名無しさん:04/12/20 00:44:24
>>917
そのDATA.TXTの中身がどういう書式で書かれているかで
書き方がずいぶん変わってくるかと。行ごとに1個の数字しか
書いてなければ話は簡単だとは思いますが・・・。

PROGRAM test
  IMPLICIT NONE

  CHARACTER(len=260) :: infile = "DATA.TXT"
  CHARACTER(len=260) :: outfile
  CHARACTER(len=16) :: cnum
  INTEGER :: ios

  OPEN(1,FILE=infile,STATUS="old",iostat=ios)
  IF(ios /= 0) STOP

  DO
    READ(1,*,iostat=ios) cnum
    IF(ios /= 0) EXIT
    WRITE(outfile,*) cnum(1:LEN_TRIM(cnum)) // ".txt"
    OPEN(2,FILE=outfile,POSITION="append")
    WRITE(2,*) cnum(1:LEN_TRIM(cnum))
    CLOSE(2)
  END DO

  CLOSE(1)

END PROGRAM test
924デフォルトの名無しさん:04/12/20 22:09:44
学生さんはもう冬休みか。 いいねぇ。
925デフォルトの名無しさん:04/12/20 22:11:00
あんたも昔は学生だっただろ
926デフォルトの名無しさん:04/12/20 22:12:13
てすと
927デフォルトの名無しさん:04/12/21 04:26:14
マターリいこうや、ロートル諸君!
928KG:04/12/21 10:28:59
Matlabのmファイルをfortranのソースファイルに変換するツールをご存じの方が
いらっしゃれば教えて下さい。
929デフォルトの名無しさん:04/12/21 12:37:25
google ですぐに見つかるやつは違うの?
930KG:04/12/21 18:15:55
googleで見つかるやつは,まだツールが公開されていないそうで...
931fortran:04/12/23 22:47:57
エラーについて質問させてください><
forrtl:error (75): floating point exception
0: __FINI_00_remove_gp_range[0x3ff81a6de38]



実行するとこのようなエラーが出てしまうのですが・・・
0で除算していることは決してないのでオーバーフローなのかあぁ・・・
932デフォルトの名無しさん:04/12/23 23:35:42
>>931
OSやコンパイラの種類もわからない
何をしようとしていたのか、ソースもない
そんな状態で何を答えろと?
933デフォルトの名無しさん:04/12/24 00:47:30
>>932
禿同
まぁ、あとは、sqrt(a)やa**3でa<0とか、
934デフォルトの名無しさん:04/12/24 07:48:59
>>931よ、お前が聞いているのはこの質問と同じかな?
ググルといっぱい出てくる。
http://www.google.co.jp/search?sourceid=navclient&ie=UTF-8&rls=GGLD,GGLD:2004-15,GGLD:en&q=forrtl%3Aerror+%2875%29%3A+floating+point+exception

答えはないようだが、雰囲気的にはコンパイラーのバグだろう。



http://www.cpmd.org/pipermail/cpmd-list/2002-November/000481.html

forrtl: error (75): floating point exception
0: __FINI_00_remove_gp_range [0x3ff81a6de38]
1: __FINI_00_remove_gp_range [0x3ff81a76e60]
2: __FINI_00_remove_gp_range [0x3ff800d5120]
3: cnstfc_ [./cnstfc.f: 118, 0x1201cb028]
4: detdof_ [./detdof.f: 191, 0x1201c9b10]
5: mdmain_ [./mdmain.f: 119, 0x1201daa00]
6: mdpt_ [./mdpt.f: 124, 0x1201d9ff0]
7: cpmd_ [./cpmd.f: 120, 0x12003dac4]
8: cpmd_stuttgart_ [./cpmd.f: 3, 0x12003d590]
9: main [for_main.c: 203, 0x1203fc66c]
10: __start [0x12003d3b8]
time: command terminated abnormally.

935877:04/12/26 00:29:47
すいません。うえの方でFFTについて聞いたものです。
>>897さんのコードはうまく動くのですが自分のコードは全部0になります。
元のコードから編集したのをコピペするので見てもらえないでしょうか?

USE NUMERICAL_LIBRARIES

INTEGER N
INTEGER G(16,16,16)
INTEGER I, J, K
REAL GRI(16,16,16)
CHARACTER FILENAME*15

101 FORMAT(16E16.8)

N=16

DO K=1,N
DO J=1,N
DO I=1,N
IF(MOD(I,2)==1.AND.MOD(J,2)==1.AND.MOD(K,2)==1)THEN
G(I,J,K)=1
ELSE
G(I,J,K)=0
END IF
END DO
END DO
END DO
936877:04/12/26 00:30:11
CALL FOU100(N,G,GRI)

DO I=1,N
WRITE(FILENAME,*)INT(I)
FILENAME=TRIM(ADJUSTL(FILENAME))//'.dat'
OPEN(8,FILE=FILENAME)
DO J=1,N
WRITE(8,101)(GRI(I,J,K),K=1,N)
END DO
CLOSE(8)
END DO

END
937877:04/12/26 00:30:31
SUBROUTINE FOU100(N,G,GRI)
!
INTEGER G(N,N,N)
INTEGER I, J, K
REAL GRI(N,N,N), GG(N,N,N)
REAL*8 ABC1,ABC2
COMPLEX GC1(N,N,N), GC2(N,N,N)
!
DO I=1,N
DO J=1,N
DO K=1,N
GG(I,J,K)=G(I,J,K)
IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5
GC1=CMPLX(GG(I,J,K),0.0)
END DO
END DO
END DO

CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)
938877:04/12/26 00:31:16
DO K=1,N
DO J=1,N
DO I=1,N
ABC1=REAL(GC2(I,J,K))
ABC2=AIMAG(GC2(I,J,K))
GRI(I,J,K)=(ABC1**2+ABC2**2)
END DO
END DO
END DO
!
RETURN
END
939デフォルトの名無しさん:04/12/26 03:16:09
これ新手の荒らしだな。
どっかのアップローダにアップしろよ。
940デフォルトの名無しさん:04/12/26 09:05:44
精度統一しようよ
941デフォルトの名無しさん:04/12/26 09:27:09
>>937
DO I=1,N; DO J=1,N; DO K=1,N

! 整数G(I,J,K)を実数GG(I,J,K)に入れる
GG(I,J,K)=G(I,J,K)

! G(I,J,K)は0か1なのに、-1だったら、GG(I,J,K)に0.5を入れる。
IF(G(I,J,K).EQ.-1) GG(I,J,K)=0.5

! GC1のすべての値をGG(I,J,K)+0.0iにする。
GC1=CMPLX(GG(I,J,K),0.0)

END DO; END DO; END DO

! GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0iをFFTにかける。
CALL FFT3F(N,N,N,GC1,N,N,GC2,N,N)

DO K=1,N; DO J=1,N; DO I=1,N

! なぜかABC1,2だけ倍精度
ABC1=REAL(GC2(I,J,K))
ABC2=AIMAG(GC2(I,J,K))
GRI(I,J,K)=(ABC1**2+ABC2**2)

END DO; END DO; END DO
942935:04/12/26 15:41:47
>>939
長くなってすいません。

>>941
前任者からもらったコードを改造して、さらにここに貼るときにいろいろ
はしょったので変なところが多いかもしれません。

>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
がなぜだが分からないのですが教えていただけないでしょうか?
943デフォルトの名無しさん:04/12/26 22:52:25
>>942
>>GC1(:,:,:)=GG(N,N,N)+0.0i=0.0+0.0i
>がなぜだが分からないのですが教えていただけないでしょうか?

>>937のループの最後で
GC1=CMPLX(GG(I,J,K),0.0)

GC1=CMPLX(GG(N,N,N),0.0)
になるからだろ。
944デフォルトの名無しさん:04/12/26 23:42:14
FORTRAN90勉強するためによい参考書があったら、教えてください
入門と専門書の中間くらいのものがあれば、助かるのですが。。。。
主に科学計算に使います。
945デフォルトの名無しさん:04/12/27 00:32:04
過去の遺産をのぞいた場合fortranを科学技術計算に使用するアドバンテージって何かあるんでしょうか。
946デフォルトの名無しさん:04/12/27 00:42:18
他の言語に比べて計算が早い。
私の御師匠さんも以前はC言語で書いていておられたが
Fで書いてみると20%近く早くなったっていってた。

947デフォルトの名無しさん:04/12/27 00:44:44
>>946
そんなばかな
948デフォルトの名無しさん:04/12/27 00:52:49
>>945
Fortran90以降なら配列演算
FORTRAN77以前は・・・ないな
949935:04/12/27 14:13:36
>>943
ありがとうございます。
OTL・・・
950奈菜氏:04/12/27 16:25:51
FORTRAN77でニュートン法でこれを解けって、宿題が出ました。
助けてください・・・・2(X*X)−5X−3=0です。
とても、おっ馬鹿なんで・・・

951デフォルトの名無しさん:04/12/28 00:01:12
>>950

FORTRAN 以前の問題。ここで聞くことではないと思うのだけど。
952デフォルトの名無しさん:04/12/28 01:33:16
>>950
正直、氏んだ方がいいですね。
953897:04/12/28 12:07:28
>>935
すでに >>941 が指摘しているように
GC1=CMPLX(GG(I,J,K),0.0)
が原因ですね。本来GC1(I,J,K)=CMPLX(GG(I,J,K),0.0)

Fortran90は配列操作に長けているので、

WHERE (iG == -1 )
GG = 0.5
ELSEWHERE
GG = REAL(iG)
ENDWHERE
GC1 = CMPLX( GG, 0.0 )

の様に書けば意味が明解になります。
(iG は型を明確にするために、Gを直してあります。)


今回の事とは直接に関係しませんが、変数名の命名に関しては、
暗黙の型宣言に忠実であることが望ましいです。
これは、たとえFORTRAN90でIMPLICIT NONEをかけても言えることです。
その理由は2つあります。
1.いちいち変数の定義部まで型を調べに戻る必要がない。
2.FORTRAN中・上級者は型を守らないような人を相手にしたがらない。

他言語出身者が『暗黙の型宣言なんかシラネ、宣言すればいいだけのことだろが!』
と言うことがありますが、それは2chで『”がいしゅつ”は既出と読むんだ。日本語知らないのか!』
と言う様なものに当たります。ネタにマジレスな人が2chでスルーされるように、
FORTRAN界ではその内部の伝統を守らないものはスルーされてしまいます。
954デフォルトの名無しさん:04/12/28 17:48:54
3つのプログラムをおしえてください。

1、ガンマ乱数の生成プログラム

2、面積等分割のプログラム

3、適合度検定のプログラム
955デフォルトの名無しさん:04/12/28 22:56:05
956デフォルトの名無しさん:04/12/28 23:32:01
fortran90を使って、外部のファイルから1行づつ値を読み込むのってどうしたらいいのでしょう。

a1 b1 c1
a2 b2 c2
a3 b3 c3
...以下続く
みたいなファイルがあって、そこから
まず一行目のa1とb1とc1だけを使って計算した結果を出力して、
次に二行目のa2とb2とc2だけを使って計算した結果を出力して…というのをひたすら繰り返したいのですが。

超素人質問ですいません。
よろしくお願いします。
957デフォルトの名無しさん:04/12/28 23:59:03
doループでread文をぶん回せ。
958デフォルトの名無しさん:04/12/29 00:18:04
ループでぶん回すとき、一行づつ読み込め見たいな命令っていらないのですか?
do i=1,N
read(*,*) a, b, c
end do
としとくと(文法自信ないですが。)i=1で最初の3つ(a1,b1,c1)を読み込んだら、
i=2の時は勝手にその次の3つ(a2,b2,c2)を読み込んでくれるのでしょうか??

ってか、自分で試してみればいいわけですね。
やってみます。
959デフォルトの名無しさん:04/12/29 00:20:48
LAPACKの質問はここでOK?
960デフォルトの名無しさん:04/12/29 01:11:49
>953
そのFortran中上級者と思っている人間にかぎって、
スパゲティなソースを量産しているFortranの現状。
全部が全部といいませんが。
961デフォルトの名無しさん:04/12/29 10:00:17
>>960
そりゃしょうがないよ。
スパゲッティーが良くないとは、ALGOL、PASCALの時代から計算機学科の人々が言い続けてきたが
実際問題としてFORTRAN90以前は言語の特質として、原理的にスパゲッティーでないプログラムを
書くことは不可能だったんだから。

そもそも、FORTRAN界にはスパゲッティーなプログラムが良くないという価値観は存在しない。
自分で書いて、自分で使う、他人が使うことは想定しない、という古い時代の価値が保たれていて、
プログラムそれ自体が完成価値を持つという、計算機学科系の価値観とは深淵の隔たりがあるもの。
962デフォルトの名無しさん:04/12/29 12:31:43
>>961
fortran コードを吐く fortran みたいなアプローチがあればいいんですよね.
インラインをうまく制御できたり強力なマクロがあったりという感じで,
計算コストを上げずに可読性を良くできる仕組みがあれば.

1, 2 文字の変数名が良く使われるのは,
紙に書いてある数式を写したからじゃないでしょうか.
下付き文字やギリシア文字がうまく書ければ
1, 2 文字に固執されないと思います.

TeX の数式がそのまま貼れて,しかも計算コストを考えて式変形してくれたら
いいですよね.maxima にあったような気もしますが,
これを言語仕様に含めたり.
963デフォルトの名無しさん:04/12/29 15:10:10
ratfor使えばFORTAN77でもある程度スパゲッチィなソースに
なるのは避けられるけれど、
FOATRAN中上級者はratforを使うのは邪道だと思っているような希ガス。

ちなみに漏れも暗黙の型宣言に忠実じゃない香具師(´・ω・`)
964デフォルトの名無しさん:04/12/30 04:09:30
いやな時間に目が覚めた。

Fortran77で、
暗黙の型宣言を守り、IMPLICIT NONE。
COMMONはクリティカルなデータのみで、直交性を考えてやる。
GO TO 文はbreak用途のみに使う。
DO~END DOを使い、DO ~ CONTINUE は使わない。
WHILE文は使う。
無駄なFORMAT宣言は避ける。(WHITE(6,'(A)'
プリプロセッサも使う。
分岐が多くなってきたら、コメント付けで意図を明確に。

これやるだけで、かなり可読性が増すと思うんです。
私の指針ですが。

逆にこういう気遣いができないFortran使いは許せぬ。
その、ぐちゃぐちゃした物を動かんからデバッグしてといわれても。
良く読んで、理解しろといわれても。
・゚・(ノД`)・゚・。
965デフォルトの名無しさん:04/12/30 04:14:44
>無駄なFORMAT宣言は避ける。(WHITE(6,'(A,3F8.3)'))
966デフォルトの名無しさん:04/12/31 02:52:41
90を使い,module文で2次元の定数配列を宣言したい.

integer,dimension(2,2) :: IAA = (/ 1,2,3,4 /)じゃだめなの?

967デフォルトの名無しさん:04/12/31 10:41:23
>>966
Fortran90 の場合、多次元配列は

integer, dimension(2,2) :: IAA = reshape((/ 1,2,3,4 /), shape(IAA))

のように reshape を使う。
この場合、
IAA(1,1) = 1
IAA(2,1) = 2
IAA(1,2) = 3
IAA(2,2) = 4
のように列順であることに注意。
968デフォルトの名無しさん
>>967
できました.
reshapeってのがあるんですね.
早速の回答 thxでした.
気持ちよく新年を迎えられそうです.