12/01/10 02:50:03.32
>>744
そうなのか^^;
俺は独学で fortran95 学んでシミュレーションしてる
口だからそういう事情しらんかったw
やっぱり古いソースを使う機会が未だに多いということなのかね
746:デフォルトの名無しさん
12/01/10 03:01:13.70
まあ言語の機能よりは
問題ごとに確立された手法の蓄積が肝心だからね
747:デフォルトの名無しさん
12/01/10 15:15:40.88
>>732 fortran77でやる場合はどうなるんですかね?
748:デフォルトの名無しさん
12/01/10 17:20:29.98
リダイレクションして出力するってこと忘れてました。申し訳ないです。
749:デフォルトの名無しさん
12/01/10 22:58:32.86
77で書くのはめんどい。90なら1行で書けることが5行くらいかかる。
連休前の軽い気分ならやってやるが、♪今はもう動かない、おじちゃんのや~る~き~。
750:デフォルトの名無しさん
12/01/10 23:05:21.42
Real aver(1:5),s,ep,
Integer exam(1:100,1:5),sum(1;5),psum(1:100),I,j,n
Read(5,*)n, ((exam(I,j),j=1,5,1),i=1,n,1)
Do 20 j=1,5,1
Sum(j)=0
Do 10 i=1,n,1
Sum(j)=sum(j)+exam(I,j)
10 continue
Aver(j)=sum(j)/real(n)
20 continue
Do 40 i=1,n,1
Psum(i)=0
Do 30 j=1,5,1
Psum(i)=pasum(i)+exam(I,j)
30continue
Paver(i)=pasum(i)/5.0
40continue
751:デフォルトの名無しさん
12/01/10 23:06:41.39
続き
Write(6,100)
100 format(14x,’score of examitation’/
* 2x,no. eng mat jap soc sci ‘,
* 3x,’psum paver’
Do 50 i=1,n,1
Write(6,200) I,(exam(I,j),j=1,5,1)
Psum(i),paver(i)
200 forma(1x,i3,5i6,i7,f6.1)
50 continue
Write(6,400) ( sum(j),j=1,5,1)
400 format(/1x,’sum’,5i6)
Write(6,500) (aver(j),j=1,5,1)
500format(/1x,’aver’,2x,5f5.1)
Stop
End
を改造して
各科目の標準偏差を求めそれを利用することで各個人の偏差値を求め、個人の
得点の下に偏差値をしめすプログラムの作り方がわかりません。。。。
偏差値=(P-M)/s*10+50
標準偏差は各科目ごとにs=√1/nΣ(P-M)*(P-M)
p=得点、M=平均値
AVER:科目平均 SUM:科目の合計 PSUM:個人の合計 PAVER:個人の平均
752:デフォルトの名無しさん
12/01/10 23:07:12.79
続き
データファイル
51 80 70 90 50
70 40 65 70 40
60 78 75 80 70
90 80 85 70 95
40 70 55 60 60
80 50 85 75 80
お願いします!!
FORTRAN90です。
いろいろと試みたんですがわからなかったので。。。。。
753:デフォルトの名無しさん
12/01/10 23:20:30.66
>>752
jap ってなんだよ。朝鮮学校の宿題かよ。大体それ77だぞ。金正日の糞でも食ってろw
754:デフォルトの名無しさん
12/01/10 23:28:23.22
国語です。初心者でわかりませんでした↓
755:デフォルトの名無しさん
12/01/11 00:08:28.87
77のDOってCONTINUEで終わらないといけないものとばかり思ってた事を思い出した
756:デフォルトの名無しさん
12/01/11 01:14:00.26
こんな本でてるw
URLリンク(www.amazon.com)
Missile Flight Simulation
Fortran and ADA are the principal Government-approved langeages.
757:デフォルトの名無しさん
12/01/11 03:07:45.89
>>751 同じ大学の予感
758:デフォルトの名無しさん
12/01/11 16:55:21.54
program vipper
implicit none
integer, parameter :: nop = 5
integer, allocatable :: iexam(:, :)
real, allocatable :: sts(:, :)
real :: ave(nop), std(nop)
integer :: i, j, nos
read(*, *) nos
allocate( iexam(nop, nos), sts(nop, nos) )
read(*, *) iexam
ave = sum( iexam, dim = 2 ) / nos
forall (i = 1:nop) std(i) = sqrt( sum( (iexam(i, :) - ave(i))**2 ) / nos )
forall (i = 1:nop) sts(i, :) = ( iexam(i, :) - ave(i) ) / std(i) * 10.0 + 50.0
write(*, '(7(4x, a, 1x))') ' 英', ' 数', ' 国', ' 社', ' 理', ' 計', '平均'
write(*, '(58("=")/, 7f8.1/, 58("="))') ave, sum(ave), sum(ave) / nop
do i = 1, nos
write(*, '(7(i7, x))') iexam(:, i), sum(iexam(:, i)), sum(iexam(:, i)) / nop
write(*, '(5f8.1/)') sts(:, i)
end do
stop
end program vipper
6
100 80 70 90 50
70 40 65 70 40
60 78 75 80 70
90 80 85 70 95
40 70 55 60 60
80 50 85 75 80
759:デフォルトの名無しさん
12/01/11 16:55:48.76
英 数 国 社 理 計 平均
==========================================================
73.0 66.0 72.0 74.0 65.0 350.0 70.0
==========================================================
100 80 70 90 50 390 78
63.7 58.9 48.1 67.2 41.8
70 40 65 70 40 285 57
48.5 33.5 43.5 45.7 36.4
60 78 75 80 70 363 72
43.4 57.6 52.8 56.4 52.7
90 80 85 70 95 420 84
58.6 58.9 62.1 45.7 66.3
40 70 55 60 60 285 57
33.3 52.5 34.1 35.0 47.3
80 50 85 75 80 370 74
53.5 39.8 62.1 51.1 58.2
760:デフォルトの名無しさん
12/01/11 19:26:28.74
ありがとうございます
761:デフォルトの名無しさん
12/01/13 23:03:52.43
gfortranでスタックサイズを変えるにはどのコンパイルオプションを指定すればいいんですか?
配列サイズが大きくて実行時にエラーになります。
「-fmax-stack-var-size=n」はn=200000000でエラーがになるのにn=10でエラーがなかったりする
のでよくわかりません。
「-fstack-arrays」はコンパイル時に f951.exe: error: unrecognized command line option '-fstack-arrays' という
エラーが出ます。
762:デフォルトの名無しさん
12/01/13 23:35:12.81
>>761
>「-fmax-stack-var-size=n」
これはスタックにとる配列サイズの設定であって、スタックのサイズではないよ。
ここで設定したサイズより大きい配列はスタックに置かれないから、
この値をスタックサイズより小さくすればオーバーフローが回避できる。
763:デフォルトの名無しさん
12/01/13 23:40:07.24
>>762
そうだったんですか。ありがとうございます。
あと、スタックサイズって調べられるんですか?
764:デフォルトの名無しさん
12/01/13 23:42:51.78
fortranを仕事で使ってる奴いる?
みんあエクセルにながれちゃん?
765:デフォルトの名無しさん
12/01/13 23:55:44.27
>>763
linuxだったらulimit -sで表示も設定もできる
766:デフォルトの名無しさん
12/01/14 01:04:20.84
>>765
すみません書いてなかったです。OSはwin7x64です。
ulimit -s コマンドプロンプトでやってみたけどダメでした。
767:デフォルトの名無しさん
12/01/14 01:29:00.98
>>761
つーか、automaticでデカい配列取ると常にスタック問題に悩まされるので、
素直にALLOCATEABLEにしてALLOCATEすれば良い。
まぁIntelFortranは、スタック問題の質問が殺到したために、デカ目の配列は勝手にheapにとるようになったw
768:デフォルトの名無しさん
12/01/14 02:00:12.07
>>767
allocateつかったらエラー出ませんでした。ありがとうございます。
769:デフォルトの名無しさん
12/01/17 11:57:00.85
Error: Syntax error, found END-OF-STATEMENT when expecting one of: , )
このエラーは構文のミスですか?
かっこが多いとかですかね?
770:デフォルトの名無しさん
12/01/17 12:12:29.80
むしろ足りない。
固定フォーマットで72カラムをはみ出していると見た。
771:デフォルトの名無しさん
12/01/17 12:28:23.23
>>770
72文字制限は守っています。
エラーが出ている行を何度見直しても括弧の数はあっているのですが・・・
その前後に問題がある場合もありますか?
772:デフォルトの名無しさん
12/01/17 12:57:01.80
, または ) で結ばれる前に、行末が来てしまったと言っているしな。
フォーマット文が狂ってるか、72カラムからうっかりはみ出した場合が多いような。
その行だけここに出して味噌。
773:デフォルトの名無しさん
12/01/18 00:30:36.98
解決したのかよ。続きが知りたいだが。
774:デフォルトの名無しさん
12/01/18 20:13:57.62
write (*,'(a,f5.2,a,5.2,a)') 'y=',alfa,'+',beta,'x'
1
Warning (100): Unexpected element in format string at (1)
何がおかしいか分かりませんお願いします
1は「'」の下です
775:デフォルトの名無しさん
12/01/18 20:46:38.00
2つ目の5.2は何か
776:デフォルトの名無しさん
12/01/18 21:33:52.63
>>775
ありがとうございます
解決しました
777:デフォルトの名無しさん
12/01/19 18:24:38.41
gfortran でstackoverflow にならなくても他のコンパイラではなる場合、
gfortranでもうまくいってない可能性は高いでしょうか?
778:デフォルトの名無しさん
12/01/19 23:03:26.61
>>777
細部を見ないと断言できないが、AUTOMATIC変数が大きくてSTACK OVERFLOWが起きているののならば、
DEFAULTのSTACKサイズがコンパイラ毎に違っているので、そういうことが起きてもおかしくない。
オプションによって、STACKではなくHEAPにAUTOMATIC変数をとるようにも出来る場合もあるし、
初めからそういう設定になっていることもある。
しかし、別の原因でSTACK OVERFLOWを起こしているのなら、話しは別だ。
それぞれのコンパイラのマニュアルを一字一句舐めるように読んでDEFAULTのSTACKサイズを調べて味噌。
779:デフォルトの名無しさん
12/01/20 00:39:04.83
fortranって非対称マトリクスの扱い弱くない?
780:デフォルトの名無しさん
12/01/20 00:46:53.78
gfortranを使ってるものですが。
配列の宣言について質問です。
例えば、
subroutine sub(a,b,n,j)
implicit real*8(a-h,o-z),integer*4(i-n)
dimension a(n,n+1),b(n*n,j)
・
・
・
というような宣言はおかしいでしょうか?
スタックの原因になったりしますか?
一応コンパイルはこれでできるのですが。
形状引継ぎや形状明示のことだと思うのですが・・・。
説明不足かもしれませんが、エスパーな方教えてやってください。
781:デフォルトの名無しさん
12/01/20 00:55:53.58
それは親ルーチンから引き継いだ配列だからスタックに効かない。
そのサブルーチンで新たに定義した配列が大きいとスタックがあふれる。
言ってることが分からないなら、他の宣言文も全部出せ。
77でやっているならそういうことは起きにくいのだが、変数をSTATICにとるようなオプションを付けてコンパイルするとか。
本来の規格では77でのサブルーチン変数は動的にとられるが、歴史的な事情から、静的に確保されることが多い。
(SAVE変数に成っている)その辺の問題かな。
いまは77形式も90系と同じコンパイラが単にオプションを変えて走っているだけなので、そのオプションがなんなのか
個別に調べないと分からん。
782:デフォルトの名無しさん
12/01/20 01:21:25.60
>>781
ありがとうございます。
宣言は
implicit real*8(a-h,o-z),integer*4(i-n)
parameter(nx=10,ny=10,nt=nx*ny)
call sub1(nt)
return
end
subroutine sub1(nt)
implicit real*8(a-h,o-z),integer*4(i-n)
dimension a(nt,nt+1)
call sub2(a,nt)
return
end
subroutine sub2(a,nt)
implicit real*8(a-h,o-z),integer*4(i-n)
dimension a(nt,nt+1)
return
end
という感じでsub1で大きな配列を宣言するとあふれるということですかね?また、スタックがあふれるときはコンパイルの時点でエラーが出るんでしょうか?
783:デフォルトの名無しさん
12/01/20 01:27:25.10
100*101程度では溢れないが、基本的にはそういうこと。
コンパイル時にはエラーはでない。
784:デフォルトの名無しさん
12/01/20 01:29:44.50
>>779
そんなことはない
785:デフォルトの名無しさん
12/01/20 01:34:01.82
>>783
なるほど、親ルーチンで宣言してれば問題にならないんですか?
786:デフォルトの名無しさん
12/01/20 02:31:30.26
>>785
いや、コンパイル時にはエラーはでないが、実行時にエラーが出る。
787:デフォルトの名無しさん
12/01/20 02:37:51.52
親プログラムで配列を確保しておけばという事ならエラーはでない。
788:デフォルトの名無しさん
12/01/20 02:40:36.33
>>786
実行時のエラーというのはプログラムが強制終了するってこと?
それとも数値計算の値がずれたりする?
789:デフォルトの名無しさん
12/01/20 02:51:51.77
STACK OVERFLOWの話をしているのではないのか?
790:デフォルトの名無しさん
12/01/20 03:07:16.46
>>789
質問が初歩的すぎてスマン。
実行時にクラッシュするわけですね・・・。
791:デフォルトの名無しさん
12/01/20 03:14:15.59
>>777>>780>>782>>785>>788>>790
というのもgfortranでコンパイルしたら普通にプログラムも動いて、数値計算ができるんだが、
他のコンパイラを使うとスタックオーバーフローになるみたいで、
gfortranでやった場合の計算結果が合ってるかがわからなかったんです。
とても参考になりました。本当にありがとうございます。
792:デフォルトの名無しさん
12/01/22 11:07:18.17
basicだとグラフ掛けるけど、
fortranはどうなん??
793:デフォルトの名無しさん
12/01/22 12:08:40.04
標準ではできない・・・とおもう。
だいぶ前になるけど、 Digital visual Fortran では出来たな。
GUI その他拡張機能 を全部 qq で始まる名前の副プログラムで提供していた。
・・・Intel Fortran の中の人は旧DECの人と聞いたことがあるけど、どうなんだろうか?
794:デフォルトの名無しさん
12/01/22 17:29:37.20
QQで始まるのはMS-FORTRANに源流を持つMSのQuick-Winだな。
DOS時代から綿々と続いて今もIntelVisualFortranに受け継がれている。
DEC時代にはFGLで始まるOpenGLの機能の一部が簡単に使えるライブラリが用意されていたが、
最近はF90GLとかのフリーのルーチンでやってくれということで削除された。
大型計算機以来のXYプロッタ的なルーチンは、幾つかフリーのものが出回っている。
標準でグラフィック機能というのはもちろん無い。
795:デフォルトの名無しさん
12/01/23 04:13:00.77
広義にはpgplot gnuplot 辺りも>>792 の
希望に叶うのかな?
MS Fortran の中身はDEC が作ったと記憶。
当時のMSに開発環境を作る能力は・・
796:デフォルトの名無しさん
12/01/23 09:47:41.02
>>795
それは間違い。
MSがBASICの次に売った言語はCP/M用のFORTRANサブセット。
DOS用のMS-FORTRAN3.0,4.0,5.0ときて、5.0にはQuickWinが付いている。
その後Win3.1,NT用まではMSで出した。
DECに渡したのはWin95の頃。QuickWinはMS仕様のままさほど発展せずに今に至っている。
797:デフォルトの名無しさん
12/01/23 11:04:18.07
ここはためになるインターネッツですね
798:デフォルトの名無しさん
12/01/23 11:43:42.33
MS Fortran PowerStation って95の時だっけ?
fpsfl32.exe /4Yb mufufu.for
かな、/4Yb オプションつけたときの
バグ発見効率の素晴らしさに感動したのも昔の話。
799:デフォルトの名無しさん
12/01/23 11:47:58.19
PowerStation1.0/NT はWin3.1/NT3.5 PowerStation4.0がWin95
4.0に急に飛んだのはVC++の4.0に合わせたため。ここで環境の統合がなされた。
それまでは個別のWorkBench、ここからDevStudio。
800:デフォルトの名無しさん
12/01/23 11:55:33.35
FPS4.0まではMSが出したが、これが結構バグバグでDECに後をかませた。
DECは潰れてCompaqに買収され、CompaqはHPと合併して、FortranチームをIntelに売って今に至っている。
QuickWinを見捨てずに今まで残しているところは偉い。
801:798
12/01/23 12:22:09.28
ああそうだ、自分が使ってたのは4だ・・とおもうw
ためになるよ。ありがとう >799,800
ついで、というか・・・自分の記憶だとそのあと
Digital Visual Fortran っていうのがあって
DEC Alpha の NT 上で初めてF90 規格をさわって・・・
module use あたりに最初頭が馴染めず苦労した記憶が・・なつかしいのう。
802:デフォルトの名無しさん
12/01/24 23:53:15.40
fortranで童貞捨てたいんですが、、、、
803:デフォルトの名無しさん
12/01/25 13:36:34.70
ヽ/l l ニ|ニ ,.、-''"..;:;:;:;:;:;:;:... `'ヽ、
( ( ̄  ̄) /....:::;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;.....ヽ、/ ̄ ̄ ̄ ̄\/
 ̄  ̄ i_;;、:_;、;_;、;、;、、ィッ.;:;:;:;:;: / 興 男 >>802
,.、-─-- 、.,_ ,、 | ,,,,,, / ;:;:;:;:;:;: | 味 の :
``''--イ ,),、,! ''''' \ ;;;;;;;;;_| が は :
ヾー'゙ |ヒニニュ ャニ,ニニ、> 〉;; / _| あ だ
ノ l ハ l ヾ トイ `!゙l)_j ' iリ__, ` }ii l f'ト〉 る か
_,,.ノ _ノ / ノ ノ ノノ!_丿 | l ` " ''' }ii リノ | の に |\__
ノ ,、ィ'-=z=F [_ .l! .{ 、 ィ!ii;}' ノ| か |
-‐''゙_ノ ,ノ '゙ (ソ ヽ {! ゙ー<⌒' ,ミi;i;}ー'゙ | ね |
、 ィッ>f「 _,,二- ヽ. }i、 -===-' リiii;ツ | ? |
`〒T〔!| r ,_ノ _ノ}lli, -r=‐ ,i;llilili| > _____/`ヽ、
゙、ヽ`! l _ _」 // '}llli, ,;i|i;, ,,ii;ilililll'゙リ /  ̄ l l ,、 ''⌒゙ヽ、
`ト.、! lj (__l、/ | ゙ト!llllllllllliillllllllヅ_、-゙ /,l l /
l ゙ト、 t'゙ | | | |、'lトllトllトツ "´ // l l /
,ィ、化ァ ',\ l 〉 | | | ゙、 //∧ / / l l l
(爪((、`ー'′ ', `''t‐--'′〉ト、 | | |. Vハ彡 ∧ / |_L、 i | /
 ̄ ̄ ̄`¨`''ー--ニL_ `!、 `! l ̄`''┴--┴'-'゙-─…''"´_,, ィ| l |/
ヽ ` ', | O``''──…'''"´ O',゙:、 l |/
804:デフォルトの名無しさん
12/01/25 17:16:42.14
どうしてフォートランしないのッ
805:デフォルトの名無しさん
12/01/26 17:03:35.64
アフリカ象が好き!
806:デフォルトの名無しさん
12/01/27 12:24:42.93
ぱぉぉぉん!
807:デフォルトの名無しさん
12/01/27 13:58:29.66
八丈島のキョン!
808:デフォルトの名無しさん
12/01/31 17:38:04.01
error LNK2001: unresolved external symbol _MAIN__
fatal error LNK1120: 1 unresolved externals
以上のエラーが解決できません。
定義していない引数を出しているとかでしょうか?
LNK1120の説明が多くて難儀しています。。。
809:808
12/01/31 17:45:33.71
上のものはbuildできなくて困っています。
810:デフォルトの名無しさん
12/01/31 22:58:16.57
あ~それ、あれだよアレwww
811:デフォルトの名無しさん
12/01/31 23:00:47.97
ライブラリにリンクできてないんじゃない?
812:デフォルトの名無しさん
12/02/01 15:54:23.60
main program が無いんでね?
モジュールしかないファイルをビルドしているとか。
コンパイルのファイル並びが悪いとか。
813:デフォルトの名無しさん
12/02/04 11:53:25.56
フォートラン95で、10個のデータを
読み込み絶対値が最も大きいものの番号ともとの値を表示する
プログラムの作り方を教えてください.
814:デフォルトの名無しさん
12/02/04 12:31:18.78
特定した
815:デフォルトの名無しさん
12/02/04 14:12:32.03
maxvalとmaxloc
816:デフォルトの名無しさん
12/02/04 19:24:28.09
有限要素法の二次元梁要素のfortranソースどこかに落っこちてないですか??
817:デフォルトの名無しさん
12/02/06 14:24:01.49
program gayboy
implicit none
integer, parameter :: nmax = 10
real :: xdat(nmax), xmax
integer :: kmax
open(10, file = 'hole19.dat')
read(10, *) xdat
kmax = maxloc(abs(xdat), 1)
xmax = xdat(kmax)
print *, 'max pos, dat', kmax, xmax
stop
end program gayboy
豆ポイント
maxlocは元の配列のRANKと同じ配列で結果を返すので、1次元配列では
要素数1の配列で値を返してきて困る。この時、第二引数の次元指定で
問題回避できる。
818:デフォルトの名無しさん
12/02/08 19:16:27.77
FORTRANで整数変数の暗黙宣言がI~Nになっていることの根拠を知りたいと
いう人がいた気がするが、まだ解決していないなら朕がその謎を解いてやろう。
John Backus 本人がそのものずばりを質疑で答えている。
ちなみに質問は会場の爆笑を誘っているw
J.A.N. Lee. Transcript of question and answer session: "The History of Fortran I, II, and III".
In in: R. Wexelblat, editor. History of Programming Languages, ACM Monograph Series, Academic Press, 1981, pages 68-71.
URLリンク(www.softwarepreservation.org)
LEE: Helen Gigley asks: "Why were the letters I through N chosen to designate integers?"
[Laughter and applause]
BACKUS: Well, it just seemed for a while that people always used I, J, and K for subscripts,
and we thought we'd be generous and add a few more.
ようするに適当w
まぁ数学では記法としてΣ_i^Nとかが一般的で、添え字にO以降は使われないから、
I~Nまでを整数とするのは適切な気がする。
819:デフォルトの名無しさん
12/02/08 19:19:26.81
ついでに言うと、伝説と異なりFORTRAN I で配列のRankが3以下に制限されたのは
インデックス・レジスタが3個しかないせいではないとも言明している。
820:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 22:08:22.00
F77形式で書かれたプログラムのmakeファイルをg95でコンパイルしようとしたのですが、
メッセージ番号 0x2331 のメッセージ文が application のメッセージ ファイルに見つかりません
というエラーメッセージが出てきてできませんでした。
この現象についてわかる方がいたら教えてください。
ちなみに私のパソコンはWINDOWSですが、知人によると、知人のMacでは普通にコンパイルできたようです。
821:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 22:14:38.55
エラーメッセージをコピペして貼りつけろ。
それでは情報が少なすぎて分からん。
822:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 01:04:40.93
関係演算子のge,gt,le,ltの意味を教えてください
eq,nqだったらequalとnot equalの略という意味です
823:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 01:43:51.66
GE greater than or equal
LE less than or equal
GT greater than
LT less than
英語マニュアル見ればそのままズバリ書いてあると思う。
824:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 01:45:33.44
equal の後に to もあるかな。 equal to
825:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 01:56:23.98
>>823,824
ありがとうございます
826:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 02:10:04.20
common文は分かりにくいorバグが出やすいから、モジュールを使いましょう
という文章をfortranのサイトなのでよく見かけるのですが、
common文は何が問題なのでしょうか?
自分は、変数をまとめてcommon文で定義したファイルを
各サブルーチンでincludeしていますが、
これは推奨されていないやり方なのでしょうか?
そもそも、グローバル変数を使うこと自体よくないというのを
聞いたこともありますが、
グローバル変数を使わないで数値計算するというのが想像できないです。
827:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 02:11:02.29
追記ですが、自分はモジュールのことやオブジェクト指向のことを
まったく理解していないです。
それらの重要性なども、できれば教えてほしいです。
828:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 03:02:15.16
COMMON文は、メモリー領域の共有だから、並べた順番に意味があって、名前には意味がない。
subroutine1
COMMON/A,B,C/
subroutine2
COMMON/C,B,A/
とある時、A=C、B=B、C=Aとなる。
これにたいし、MODULEの場合は元々の名前が引用される側でそのまま使われるので、最近の新参言語に慣れた人や初心者の直観像に近い。
COMMON文は元々メモリーの一滴が血の一滴だった頃に、メモリー領域をぎりぎりまで共有して使うための機能。なれれば気持ちいい。
ところが最近の言語しか知らないちびっ子は大域変数と混同してトンチンカンで間抜けな寝言をほざいている。
手動で領域確保とガベージコレクションをやっているようなもんと言えばありがたがるかもしれんw
とはいえ、最近はCOMMON文は、コンパイラの自動最適化の障害になるので使わなくて済むなら、
使わないほうが速いプログラムが出来るという理由で避けたほうがいいとされる。
EQUIVALENCEも同じく最適化の障害になるので、TRANSFER関数を使えと言われている。
MODULEは、F77までは裸でサブルーチンを並べていたのを、箱に入れておくような物。ありがたい点は、分割コンパイルしても
引数の型チェックなどが可能になること。C言語みたいに自分でインターフェースを書かなくても、コンパイラが自動でヘッダーファイルに
相当するものを作ってくれる。MODULEは便利なので、サブルーチンの箱と思って使うとよろしい。
また、これにより大域最適化も昔より用意になっていると言われている。
オブジェクト指向は、引数の型チェックを緩める仕掛けというのが最大の使い道の気がするw
829:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 03:26:23.90
>>828
>COMMON文は、メモリー領域の共有だから、並べた順番に意味があって、名前には意味がない。
そうです、これをどのサイトでも見かけるのですが、
例えば、
COMMON/A,B,C/ という記述をCOM.txtというファイルに保存して
全てのサブルーチンに
subtoutine1
include COM,txt
doubroutine2
include COM.txt
とやっておけば、順番を間違えたせいで変数が入れ替わることもないし
あとで変更を加えたければ、COM.txtだけを変えればいい。
と思うのですが、この方法だと何か問題があるのでしょうか?
830:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 09:04:39.53
>>828
別にそれでいいし、コピペとかでそうやるけど、COMMONの持っている潜在的な能力を使いきっているわけではない。
単に記憶領域の割付の問題だから、サイズや型が違っているものを割りつけてもいい。
831:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 10:26:37.44
>>830
先ほどからいろいろ自分でも調べたんですが、
>>829とまったく同じことをモジュールでもやってるみたいですね?
同じことをあえてモジュールでやる意義がよくわからないです。
推奨しない、とは書いてあるんですが
その理由がはっきり書いてなかったりで。
832:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 10:55:01.62
むしろ>>829のような使い方しかしないなら、COMMONを使うまでもなくMODULEを使うほうがいい。
メモリーが少なく、動的な割付が出来なかった時代に、同じメモリー領域を共有地としてサブルーチン毎に色々な割付で使うことが出来たのが
COMMONの利点。
COMMONの欠点は、名前の並びがメモリー上の並びに対応するというモデルが、現代の計算機に適切でないため。
今のコンパイラは最適化を優先して変数を自由に並べ換えてる、64bitの切れ目の良い番地と単精度の32bitの切れ目が対応しないとか、
動的割付や分散メモリーの前にはCOMMONのモデルの前提は縛りがきつすぎて最適化が制限されてしまう。
大域変数として使う程度ならMODULEで十分。
833:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 10:49:13.59
>>832
ありがとうございました。
いまから、コードのCOMMONをぜんぶMODULEに書き換えますw
834:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 10:54:27.04
質問です。
LinuxにLAPACKを入れたのですが、コンパイル時にエラーが出てしまいます。
エラーの意味がよくわからないので
対処方法を教えてください。
]$ ifort -module sampleLAPACK.f90 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.a
/ifortのあるディレクトリ/for_main.o:
In function `main':
/export/users/nbtester/x86linux_nightly/branch-12_0/20101117_010000/libdev/frtl/src/libfor/for_main.c:
(.text+0x50): undefined reference to `MAIN__'
コンパイラはifort
LAPACK-3.4.0とLAPACK95を入れ、
~/libに全て移動させました。
よろしくお願いします。
835:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 11:04:49.27
mainプログラムがないって言ってっぞ。
あとスレ上げんなよ。変なのが湧いてくるから。
836:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 13:54:15.42
>>835
すみませんでした、気をつけます。
ライブラリの使い方が全く分からないです。
とりあえず、サンプルコードに
use f95_LAPACK
call LA_GETRF(r,ipiv)
call LA_GETRI(r,ipiv)
という文を入れています。(あるサイトにあったサンプルそのままです)
ディレクトリに、*.aはちゃんと入っているので
LAPACKのインストールは成功しているともうのですが。
837:営利利用に関するLR審議中@詳細は自治スレへ
12/04/07 22:56:57.64
>$ ifort -module sampleLAPACK.f90 ~/lib/lapack95.a ~/lib/liblapack.a ~/lib/librefblas.a
-------------------↑
ここにスペースが足りねぇ、なんて落ちじゃないよな?
838:営利利用に関するLR審議中@詳細は自治スレへ
12/04/07 23:23:47.86
質問です。
サブルーチンのなかでサブルーチンを使うことは出来ますか?
(自分でやってみたところ、計算は出来たのですが
バグとか起きたりしないですよね?)
839:営利利用に関するLR審議中@詳細は自治スレへ
12/04/07 23:29:26.56
>>838
出来るぞ!兄貴がサブを呼び、サブが子サブを呼んで、子サブが孫サブを呼んでもいいぞ!
840:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 00:06:50.04
>>839
知らないで、いちいちメインプログラムに書いてました!!
ありやす!!
841:営利利用に関するLR審議中@詳細は自治スレへ
12/04/08 10:15:57.63
>>834
MKLを使おう。
LAPACKも入ってる。
842:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 22:33:02.45
ライブラリの仕組みが分からないので、教えてください。
複数のオブジェクトファイルの集まりというところまでは
理解できたのですが
コンパイルしたときに、どうやって必要なファイルを抜き出すのですか?
例えば、メインプログラムに
call sub***
とか書いたら、ライブラリのなかにあるsub***を自動で検索してくれるのでしょうか?
843:営利利用に関するLR審議中@詳細は自治スレへ
12/04/09 22:49:05.89
LINKERが探してくれるので任せておけ。
844:デフォルトの名無しさん
12/04/13 01:07:31.75
すみません、助けてください。
program main
implicit none
use variable !このなかにmmaxをパラメータ属性で定義している
real(8) :: phi(0:mmax)
call subA(phi)
call subB(phi)
end program main
subroutine subA
use variable
implicit none
double precision,intent(out) :: phi(0:mmax)
ここらへんでphiを計算して出力
end subroutine subA
subroutine subB
use variable
implicit none
double precision,intent(in) :: phi(0:mmax)
ここらへんでphiを使って他の量を計算
end subroutine subB
という感じのプログラムなんですが、
intent文をつけると、
この配列名はこのコンテキストでは無効です(error #6420)
と出てしまいます。
intent文を外すと、コンパイルできます。
ずっとここで悩んでいます。助けてください。
845:デフォルトの名無しさん
12/04/13 01:08:19.41
半角でスペースしたので
字下げが反映されませんでした。見辛くてすみません。
846:デフォルトの名無しさん
12/04/13 01:48:45.99
intentはサブルーチンの引数になってないと駄目だぞ。
subroutine subB(phi)
のようにな。
イメージ画像
,,x-ー:: ":::::
サブ ,x '"::::::::::::::::::::
,、'":::::::::::::,, x-‐ ァ:
,,x '"::::::,,、- '" |:::
`"i`ー'" ヾ
! 、 、,,,,,,,,,;;;;;;;;;彡ミ
|,,,,ノi `ーヾ;; '"----、
ヾ::ヽ -┴'~
~|:/ ' ' ' `ー ' "'"
/_
l '' ) i
ヽ,,、'~` U
゙, __ ,-、_,ノ`
|/ ゙, `'" ,,y
|// 彡 ゙、`-'"
/| i
! ,, -'"
| `ー '"|::
| /|||ヽ
/|||||/心
|ヾ/ /`ー
847:デフォルトの名無しさん
12/04/13 01:58:14.86
>>846
基本的なサブルーチンの使い方が出来ていませんでした!
もっと早く聞けばよかった!ありがとうございました!
848:デフォルトの名無しさん
12/04/17 19:37:19.69
Fortranスレがなぜか落ちてる・・・なぜだ?
こっちで質問させてください
module
real(8),parameter :: n = 500
type ADM
real(8) :: a(0:n),b(0:n),c(0:n)
end type ADM
interface
subroutine subini(phi,ADM_new)
real(8),intent(in) :: phi(0:n)
type(ADM),intent(out) :: ADM_new
end subroutine subini
end interface
end module
interface文を付け加える前はコンパイルできていました
interface文を付け加えたところ、
宣言式オブジェクトは仮引数あるいは親子結合、参照結合によって
アクセス可能なオブジェクトでなければなりません。MMAX
と
この派生型名は宣言されていません。[ADM]
というエラーが出ます。
mmaxとADMはちゃんと上に宣言しているんですが
interface文のなかに書く必要がありますか?
mmaxとADMは共有されているはずなんですが・・・。
849:デフォルトの名無しさん
12/04/17 22:31:47.35
>>848
まず、real(8),parameter :: n = 500 はintegerの間違いだろう。
さて本題だが、importをつければいくはず。
interface
subroutine subini(phi,ADM_new)
import
real(8)云々
説明は面倒なので、reference manual のimportの部分を呼んでくれ玉へ。
850:デフォルトの名無しさん
12/04/17 23:21:19.78
980を超えて一定時間書き込みがないスレは落ちる。
気になるなら「即死判定」でググれ
851:デフォルトの名無しさん
12/04/18 04:01:29.62
>>849
出来ました。ありがとうございます。
関連する質問をもう一つしてもよいですか?
メインプログラムと外部サブルーチンの引数の受け渡しが
安全に行われるために、
モジュールにinterface文を加えたのですが、
試しに、メインでreal(8)と宣言した引数を
サブルーチン側でinteger,intent(in)としてみたんです。
そしたら、コンパイル出来てしまったんですけど、
なぜなのでしょうか?interface文が役に立ってません・・・。
>>850
知りませんでした。ありがとうございます。
852:デフォルトの名無しさん
12/04/18 08:34:10.82
>>851
MODULEに突っ込んだルーチンのインターフェースは自動で生成されるから基本的に必要ない。
細部によるから全面的に成り立つわけではないが。
とんでもなく非常識なことを指定なければ、INTERFACEが必要な状況は限られる。
853:デフォルトの名無しさん
12/04/18 09:51:38.53
>>851
いい忘れたが、import命令はFortran2003のの命令なので、F95文法に厳格に従うなら原理主義に従うなら使えない。
その場合はTYPE宣言だけを独立したMODULEにして、そのMODULEをUSEしたMODULEで色々やる必要がある。
854:デフォルトの名無しさん
12/04/18 10:09:10.56
>>852
モジュールのなかにサブルーチンは入ってません。
ファイル1=>メインプログラムとサブルーチン。
ただし、containsはしておらず、ただ同じテキストに書いているだけ。
ファイル2=>モジュール。グローバル変数の宣言、タイプ文の定義、
インターフェイス。
です。
Fortan2003でもOKです。
855:デフォルトの名無しさん
12/04/18 12:43:10.69
>>854
悪いこと言わんからサブルーチンや関数はmoduleの中に入れとけ。
interfaceを書かなくて済むんだからこんなありがたいものはない。
856:デフォルトの名無しさん
12/04/19 04:24:58.78
質問があります。
連番のファイル作るコードがありますよね。
たとえば
character(len=12) filename
...
do i=1,100...
write(filename,'(a,i4.4,a)') 'hoge',i,'.dat'
open(10,file=filename)...
write(10,*) ...
close(10)
end do
みたいな感じのやつです。
これを使うとき、
character(len=16) filename
do h=1,10 ...
do i=1,100...
write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat'
open(10,file=filename)...
write(10,*) ...
close(10)
end do
enddo
という風に二重にはできないのでしょうか?
上のようにプログラムを書いたら正常に動きましたが、下に書いたようにプログラムを変更したらコンパイルはできたのですが、動かすと
startint: error in format apparent state: internal I/O last format: (a,l2.2,i2.2,a) lately writing sequential formatted internal IO Aborted (コアダンプ)
とでてしまいます。
何か解決策はないでしょうか?
857:デフォルトの名無しさん
12/04/19 09:44:57.14
>write(filename,'(a,h4.4,i4.4,a)') 'hoge',h,i,'.dat'
エラーメッセージにも書いてあるように h4.4 がおかしい。i4.4 (または i は二桁だから i2.2) にすればいいんでね?
858:デフォルトの名無しさん
12/04/21 20:45:16.28
Windows 用の Fortran コンパイラの中で,実行ファイルの速度が
一番高いのはどれでしょうか? (‥‥なんか日本語変だな)
Absoft Pro Fortran 2012 なんかは,どうなんでしょう?
859:デフォルトの名無しさん
12/04/21 22:25:30.52
>>858
速いのはインテルかPGIでないかな。文法に正格で厳しいのはNAG。
intel CPUならintelだろうが、AMD向けにコンパイラの最適化をやっていなかったとして公正取引委員会から叱られたからAMDの場合は微妙かも。
Absoftは元々はMacがメインだったという歴史的経緯もある。
IntelはDECのF95、AbsoftはCrayのF90フロントエンドを使っていたのでそういう因縁があればそれで選ぶのもよいかも。Laheyは富士通。
とはいえもう10年ぐらい前の話か。
860:858
12/04/21 22:31:03.30
>>859
早速の詳しいお答え,ありがとうございました m(_ _)m
861:デフォルトの名無しさん
12/04/22 12:46:26.21
parameter ではなくて、実行文中で一度値を代入したら
以降は値を変えられないような型はありますか?
862:デフォルトの名無しさん
12/04/22 15:35:21.79
MODULE変数にPROTECTED属性をつければ、MUDULE内部ルーチンからなら変えられるが、外部からは変えられない。
参考
URLリンク(www.nag-j.co.jp)
863:デフォルトの名無しさん
12/04/24 00:05:18.04
ありがとうございます
864:デフォルトの名無しさん
12/04/24 22:35:39.99
1/2,1/3,1/4・・・を順に加えていって、何個加えたら10を超えるか調べるプログラム
DO WHILE文を用いる
ぜんぜんわからないのでよろしくお願いします
865:デフォルトの名無しさん
12/04/24 23:13:38.99
iの初期値=1
jの初期値は0(整数型だと間違いなので注意)
①
i=i+1
j=j+(1/i)
j=<10でループアウト
j条件にならないなら①にもどる。
i-1回だよ
866:デフォルトの名無しさん
12/04/24 23:31:00.10
program nichan
implicit none
real :: x
integer :: i
i = 0
x = 0.0
do while (x < 10.0)
i = i + 1
x = x + 1.0 / REAL(i)
end do
print *, i, x
stop
end program nichan
オイラー常数を考えると、Σ1/i ~ ln N + 0.577 >10 , ln N ~ 9.423, exp(9.423) =12369.6
プログラムを実行すると 12,367
867:デフォルトの名無しさん
12/04/24 23:34:26.79
ホストをIntelに既定せずにOpenCLなどでGPGPUにすればPCレベルでも演算は速いよ。
安物でもTflopでるよ。
安物の場合は計算が正しいか事前チェック要
最適解を求めるなら最適解の値とその前の値を保存すれば
その値を使い結果を普通に検算すればいい。
フィルタの最適化などなら十分使える。
コンパイルが適切で計算式が適切でも結果が正しいとは限らない事があるので検算は大切。
868:デフォルトの名無しさん
12/04/24 23:36:35.80
設問に1/1は入っていないのだが
869:デフォルトの名無しさん
12/04/24 23:58:21.64
答えをそのまま書いては学習にならんだろう
870:デフォルトの名無しさん
12/04/25 23:27:40.03
FortranとOpenCLの組み合わせの場合も、やっぱGPU側に送るルーチンは特殊なCで書くのか?
871:デフォルトの名無しさん
12/04/26 01:55:24.39
整数Nを読み込み、1+1/1!+1/2!+1/3!+・・・+1/n!の値を計算して出力するプログラム
このプログラムを級数の項数Nを入力するかわりに、DO WHILE文を用いて級数の項の大きさが10**(-4)以下になったとき、級数の和の計算を止めるプログラムに書き換える
さらに、結果の出力として
1)収束した時の項番N
2)級数の和S
3)級数の和SとEXP(1.0)との差
を表示する
夜遅くにすいません。よろしくお願いします
872:デフォルトの名無しさん
12/04/28 01:10:24.07
宿題スレなのか?
n = 1
s = 1
x = 1
do while (log10(x) < 4.0D)
! 階乗の逆数を s に足し込み
! n と x を更新
end do
! 結果出力
873:お願いします
12/04/30 19:21:28.96
fortranについて
2次元配列において(1000,1000)このデータのうち(200:300、100:400)だけ取り出しました。
このときwrite文で書きだす時、取り出したデータだけでなく、配列の個数自体とりだしたいのですがどうすれば
よろしいでしょう?
たとえば
結果が
200 100 10.4←これは配列の中身のデータ
201 100 2.0
202 100 4.8
203 100 5.7
・
・
・
200 101 5.6
201 101 7,9
202 101 7,9
203 101 8,0
・
・
・
200 102 6.8
201 102 15.9
202 102 26.1
・
・
・
298 400 2.2
299 400 3.2
300 400 3.6
このような感じです。よろしくお願いし
874:デフォルトの名無しさん
12/04/30 19:40:00.17
質問の意味がよく分からんが、取り出した部分の総要素数という事なら、COUNT命令でおk?
COUNT( x(200:300, 100:400) )
875:デフォルトの名無しさん
12/05/03 21:48:11.69
初期値X(0)=1としてK=1,2,3・・・の順にX(K)=cos(X(K-1))を繰り返して、|X(K)-X(K-1)|<0.00001になったら反復を打ち切り、
1)反復回数K、2)Xの近似解、3)近似解の誤差を出力するプログラム。DO WHILE文を用いる
876:デフォルトの名無しさん
12/05/03 22:09:42.36
簡単過ぎる。もっと難しいの持って来い。
877:デフォルトの名無しさん
12/05/04 00:01:35.98
基礎演習の宿題なんでお願いします
878:デフォルトの名無しさん
12/05/04 10:11:32.40
program twochannel
implicit none
real :: x
integer :: k
k = 0
x = 1.0
do while ( abs(cos(x) - x) >= 0.00001 )
k = k + 1
x = cos(x)
end do
print *, 'number of iterations', k, ' root', x, ' error', abs(x - cos(x))
stop
end program twochannel
879:デフォルトの名無しさん
12/05/08 11:36:16.14
もう一つあったFortran スレ落ちたねw
880:デフォルトの名無しさん
12/05/09 01:30:31.73
二次探索法のアルゴリズムに従って、解の存在範囲の上限XRと下限XRの初期値を入力し
f(x)=x-cos(x)=0の解を繰り返し処理(DO WHILE)で求め、
1)近似解、2)繰り返し計算の回数、3)方程式f(x)の誤差を表示するプログラム(収束の許容精度EPSは10の-5乗)
881:デフォルトの名無しさん
12/05/09 01:36:39.70
二分探索法だろ、問題分もまともに写せないのかよ。小学校からやり直せ!
882:デフォルトの名無しさん
12/05/09 01:57:45.71
適当に問題文を書き写して末尾に「プログラム。」と書くと
頼まなくても答を書いてくれるプログラム。
883:デフォルトの名無しさん
12/05/09 02:16:52.55
教員側もこのスレ見てたりして
884:デフォルトの名無しさん
12/05/09 02:20:11.69
答え書いてとお願いしているわけではないからセーフ。
885:デフォルトの名無しさん
12/05/09 13:45:54.29
答えもらって丸写ししたら
カンニングと同じなんだけど
底辺大学あたりだと
「人に聞いた」事が評価されるからなぁ
886:デフォルトの名無しさん
12/05/09 19:04:29.06
>>883
見ているw
887:デフォルトの名無しさん
12/05/09 23:58:47.57
program twochan
implicit none
real, parameter :: eps = 1.0e-5
real :: x, xroof, xfloor, xr, xf
integer :: i
1 print *, 'input lower and upper range of x'
read *, xfloor, xroof
if ( f(xfloor) * f(xroof) > 0.0 ) then
print *, 'inappropriate inputs! '
goto 1
end if
xf = xfloor
xr = xroof
x = 0.5 * (xf + xr)
i = 0
do while ( abs( f(x) ) > eps )
i = i + 1
if ( f(x) * f(xr) > 0.0 ) then
xr = x
else
xf = x
end if
x = 0.5 * (xf + xr)
end do
print *, 'a root of equation x - cos(x) = 0 ', x, ' no. of iterations =', i, ' absolute difference ', abs(f(x))
stop
contains
real function f(x)
real, intent(in) :: x
f = x - cos(x)
end function f
end program twochan
888:デフォルトの名無しさん
12/05/10 00:01:01.37
入力例
input lower and upper range of x
0.5 0.7
inappropriate inputs!
input lower and upper range of x
0.5 0.8
a root of equation x - cos(x) = 0 0.7390808
no. of iterations = 13
absolute difference 7.1525574E-06
続行するには何かキーを押してください . . .
先生! おれ DO WHILE 嫌いなんで、条件緩めて下さいw IF () EXIT ; END DO の REPEAT UNTIL 派なんです。