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


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

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



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

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


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

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


673 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 00:56:22 ]
>>672
それは
「csv(テキスト)で保存するとExcelの計算式やセルの装飾などの情報が失われるよ」
という警告だがら、関係ない。

674 名前:667 [2007/06/28(木) 12:04:28 ]
コピペするとタブ区切りで持っていくはずだけどね

675 名前:657 [2007/06/28(木) 12:33:54 ]
メッセージのxx.f:342は、342行目ということだったんですね。

342,343行目は、
STOP
END
なんですが。。

676 名前:661 [2007/06/28(木) 14:39:50 ]
だから前後て書いてるでしょ

サブルーチンあるのか?配列の引渡しは、うまくやってるか?

677 名前:672 [2007/06/28(木) 14:56:13 ]
>>671
やはり、
was detected (unit=10).id decimal character
(the relative position causing an error in a record = 13 )
3,1.427,0.747
?
error occurs at MAIN__ line 15 loc 000106ec offset 00000044
MAIN__ at loc 000106a8 called from o.s.
taken to (standard) corrective action, execution continuing.
というエラーになります。
プログラムは
implicit none
integer,parameter :: imax=24,jmax=4,iimax=3,ijmax=40
real(8),dimension(imax,jmax) :: N,L,M
real,dimension(24,4) :: X
integer,dimension(24,4) :: K
real,dimension(iimax,ijmax) :: A
real(8),dimension(3,40) :: B
real :: f
real(8) :: lambda,omega
integer :: i,j,ii,ij

open(10,file='danmenseki.csv',status='old') !表1.1を読み込む
do ii=1,iimax
read(10,*) (A(ii,ij),ij=1,ijmax)
end do
close(10)
です。
>>673
ソフトの問題ではないわけですね。ありがとうございます。



678 名前:657 [2007/06/28(木) 19:45:34 ]
>676
ありがとうございます。
全部で546行のソースで、342行目にSTOP、343行目にENDがあります。
その後ろに4つのSUBROUTINEがあります。
配列の引渡しについては、引数を確認しましたが、型・サイズは同じでした。


679 名前:661 [2007/06/28(木) 20:25:40 ]
>>678
デバッグモードで確認するかだね。gfortranはできるのかな?
gnuだからできると思うけど

680 名前:657 [2007/06/28(木) 21:24:58 ]
>>679
ありがとうございます。

コンパイラのデバッグモードって、このオプションのことですか?
わけのわからないメッセージが出まくったのですが。困りました。
-fdump-parse-tree
Output the internal parse tree before starting code generation. Only really
useful for debugging the GNU Fortran compiler itself.

これ以外の Options for Debugging Your Program or GNU Fortranは、
runtime用のもののようです。

681 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:29:04 ]
>>677
どうもこちらで再現できないから、
うまくいった友達とやらに見てもらった方がいいかもしれん。



682 名前:661 mailto:sage [2007/06/28(木) 21:37:17 ]
デバッグは「-g」のはず。
gdb使ってね。

一通りミリ
ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html

"-fbounds-check"でこけたりして

683 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 23:21:15 ]
まだCVSファイルの問題が解決してないのかw

たしか富士通のコンパイラはレコード長の絡みでうるさいので、それかも試練。
入力データの1行の長さはどれくらいだ?
すごく長いなら、OPEN文でレコード長を大きくしておけ。

富士通のコンパイラは10年くらい使ってないから、保障しないがw


684 名前:677 [2007/06/30(土) 00:30:41 ]
結局.datファイルで入力することにしました…
出力の方は24×4のはずが96×1で出てしまいますが手作業で直しました。
月曜にまた学校でいろいろ試してみますね。

685 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 14:21:05 ]
>>684
>出力の方は24×4のはずが96×1で出てしまいますが
つ 改行コード

Windows側で LFのみの改行に対応したエディタか変換ツールを使うヨロシ。

686 名前:デフォルトの名無しさん [2007/06/30(土) 16:58:07 ]
>>685

ftpソフトでwin-unix
lf-cr+lf対応を使った方が早いと思う。

687 名前:デフォルトの名無しさん [2007/07/01(日) 22:28:27 ]
フォートラン初心者です.
BLASを使っていろいろ計算しようとしたんですが,内積で何故か良く分からない数値がでます.

PARAMETER ( N = 4)
REAL*8 e(N)/N*1.0/
inc = 1
WRITE(6,*) DDOT(N,e,inc,e,inc)
END

実行結果が 2.25000000
1,1,1,1と1,1,1,1の内積だから4になってほしいんですが・・・

C言語なら少しは分かります.
だれかぼすけて

688 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:45 ]
>>687
適当なので気休めまでに。

REAL*8 e(N)/N*1.0/
これを
REAL*8 e(N)/N*1.0d0/
にしてみそ。
コンパイラによっては、単精度4バイト4つ分を頭から詰めているのかもしれない。

別に考えられるのは、関数を直接WRITE文で書き出しているが、一旦変数に入れるのもよろし。
Cと違ってValueでは返さないので、関数をサブルーチンの引数にしたりすると
コンパイラによって受け付けたり、受け付けなかったり、暴走したりすることがある。
ただ、Write文だから大丈夫だと思うが。あとf90になってからは、おkのことが多い気が駿河。



689 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:55:33 ]
>>687
Intel Fortran Ver.10.026 + MKL 9,1 では、ちゃんと4が出たwww

おぬしのコンパイラ環境等は何ぞや。

690 名前:687 [2007/07/02(月) 06:56:16 ]
>>688
>REAL*8 e(N)/N*1.0d0/
変化無しOrz
初期化は上手く行ってるみたいです.
それといったん変数に入れても同じ.
ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・

>>689
よくわからないんですが適当にHPを漁ってみると
本体:FUJITSU PRIMEPOWER HPC2500
OS:Solaris 8
コンパイラFortran JIS X3001-1:1998 (Fortran95)
マニュアルとかのリンクが富士通なので,コンパイラも富士通だと思います
コンパイル時は,
%frt test.f90 -SSL2 -O0
でやってます

スパコンでベクトルの内積一本とか,なにやってんだ俺\(^o^)/

691 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 11:29:11 ]
>>690
%frt -SSL2 -O0 test.f90

こうとかwwwww

>ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・
これが気になるな。症状的にはサブルーチンの単精度倍精度の割り当て違いっぽいので。
 
DDOTにもDOUBLE指定が必要な仕様かw
IMPLICIT REAL*8 (a-h,o-z)
もつけてみるかw




692 名前:デフォルトの名無しさん [2007/07/02(月) 14:26:52 ]
pgf90のコンパイルで困っています。
makeを実行すると

PGF90-W-0119-Redundant specification for name_size (Size_Class.f90: 101)

のようなエラーがでてきます。
これはコンパイルオプションでなんとかできるものなのでしょうか?
教えてください。

693 名前:デフォルトの名無しさん [2007/07/02(月) 16:34:13 ]
>IMPLICIT REAL*8 (a-h,o-z)
かもね。

ただ、最適化するな。それで答えはどうなる?
最適化の問題か

694 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:12:58 ]
>>693
オプション -O0 使ってるから、最適化はして無いだろう。
多分DDOTもdble宣言しておかないと駄目なんだろ。EXTERNALと合わせて。
前にも似たような症状がスレに出ていた希ガス。

この辺は、NEC<<<Fujitsu<Hitachi の順でコンパイラのケツの穴が狭いという
昔の言い伝えにあるように、Fujitsuはコンパイラが宣言にうるさいんだろ。

NECはゆるすぎて、ホモの尻穴のごとく何でもホイホイ容れてしまうのだがwww



ところで、おまいら 京速コンピュータがNEC、日立、富士通の三社合同になったことをどう思う?
完全に破滅コースに入ったと思うんだがwwwwwwww

695 名前:デフォルトの名無しさん [2007/07/03(火) 00:16:01 ]
>>694
最適化しないというオプションは効いてない場合もある。-Oは書かない。

京速?北海、九州コンピュータに頑張ってもらおう。

696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:44:22 ]
>>695
>北海、九州コンピュータに頑張ってもらおう。
意味分からん。解説よろ。

697 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 04:54:07 ]
linpackのMPI版はありませんか?

698 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:07:37 ]
>>697
あるべ。


699 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 02:02:05 ]
最近WINDOWS版g95をインストールし問題なく動いていたのですが、
突然エラーが出るようになってしまいました。

g95: installation problem, cannot exec 'as': No such file or directry

とでて、コンパイルができなくなっている状態です。
pathは通っていますし、インストールもうまくいったはずなのですが・・・
なにより最近まできちんど動いていたので、全く原因がつかめません。

700 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:03:12 ]
>>699
動いていたときと動かなくなった間に、何をしたのかを書かなければ誰にも分からん。
何もしていないというのは無し。

XPだったら復帰ポイントで戻れw

701 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 16:24:12 ]
自宅でfortran77を使うために、CPad for FTN77をダウンロードしたんですが
コンパイルして実行すると

コンパイルに失敗しました。
ファイル"〜〜test.exe”は存在しません。

と言われるのですがどうすれば解決できますか?



702 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 20:25:56 ]
>>701
バグ取りすれば解決できます。

703 名前:701 mailto:sage [2007/07/06(金) 21:35:33 ]
>>702
度々すみません
具体的にどういうことをすればいいんでしょうか?

704 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 22:38:10 ]
>>703
自分の入力したプログラムをじっくり眺めて間違ってるところを直せばいいだけだよ。

705 名前:701 mailto:sage [2007/07/06(金) 23:49:35 ]
>>704
学校ではコンパイルも実行もできたやつなんですが…
といっても間違いがないとは限らないということでしょうか

簡単なもので試したんですが
write(*,*)'test'
end
でもできませんでした。


下のメッセージに

■C:\〜〜〜〜〜〜〜〜〜\data> ftn77 /link test.f
Cannot open authorisation file c:\〜〜〜\ftn77.ser:   (文字化けしてる)
System error (3): 指定されたパスが見つかりません。

と出てました。
ftn77.exeにつなげてるんですが…。

706 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 00:03:08 ]
>>705
FTN77は日本語の入っていないパスにインストールしろ。

707 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:10:21 ]
>>701
同じ質問がこのスレだけですでに2,3回出ているw
>>65あたりみろ


708 名前:701 mailto:sage [2007/07/07(土) 12:56:23 ]
できましたー!
一番の原因は>>706さんが言ってることでした
答えてくれた方々、本当にありがとうございました

709 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:45:18 ]
今度質問することがあったら、最初からエラーメッセージをコピペしような。

710 名前:デフォルトの名無しさん [2007/07/08(日) 13:09:06 ]
粘IN/1-T
の式をTを0から3まで0.5刻みでとって
さらにN=1、2、3、4、5について別々に求めたいのですが、わかりませんどなたかよろしくお願いします

711 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 13:16:07 ]
すいません↑の式は
粘IN30/1-T-n
狽ヘn=1からNまでです



712 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 21:33:21 ]
DO 10 T=0,3,0.5
S=0
WRITE(*,100) T
DO 10 N=1,5
S=S+SIN(30*3.14159/180)/1-T-N
10 WRITE(*,101) N, S
STOP
100 FORMAT(1H , 'T=', F6.2)
101 FORMAT(1H ,'N=',I2,F12.3)
END

713 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 01:34:10 ]
神です!ありがとう

714 名前:デフォルトの名無しさん [2007/07/09(月) 08:16:24 ]
まー>>711の式が悪いので、本当に計算したいモノと違うだろうな
と思うが、ある程度書いて貰ってるから後は自分で変えろ。

おれは712では、ないけど。>>711を指摘しようと思ったけどヤメタ

715 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:30:43 ]
何時も気になるんだけど、このスレの住人はFORTRAN77とかFORTRAN95とか
明示せずに質問したり、解答したりしてるけど問題に成らないのか?

716 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 02:28:56 ]
回答する分には答えやすい方(主にF95)に勝手に脳内補完するから無問題。
問題になるなら>>1をよく読んでから質問しろと言いたい。

717 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:49:19 ]
>>715
宿題はを聞く奴は違いが分からないw 結局は77になるようだが。

そうでない場合は90で答えて大丈夫だろう。さすがに90処理系はたいがいどこにでもある。

718 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 11:52:16 ]
77で答えておけばそれより上位でもだいたい問題ない。

719 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 23:08:26 ]
>>694
すごく・・・買vロジェクトです。

720 名前:デフォルトの名無しさん [2007/07/12(木) 01:20:37 ]
GNUのfortranって何であんなに遅いの?

721 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 09:40:57 ]
>>720
素人が作ってるからでないの?

GNU-Cだって倒産した商用コンパイラを引き継ぐまではf2c+gccで、小さなサンプル以外は
まともに走ったことが無かったような記憶が。



722 名前:デフォルトの名無しさん [2007/07/13(金) 18:39:06 ]
↓この問題が全くわかりません。
教えてください。
よろしくお願いします。   

   ......
call rndm0 ( )
......
a = rndm ( )
......
b = rndm ( )

このルーチンを使って、乱数を 100 回発生させて それをファイルに書き込む
プログラムを作成せよ。それを実行し、ファイルに正しく書き込まれたことを
確認せよ。なお、メインプログラムと独立したファイルにサブプログラムが
書かれている場合は、メインプログラムを違う名前のファイルで作成した後に、
コンパイルすればよい。


723 名前:デフォルトの名無しさん [2007/07/14(土) 10:48:45 ]
自分で調べるのを前提に書く

サブルーチンを使ったプログラム書けってことじゃ?

PROGRAM HOGE
 ファイルを開く(OPEN文)
ループスタート 100回
  CALL RNDM()
  Aを書く
 エンドループ
 ファイルを閉じる(CLOSE文)
 STOP
END

 SUBROUTINE RNDM
乱数発生するぞするぞ!
RETURN
 END

「メインプログラムと独立したファイルにサブプログラムが書かれている場合」
てのは、ライブラリが有るって事

調べて分からない場合は又書き名。調べた痕跡が分かれば俺は答える。

724 名前:722 [2007/07/14(土) 14:32:45 ]
>>723
ありがとうございます。
調べてみます!


725 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 03:39:15 ]
ボコボコにしてやんお 
.∧_∧ 
(  ^ω^)=つ≡つ 
(っ  ≡つ=つ 
/   ) ババババ 
( ノ ̄∪ 


726 名前:デフォルトの名無しさん [2007/07/19(木) 11:52:59 ]
たとえば、
WRITE(*,'(E10.4)') 0.0001234
とすると、出力結果は0.1234E-03となります。
この出力結果を、1.234E-04とするにはどうしたらいいのでしょうか?


727 名前:デフォルトの名無しさん [2007/07/19(木) 14:40:44 ]
そうするメリットは何?

文字として扱うかですね。

728 名前:デフォルトの名無しさん mailto:sage [2007/07/19(木) 17:24:04 ]
E形編集を使ったこと無いから、気付かなかったけど
E形編集ってメイドコスプレしたオッサン並に気持ち悪い。

729 名前:デフォルトの名無しさん [2007/07/20(金) 00:09:39 ]
>>727
おい! クソ豚! わかりもしないことに口出しするな!
しょんべん飲んで、とっとと死にやがれ!

>>726
その要望は多くの人が持っていたので、Fortran90で対応がなされた。
ただしFORTRAN77でも出来ることは出来る。

Fortran90なら、ESフォーマットを使えばよい。SはScientificのSだ。
工学と科学では表記の伝統が違うようだ。詳しくはマニュアル嫁。

Fortran77の場合は、1P, E10.4, 0P を使えばよい。Pフォーマットは思わぬ副作用があるので、
使用後はすぐに 0P で元に戻しておいたほうが間違いが無い。
詳しくはマニュアル嫁。


730 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 01:19:02 ]
>>727
そりゃ少ない文字数で多くの桁を表現できるからだろ。

731 名前:デフォルトの名無しさん [2007/07/20(金) 14:49:51 ]
>>729

0.123......
1.234......
と小数点以下を同じ桁数でして、桁数も大きくすると
仮数分の限界を越すと思うが



732 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 16:49:58 ]
何が言いたいのか分からない

733 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 21:14:08 ]
無視でおk

734 名前:デフォルトの名無しさん mailto:sage [2007/07/20(金) 23:45:57 ]
>>731
WRITE(*,'(E10.4)') 0.0001234
      〜〜〜

ちゃんと>>726を読んだらどうだ?
2chなんか見てないで、精神病院でも逝って来い!




735 名前:デフォルトの名無しさん [2007/07/22(日) 03:13:48 ]
r(i)をreal(8)の配列として、
sin(r(i))の値を求めたいのですが、出力が0になります。
どなたかどうすればちゃんとした値が帰ってくるのか教えてください。

736 名前:デフォルトの名無しさん [2007/07/22(日) 03:55:29 ]
r(i) がゼロなんじゃね?

737 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 03:57:02 ]
整数に代入した後に出力してるとか。

738 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 13:18:36 ]
>>735
ソース見せろ


739 名前:デフォルトの名無しさん [2007/07/25(水) 20:50:00 ]
配列の宣言で、REAL A(10,5)とすべところをA(5,10)と間違って宣言したままコンパイルし、
しかもboundのチェックしないオプションでコンパイルしてエラー等は起きずに動いた場合、
たとえば、A(7,7)にアクセスした結果は、
どちらの宣言でも同じなのでしょうか?
C言語の場合は同じというような話をきいたことがあるのですが、FORTRANの場合
いかがでしょうか?
処理系に依存して結果が不定なのでしょうか?


740 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 20:52:54 ]
同じなわけがない。C でも。

741 名前:デフォルトの名無しさん [2007/07/25(水) 21:53:51 ]
C言語なら5×10=50のエリアに連続的に並んでいるだけだから、
A(7,7)は49番目というつもりなら境界を越えない限りは
アプリの実行結果は同じになるんじゃないか。



742 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 21:55:50 ]
A(10,5) で A(7,7) はおもっくそ境界越えとるがな。

743 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:22:18 ]
>>742
従来のFORTRANでは、境界はあまり気にしなくていい。
というか、サブルーチンに渡したりするときは次元すら気にしない。
どうせ先頭番地しか渡してないので。自己責任でGo!

>>740 >>741が正しい。
どうせメモリー上では1次元に展開されているので、どう展開されるか分かっていれば
本来不正な添え字でも、目的の配列要素をアクセスすることが可能。

ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。
FORTRANは縦書き。A(1,1),A(2,1),A(3, 1),.....,A(1,2), A(2,2), A(3, 2),.....という風にメモリー上に
並んでいる。
.






744 名前:デフォルトの名無しさん [2007/07/26(木) 07:24:32 ]
FORTRANの他に数値解析に向いてる言語って何がありますかね?

745 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 08:43:53 ]
>>743
いや、配列のために確保されているメモリ領域を越えちゃってるという意味で・・・

746 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:30:25 ]
>>745
今回に限って言えば、50>7*7=49でぎりぎりセーフでね?


747 名前:デフォルトの名無しさん [2007/07/26(木) 12:17:43 ]
>>746
Cは0から始まるから A(7,7) は (7+1)*(7+1)=64番目なのよ。
まあ、>>739のは Cの場合はA(6,6)と読み替えてやるのがよろし。

748 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:23:45 ]
>>746
A(10,5) で A(7,7) にアクセスするってのは、
10 * (7 - 1) + 7 = 66 番目のメモリ領域にアクセスするってことで、
50 要素しかない A(10,5) のメモリ領域は余裕で越える。

749 名前:747 mailto:sage [2007/07/26(木) 12:32:02 ]
>>748
確かにそうだ。何で1行7要素だと思ったのか。
馬鹿だった。

750 名前:デフォルトの名無しさん [2007/07/26(木) 14:56:16 ]
じゃA(5,10)なら良いのか?
violationになりそうだけど

751 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:32:06 ]
5 * (7 - 1) + 7 = 37 だから、
確保したメモリ領域を越えないという点に関してのみは問題は無い。



752 名前:739 [2007/07/26(木) 19:38:10 ]
>740-751
皆さんありがとうございました。
考え方がよくわかりました。
変な質問になってしまい申し訳有りません。
A(7,7)は例が悪かったと反省しています。


753 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:58:59 ]
>>744
お金があったらMATLAB
貧乏人ならOctave

754 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:33:09 ]
>>748
んだ。おまいが正しい。わしが間違ってた。すまんこw


755 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:32:54 ]
>>743
>どうせメモリー上では1次元に展開されているので、
そうなんすか・・・知らんかった
つまり、A(7,7)は単に先頭から7*7=49番目を見るってことですか?

>ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。
つまりFORTRANは左から、Cは右から1,2,3,・・・と展開していくってことですか

756 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:37:39 ]
>>755
ちょっと前のレスくらい読めよ・・・

757 名前:755 mailto:sage [2007/07/27(金) 12:39:52 ]
>>756
すいません新着し忘れてましたすいません

758 名前:747 mailto:sage [2007/07/27(金) 12:51:34 ]
まだ混乱しているようだから、整理すると

SUBROUTINE A(X)
INTEGER X(10,5)
WRITE(*,*) X(7,3)
END SUBROUTINE
PROGRAM
INTEGER Y(5,10)
Y(2,6)=10
CALL A(Y)
  STOP
END

とかやると
ちゃんと 10って表示されるってことでしょ。
Y(2,6) は前から27番目。 X(7,3)も27番目だから。

メインルーチンの中で Y(7,7) とかやるとコンパイル時にエラーが出ると思う、さすがに

FORTRAN77の頃は結構利用されていたような気がする。
普通は1次元配列で作って2次元で受け取るとかその逆だと思うけど。

759 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:42:25 ]
すいません.Fortran90で複数行をまとめてコメントアウトすることはできないのでしょうか?

760 名前:755 mailto:sage [2007/07/27(金) 13:55:30 ]
>>758
ありがとうございます。もんすごい良く分かりました。

Y(7,7)でやってみたところ、g77だとやはり out of defined rangeとなりましたが、
ifort9ではコンパイルでき結果も一致しました。

SUBROUTINE A(X)
INTEGER X(10,5)
WRITE(*,*) X(7,4)
END SUBROUTINE
PROGRAM
INTEGER Y(5,10)
Y(7,7)=10
CALL A(Y)
  STOP
END

ifortって緩いんですかね?

761 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:18:10 ]
>>760
配列の範囲チェックに限らず、ifortは微妙にいろいろ緩いよ。少なくともg77よりは。
オプションで変わるのかも知れないが、デフォではそう。
最初のうちはg77で練習した方がいいかもね。



762 名前:デフォルトの名無しさん [2007/07/27(金) 17:14:05 ]
Fortran77で、Do文を利用して配列に値(1or0)を代入して
ファイルにはいたら途中から?????とか巨大な数が
でてしまうのですが、
何か初期化などが必要なのでしょうか?
Do文の前にx(i,j,k)=0とか入れてるのですが、
これでは駄目なのでしょうか?

763 名前:デフォルトの名無しさん [2007/07/27(金) 17:51:26 ]
>>762
1か0を代入した配列要素を参照すれば1か0を返すと思います。
予期せぬ値を吐いているのは、配列が宣言されてから、
その要素に一度も値が代入されていないからだと思います。

予期せぬ値が配列のどの要素にあたるのか考えてみれば
大抵あっさり解決すると思いますよ。

764 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:02:58 ]
Intel fortranだと初期化してない変数は自動で0になるんよね

765 名前:762 mailto:sage [2007/07/27(金) 20:22:52 ]
>>763,764
ありがとうございます。
使用しているのはSalfordのftn77peです。
配列要素は代入したものを参照しているはずなのですが。。。
以下の内容ですが間違いありますか?
integer h
parameter(ilimit=10)
parameter(jlimit=20)
parameter(klimit=2)
real Conc(ilimit+1,jlimit+1,klimit+1)
open(10,file='tests1.csv')
i=0
j=0
k=0
h=5
Do 300, i=0,ilimit
Do 200, j=0,jlimit
if(j.lt.h) then
Conc(i,j,k)=0.0
else
Conc(i,j,k)=1.0
endif
write(*,*)i,j,k,Conc(i,j,k)
write(10,*)i,j,k,Conc(i,j,0)
200 Continue
300 Continue
c
close(10)
stop
end


766 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 22:09:46 ]
>>765
FORTRANの配列は特に指定しない場合は 1から。

>使用しているのはSalfordのftn77peです。
>>765のプログラムを/CHECK オプションを付けてコンパイルすると実行時エラーが出る。
/FULLCHECK オプションを付けるとコンパイル時にエラーになる。

配列を0から始めたいのなら以下のようにする。
real Conc(0:ilimit,0:jlimit,0:klimit)

767 名前:762 [2007/07/28(土) 13:05:47 ]
>>766
アドバイスありがとうございます。
教えていただいたオプションつけると
実行時エラーが確かにでますね・・・
どこに間違いがあるのでしょう?

768 名前:762 mailto:sage [2007/07/28(土) 13:09:51 ]
>>766
初期化したら大丈夫でした。
何から何までありがとうございました。

769 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 17:13:16 ]
gfortran, ifort で NaN を検出したいのですが、
どうすればよいでしょうか。

program test
real(8) :: x,y
x=1.
y=0.
write(*,*) x/y,isnan(x/y)
end

$ gfortran test.f90
/tmp/ccABo1qT.o: In function `MAIN__':
test.f90:(.text+0xa3): undefined reference to `isnan_'
collect2: ld はステータス 1 で終了しました

$ i$ ifort test.f90
$ ./a.out
Infinity F

鳥は
Linux 2.6.20-gentoo-r8 SMP x86_64 Intel(R) Xeon(TM) CPU 3.80GHz GenuineIntel GNU/Linux
$ gfortran --version
GNU Fortran 95 (GCC) 4.1.2 (Gentoo 4.1.2)
$ ifort --version
ifort (IFORT) 9.1 20070215
です。


770 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:48:12 ]
>>769
Intel Fortran, g95 なら

program test
real(8) :: x,y
x=0.
y=0.
write(*,*) x/y,isnan(x/y)
end

gfortranの場合は知らん。

771 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:18:08 ]
>>770 thanks. infinity は NaN ではなかった。小手先の工夫で
program test
real(8) :: x,y
x=0.
y=0.
x=x/y
if(x-x.ne.0.) then
write(*,*) x
else
write(*,*) x-x
endif
end
を考えたのですが gfortran は NaN を返し、ifort は
0.000000000000000E+000
を, ifort -O0 は NaN を返しました。例外をトラップしようと思うと、
c のプログラムをリンクせざるとえないのかな。



772 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:20:20 ]
>>771
マニュアル味噌。

Module: USE IFPORT
Syntax
result = IEEE_FLAGS (action, mode, in, out)

gfortranの方は知らんが、F2003対応のIEEEモジュールを誰かが作ったとか書いてあったような。
記憶違いだったら、ごめんw


773 名前:デフォルトの名無しさん [2007/08/02(木) 03:31:02 ]
わざわざNanを検出する理由は何か?







[ 続きを読む ] / [ 携帯版 ]

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

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