トップページ⇒tech
991コメント434KB

FORTRAN �W

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/12(日) 17:13:35
FORTRAN総合スレッドです。
FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。

・FORTRAN関連情報
お約束だが、まずは自分で調べよう
http://www.google.co.jp/

x86で動作するFortranコンパイラ
http://www.nminoru.jp/~nminoru/programming/x86-fortran.html

The Fortran Company
http://www.fortran.com/
Polyhedron Software
http://www.polyhedron.co.uk/
Google Directory - Fortran
http://directory.google.com/Top/Computers/Programming/Languages/Fortran/

・前スレ
FORTRAN III
http://pc8.2ch.net/test/read.cgi/tech/1104724162/
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0558デフォルトの名無しさん2009/05/15(金) 01:22:11
>>556.
>新しい規格ではかなり自動で調整してくれる
へーそうなんだ
いちいちallocateしなくてすむのは嬉しい
05595482009/05/17(日) 22:24:17
>>556>>557
フォロー、ありがとうございます。
allocateでintel fortranでも無事動くようになりました。
てか、2003いいね。期待大。
0560デフォルトの名無しさん2009/05/21(木) 00:38:15
スレ違いだったら失礼します

FORTRANで他からデータを読み込むのに、そのデータの最初にデータ概要が書いてあるので
読み飛ばす方法があったら教えてください

初心者なので分かりにくくてすみません
0561デフォルトの名無しさん2009/05/21(木) 01:30:02
>>560
適当な変数を定義して、読み込みだけさせて、その中身を
使わなければいいぢゃない。嘘データで良いから実例だし
てくれ。

# リアルなのを晒すとマズいかもしれんし。
0562デフォルトの名無しさん2009/05/21(木) 01:54:07
>>561数字を読み込んで並べるだけなのですが


読み込むデータが

○月×日
気象データ
東京都日黒区

0.0001
0.0025
0.0025
0.0105
0.1568
1.5385
1.4657
12.368

こんな感じで数字の部分のみ読み込みをしたいです
0563デフォルトの名無しさん2009/05/21(木) 02:05:29
データ構造が既知ならば読みたいところまで回していけばいいし、
レコード長が分かってれば指定のレコード部を直接読みに行ける、はず

もっと良い方法あったらフォローよろ
05645632009/05/21(木) 02:08:22
あ、sequentialで書いたファイルをdirectで読む(あるいはその逆)って、できないんだっけ?
自信なくなってきた><;
0565デフォルトの名無しさん2009/05/21(木) 02:15:57
>>563すみません、もう少し詳しくお願いできますか?
0566デフォルトの名無しさん2009/05/21(木) 09:45:54
>>562
いくつか方法はある。
最初のデータ概要の行数が決まっていて一定ならば簡単で、
CHARACTER TEXT*256
DO i = 1, 4
READ(7, *) TEXT
END DO
的に読み飛ばせばいい。

手抜きな方法としては、数値変数に文字列を読み込むとエラーが出ることを利用して、
10 CONTINUE
READ(7, *, ERR= 10) dat
で無理に読み飛ばすことも出来る。
本物のエラーのときや、データ概要が数値として読めてしまうと困るw

やや高度な方法としては、いったん文字列に読み込んで、その文字列の中身をしらべて
文字列を内部ファイルとして入力に使って数値を読むという方法もある。

データ開始地点まで適当にすすんで、BACKSPACEで適切なところまで戻る手もある。
0567デフォルトの名無しさん2009/05/21(木) 12:20:07
>>566
2つ目の手抜き法はオイラもよく使う。
念のため、

icount = 1
20 continue
read(7,fmt=*) string
read(string,fmt=*,err=10,end=999) dat(icount)
icount = icount + 1
goto 20
10 write(*,*) string
goto 20
continue 999

みたいに文字列を一度かまして
読み込みは内部ファイルで処理して、
飛ばされたケースは表示させて目でチェックするとか。
あまりほめられないスパゲッチ〜だけど。
0568デフォルトの名無しさん2009/05/23(土) 20:59:00
>>562
本気でスピード求めるならdirectアクセスがベストだが
多分あなたの使い方じゃそうじゃなさそうだから、普通に次々読んでいって
使わないデータは破棄しちゃえばいいじゃん

>>562がASCIIデータだとすると、5行目からの数字が欲しいなら、
do i=1,5
read(unit) tmp
enddo
とやって捨てちゃえばいい
0569デフォルトの名無しさん2009/05/23(土) 21:16:21
読み捨てるなら

DO I = 1, 5
READ(NUNIT, *)
END DO

でおk
0570デフォルトの名無しさん2009/05/23(土) 23:01:20
そっか、捨てるんだから何もいらないか
0571デフォルトの名無しさん2009/06/09(火) 12:40:21
FORTRANがCOLUMN-MAJORなことを調べてみたいのですが、
変数のポインタ値を知る方法はありますか?
0572デフォルトの名無しさん2009/06/09(火) 12:49:09
>>571
無いが、サブルーチンに送ればわかる。
つまり、2次元配列を、サブルーチンの1次元形式引数の配列に渡せばよい。
0573デフォルトの名無しさん2009/06/09(火) 13:18:41
ありがとうございます。確かにWRITEなんかにわたすことで
順番を知ることはできるのですが、メモリ上の位置を知ることは
できないのですね
0574デフォルトの名無しさん2009/06/09(火) 13:32:54
>>573
標準文法ではないが、LOC 関数などがベンダー拡張として用意されていることが多い。

またリンカーでマップを出力させると静的な変数ならばアドレスが分からなくも無い。
配列のならびに関しては、そのままでは分からないが、さらに EQUIVALENCE でも
かければ分かるのかもしれない。
0575デフォルトの名無しさん2009/06/20(土) 14:16:58
IFort10.1+マルチコア環境で使ってる人いるかな
OPENMPで並列化してるんだけど、
デュアルコア環境でトータルCPU使用率が50%から上がらない理由わかる?
1コアしか使ってなくて2コア目がアイドルになっちゃう
0576デフォルトの名無しさん2009/06/20(土) 14:21:55
OSによるだろうけど、
setenv なんたら、
をちゃんとしてる?
05775752009/06/21(日) 16:49:20
setenvはよくわからないんだけど、OPENMP+自動並列化で5スレッド走ってる
環境はOSがXPProSP3で、Core2DuoE8500
0578デフォルトの名無しさん2009/06/21(日) 18:23:29
OpenMPの場合は、環境変数でCPUの位置をbindしてやらないといけないんだっけ?
自動並列も同じだっけかな?

誰か詳しい人の降臨を待つしかないなw
0579デフォルトの名無しさん2009/06/22(月) 09:45:02
>>577
なぜ最初からWinXPだとかけないのだろうか?
自分が使ってるlinux+ifort9.1では、
setenv OMP_NUM_THREADS 8 (最後の8は適当なCPU数に置き換え)
で環境変数で並列数を指定することになってるけどな。Linuxでもシェルごとに違うはずだが。
実機がないのでWinXPだとどの程度違うのかわからんが、Intel提供の例では
setenv を set に換えるだけのようだ。
全体の監視&同期とり用のあまり忙しくないスレッドが1個走るはずだけど、
全部で5つはなんか多い気もするがそんなものかもしれない気もする。
>>578
CPUの位置のバインドは自動並列やらOpenMPの場合、Linuxでは dplace や taskset を使うな。
指定しないとふらふら移動することがあるからややこしい。

まあ詳しいWin機でいじくりまくってる神の降臨を待とう。Winでの並列に興味あるし。
05805752009/06/22(月) 17:58:29
自己解決したので報告

ProcessExplorerでスレッドの状況を調べてたら、メインスレッド以外無負荷だた
並列化を見直して負荷をかけるようにしたら100%まで掛けられるようになった

迷惑掛けてスマソ
0581デフォルトの名無しさん2009/06/22(月) 23:05:58
>>579
WinでのCPUバインドは環境変数でできた。
マニュアルに載っているはず。
イ7でハイパースレッディングの8コア運用していると、ちゃんとバインドしないと
性能が全く出ない。デフォで8スレッド運行してバッティングするし、4スレッドにしても
物理コアに割り当たるとは限らないようで放置プレイでは性能でない。
0582デフォルトの名無しさん2009/06/23(火) 16:54:00
>>581
環境変数でCPUバインドっていうのは、別にWindowsに限らず他も同じだと思う。
Intel FortranだとKMP_AFFINITY、PGI FortranだとMP_BLISTかな。

というか、いい加減環境変数の設定とかをユーザにやらせるんじゃないくて、
コンパイラがシステム構成を見ながら勝手に使うCPUを指定してくれればいいのに…。
どういうスレッドの配置が効率がいいかなんて、予想できそうなもんなのに。
05835562009/07/09(木) 23:41:32
>>555
最近になって、Intel掲示板を見ていてようやく分かったが、オプションをつけないと
駄目らしい。

/assume:realloc_lhs

これをつけるとFortran2003解釈、つけないとFortran90/95解釈になるらしい。
0584デフォルトの名無しさん2009/09/07(月) 13:50:42
age
0585デフォルトの名無しさん2009/09/08(火) 07:43:50
>>583
お、参考にしよう。

おまけ・・・になるのか知らないけどw
メインがCでFortranコードをサブルーチンとして呼び出してリンクするときは
締めの実行ファイル生成時には icc でリンクして実行ファイルつくってもいいけど、ifort で
ifort -nofor_main -no-ipo
ってやると振る舞いが礼儀正しい事が多い、気がする。
-no-ipo はリンクするときだけね。これがないとifortは無茶をするようだw
0586デフォルトの名無しさん2009/09/27(日) 01:29:32
>>nag の fortran 入門でおk
0587デフォルトの名無しさん2009/09/27(日) 05:35:56
CERNLIBのmathlibのラッパをモジュールで作ろうと思っているのだけれど、
gfortranで例えば自己完結している共有オブジェクト(.soファイル)って
作れるもんなの?
一々$(cernlib -G Motif mathlib)をつけてコンパイルするの
面倒くさい。
ライブラリ作ったこと無いんでアレゲな文章だが、もし誰かわかるのなら。

ちなみに、OSはUbuntu8.04な。
0588デフォルトの名無しさん2009/09/27(日) 07:43:50
追加で質問なんですが、
http://wwwasdoc.web.cern.ch/wwwasdoc/shortwrupsdir/b100/top.html
のラッパーとして
http://gist.github.com/194480
というのを書いて
program main
use FunctionBinom
implicit none
integer::x,y
x=5
y=2
print *,binom(x,y)
end program
でコンパイルしてみると(もち、$(cernlib mathlib)はつけて)
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_integer':
binom.f95:(.text+0x14): undefined reference to `kbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_double':
binom.f95:(.text+0x34): undefined reference to `dbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_real':
binom.f95:(.text+0x54): undefined reference to `rbinom_'
collect2: ld returned 1 exit status
というエラー出る。何で参照先が無いのかさっぱりわからない。
0589デフォルトの名無しさん2009/09/29(火) 00:00:44
>>588
よく知らんが、関数呼び出しの名前規約が食い違っているとか。
エラーメッセージを見る限り、小文字でアンダースコア末尾付与の形式で
オブジェクトを探しに行っているが、確かに存在しているのかね?

名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
0590デフォルトの名無しさん2009/09/29(火) 03:11:28
external binom
つけとく、とか
interface 文で前もって引数部を教えてあげるとか、
_binom みたく下付線つけとくとか、かなあ・・・違うな。う〜ん。
0591デフォルトの名無しさん2009/09/29(火) 22:56:52
>>589
>関数呼び出しの名前規約が食い違っているとか。
他の関数(例えば、票にもあるATGという関数)だとエラー無くできるし、
自分がマニュアル読む限り名前規約の話もないのよね。

>名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
バイナリエディタは避けたい。名前一覧どうやって出力させればいい?

>>590
モジュラー性上げたいのでexternalを使いたくないのよ。
引用仕様記述は書いてあるよ。
0592デフォルトの名無しさん2009/09/29(火) 23:04:23
スパコンの人じゃないのでわからないけれど、スパコンの人たちって
CERNLIBとかは使わず、何のライブラリ使っているの?NAG?
フリーであるならそのライブラリのラッパに鞍替えするわ。
0593デフォルトの名無しさん2009/09/30(水) 10:40:07
自作に決まってるだろ
他人のライブラリなんか遅くて使えないし
0594デフォルトの名無しさん2009/09/30(水) 12:41:03
>>593
なぬ。それスパコン業界の一般論?>>593が自作好きというわけじゃなく?
新しいアルゴリズムで作る、というのならわかるのだけれど、
それ以外の速度的にもう上げられないだろう、上げる必要も無いだろう的
関数も自作かい。
0595デフォルトの名無しさん2009/09/30(水) 15:42:43
行列ソルバに関しては、やっぱまだまだ自作の余地があるんじゃないの?
スパコンのアーキテクチャによって最適なアルゴリズムは違うだろうし。
x86なスパコン(クラスタというべきか?w)なら適当な余所様のライブラリでいいかもしれないけど。
0596デフォルトの名無しさん2009/10/01(木) 02:38:44
>>591
>バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
ライブラリアン用のコマンドを使えば、一覧出せると思う。
メインフレームなら出来たw

>>594
ライブラリはその性質からどうしても汎用だから、自分の問題に合わせた
特殊条件を使って早くすることはあるな。
0597デフォルトの名無しさん2009/10/01(木) 12:47:41
なるほど。個人的な話だけど、いろんなことが繋がったわ。
ライブラリは確かに汎用的じゃないといけないわな。

行列ソルバ、つーか固有値計算は興味深い。
アルゴリズム色々調べているけど、最新のアルゴリズムってなによ?
まぁ特許とられて普通に使えないんだろうけど。
よく知らないけれど、アルゴリズムに特許はかけられるよね?
アルゴリズムを実装したアプリケーションに対してのみ特許かけられるんだけっけ?
0598デフォルトの名無しさん2009/10/01(木) 12:48:45
>>596
>ライブラリアン用のコマンドを使えば、一覧出せると思う。
お礼言うの忘れてた。トンクス!
0599デフォルトの名無しさん2009/10/01(木) 13:13:45
アルゴリズムなんかで特許とんのは浅ましい・・・
そんなふうに考えていた時期が(ry
0600デフォルトの名無しさん2009/10/06(火) 10:10:52
do 600 i = 1, 100
  write(*,*) '600 get'
600 continue
0601デフォルトの名無しさん2009/10/10(土) 13:11:05
module mod
interface iface
integer function func(i, j)
integer :: i, j
end function func
end interface iface
end module mod

integer function func(i, j)
use mod
integer :: i, j
func = i * j
return
end function func

program main
use mod
print *, iface(10, 20)
end program main
-------------------------------------------------------
func = i * j
1
Error: Name 'func' at (1) is an ambiguous reference to 'func' from current program unit

上記のようなエラーがでてコンパイルできません
moduleを使わない、あるいはfunctionではなくsubroutineならコンパイルできました
ひょっとして総称名はfunctionには使えないんでしょうか?
0602デフォルトの名無しさん2009/10/10(土) 14:29:25
>>601
integer function func(i, j)
の中の
use mod
が不要なのでは
0603デフォルトの名無しさん2009/10/10(土) 15:44:58
>>602
できました。ありがとうございます
参考にしたサイトが間違っていたようですね
0604デフォルトの名無しさん2009/10/10(土) 16:32:59
....その言い草はねぇだろうww
0605デフォルトの名無しさん2009/10/10(土) 22:01:30
>>604
だったらそのサイトのURLを教えて欲しい
0606デフォルトの名無しさん2009/10/10(土) 22:03:42
安価間違いました>>604じゃなく>>603です。すみません。
0607デフォルトの名無しさん2009/10/10(土) 22:14:02
さらしていいものなのかな?
ttp://www.geocities.jp/eyeofeconomyandhealth/homepage/module2.html#t
ここなんだけど副プログラムのほうにもuseしろって書いてありました
0608デフォルトの名無しさん2009/10/13(火) 03:37:16
まずはgeocitiesごときにあるサンプルを鵜呑みにした自分を責めるところから始めるんだ
0609デフォルトの名無しさん2009/10/14(水) 00:33:47
>>609 (インデント用)

module mod
contains
real function call_func(func, arg)
interface
real function func(arg)
real, intent(in) :: arg(2)
end function func
end interface
real, intent(in) :: arg(2)
call_func = func(arg)
return
end function call_func
end module mod

real function func(arg)
real, intent(in) :: arg(2)
func = arg(1) * arg(2)
return
end function func

program main
use mod
external func
real :: arg(2) = (/ 2.0, 3.0 /)
! dummy = func(arg)
print *, call_func(func, arg)
stop
end program main
0610デフォルトの名無しさん2009/10/14(水) 00:36:31
>>609のコメントアウトした部分のコメントをはずすとコンパイルも通り、正常に動作するんですが
コメントアウトするとなぜかコンパイルすらできません
理由がさっぱりわからないんですが、なにが問題なんでしょうか?

コンパイラはgcc 4.2.4

エラーメッセージは↓です
print *, call_func(func, arg)
1
Error: Type/rank mismatch in argument 'func' at (1)
0611デフォルトの名無しさん2009/10/14(水) 00:43:12
>>610
Intel VF 11.046 なら通る。
0612デフォルトの名無しさん2009/10/14(水) 01:54:59
回答有難う御座います
gccコンパイラのバグということでしょうかね
汎関数を引数にもってる関数の総称名をつけようとするとコンパイルできなかったり(これは仕様?)
0613デフォルトの名無しさん2009/10/14(水) 03:35:23
>>612
PRINT文のバグ臭いな。
FUNCTIONの返り値が、VALUEなのかADDRESSなのか今一不明なので
77時代からFUNCTIONの返り値を代入を経ずに使うと、機種依存の振る舞いを
することが良くあった。
最近は大丈夫なことが多いが。

関数引数の総称名は、IVFでは出来た。多分、仕様上では出来ておかしくないと思う。

MODULE m_unko

INTEGER, PARAMETER :: kd = SELECTED_REAL_KIND(14)

INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE

ABSTRACT INTERFACE
REAL FUNCTION x_f(a)
REAL, INTENT(IN) :: a
END FUNCTION x_f

REAL(kd) FUNCTION d_f(a)
IMPORT
REAL(kd), INTENT(IN) :: a
END FUNCTION d_f


END INTERFACE

06145562009/10/14(水) 03:36:04
CONTAINS

REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
PROCEDURE (x_f) :: f
sub1 = f(x)
RETURN
END FUNCTION sub1

REAL(kd) FUNCTION sub2(f, d)
REAL(kd), INTENT(IN) :: d
PROCEDURE(d_f) :: f
sub2 = f(d)
RETURN
END FUNCTION sub2

END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
REAL(kd) :: d
PROCEDURE (x_f), POINTER :: f
PROCEDURE (d_f), POINTER :: g
x = 4.0 * ATAN(1.0)
d = 4.0_kd * ATAN(1.0_kd)
f => SIN
g => DSIN
PRINT *, gen(f, x)
PRINT *, gen(g, d)
STOP
END PROGRAM unko
0615デフォルトの名無しさん2009/10/14(水) 21:01:13
>>613,612
サンプルコードありがたいんですが、コンパイルできませんでした
abstract interfaceのところで最初のエラーがでるので原因を調べたんですが
hpとintelのマニュアルを検索してもabstract interfaceの項目が見つからりませんでした・・・
0616デフォルトの名無しさん2009/10/15(木) 01:08:20
>>615
ABSTRACT INTERFACE はF2003の機能で、まだIntelのHelpに載ってないが、実装されている。
Crayとか(多分)IBMのマニュアルなら載っていると思う。まぁ素直にFortran95/2003 Explainedを
見るのがいいと思うが。GoogleBooksでもページが飛ばされてなければ見られる。
しかし、これは本質ではない。二度Interfaceを書くのが面倒だったから使ったまで。

これならどうだべ?
MODULE m_unko

INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE

CONTAINS

REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
INTERFACE
REAL FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub1 = f(x)
RETURN
END FUNCTION sub1
0617デフォルトの名無しさん2009/10/15(木) 01:09:15
INTEGER FUNCTION sub2(f, x)
REAL, INTENT(IN) :: x
INTERFACE
INTEGER FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub2 = f(x)
RETURN
END FUNCTION sub2
!
REAL FUNCTION rmult2(x)
REAL, INTENT(IN) :: x
rmult2 = 2.0 * x
RETURN
END FUNCTION rmult2
!
INTEGER FUNCTION imult2(x)
REAL, INTENT(IN) :: x
imult2 = INT( 2.0 * x )
RETURN
END FUNCTION imult2
END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
x = 4.0
PRINT *, gen(rmult2, x)
PRINT *, gen(imult2, x)
STOP
END PROGRAM unko
0618デフォルトの名無しさん2009/10/15(木) 18:46:55
>>616,617
有難うございます。コンパイルできました。完璧です
主プログラムにinterfaceを書く方法は見つけたんですが
moduleにくくってしまえばinterfaceを書かなくてもできるんですね
0619デフォルトの名無しさん2009/10/16(金) 08:07:09
FORTRANやめますか?人間やめますか?
0620デフォルトの名無しさん2009/10/16(金) 08:50:16
つ DarkBASIC
0621デフォルトの名無しさん2009/10/16(金) 23:00:56
Windows版NetBeansの環境でgFortranを使いたいんだが、
実行ファイルの設定をg77.exeからgfortran.exeに変えるだけでok?

もし、そのほかに設定事項等あれば教えて欲しい
0622デフォルトの名無しさん2009/10/17(土) 20:44:18
moduleでオブジェクト指向っぽいことができるのはわかったんですが
c++とかでいうインスタンスを作ることはできないんでしょうか?
0623デフォルトの名無しさん2009/10/17(土) 22:43:57
>>622
F2003なら出来る。F95以前では出来ない。
0624デフォルトの名無しさん2009/10/17(土) 23:13:19
こんな感じかな?
とりあえず、IVF 11.1 では通った
誰か Fortran 95/2003 Explained の日本語訳作って

module mod1
implicit none
type Circle
real :: d
contains
procedure :: area => func1
end type Circle

contains
real function func1(this)
class(Circle) :: this
func1 = (this%d ** 2) * 3.14 / 4.0
end function func1
end module mod1

program main
use mod1
implicit none
type(Circle) :: c
c%d = 10.0
print *, c%area()
end program main
0625デフォルトの名無しさん2009/10/18(日) 16:52:26
>>624
ありがとうございます
残念ながらgfortranでは2003が使えないようなので試せませんが・・・
0626デフォルトの名無しさん2009/10/19(月) 14:40:01
実際、FortranでOOPはどうなの?
イラネって意見も散見するが・・・
0627デフォルトの名無しさん2009/10/19(月) 16:11:22
乱数とか行列?
0628デフォルトの名無しさん2009/10/19(月) 17:25:58
>>626
それで速度が落ちるならイラネ。落ちそうな気しかしないけど。

中田育男『基礎FORTRAN』(岩波書店)のコラムに

FORTRANでもCOMMON文とENTRY文を使って、オブジェクト指向設計に
従ったプログラムを書くことができる。

とあったけど、具体的なことは何も書いていなかった。
0629デフォルトの名無しさん2009/10/19(月) 17:54:29
FORTRANで無理矢理それっぽいことをやったらどうなるかという例が
「オブジェクト指向入門」34章にあるようだ
http://www.seshop.com/detail.asp?pid=9505&mode=spec

俺は初版しか読んでないけど、今でも事情は変わらんでしょ
0630デフォルトの名無しさん2009/10/19(月) 20:01:44
>>629
読んでみたいけど、ちょっとお値段が・・・
そういやまともなオブジェクト指向の本を読んだことは一度もないや
良い機会だから買ちゃおうかしら
0631デフォルトの名無しさん2009/10/19(月) 20:18:28
>>628
> COMMON文とENTRY文を使って、オブジェクト指向設計に

なぜかはわかりませんが、イヤな予感しかしません・・・
0632デフォルトの名無しさん2009/10/19(月) 20:42:47
というか、OOP用に作られてない言語で安全なOOPをするのって無理だし・・・
安全でないOOPなんてOOPのメリットないに等しいし・・・

素人は大人しくJavaやC#使うほうが幸せになれる
0633デフォルトの名無しさん2009/10/19(月) 21:13:30
>>629
初版のはFORTRAN77でトリッキーなカプセル化をする話だけだったから
たぶん>>631>>632の言う通り

今実際どうなのか
俺は2003とか不勉強なんでわからん
0634デフォルトの名無しさん2009/10/20(火) 00:37:24
>>633
そういわず、2003を勉強しようぜ!
ばりばりOOPでなくても
TYPE の拡張とかが、入れ子じゃなくて、同じ深さで構造体のメンバーを増やせるし。
OOPでない部分でも結構拡張があって便利。


日本語 パワポ
ttp://www.itscj.ipsj.or.jp/forum/forum2008SC22fortran/Fortran20032008.pdf
英語
ftp://ftp.nag.co.uk/sc22wg5/N1551-N1600/N1579.pdf
0635デフォルトの名無しさん2009/10/20(火) 01:07:43
正直、OOPとそうでないものの違いがよくわかんない。
暴力的な書き方だけど、「因果関係が一意」という点では同じだし。
C++しか扱ったことないしあまり深く触らなかったからだけど、
OOPの深淵に辿り着かないと判らない機微もあるのだろうけどな。
0636デフォルトの名無しさん2009/10/20(火) 02:20:34
>>629
どんな感じのことを言ってんすか?
簡単に教えてくだしあ
0637デフォルトの名無しさん2009/10/20(火) 05:21:22
>>636
たいした話じゃなくて
ENTRY文をメソッドの代わりにしてカプセル化をまねるだけ。
継承とかそういう話はないし、動的にオブジェクトを作れるわけでもない。
本来の使い方でもないから危なっかしい。
ただ、それでも素のPascalよりは気がきいてるってことなんだなw

今じゃ2003もあるし
第二版はどうなってるか知らないよ。
0638デフォルトの名無しさん2009/10/20(火) 05:43:47
>>635
自分で書く分にはOOPは邪魔なだけだよ
OOPが真価を発揮するのは他人のライブラリを使うとき。
0639デフォルトの名無しさん2009/10/20(火) 12:58:28
ENTRY文はバグでやすいな。
COMMONの代わりに、共有変数を実現するのに、77でENTRY使ったが、かえってめんどかったw


0640デフォルトの名無しさん2009/10/21(水) 10:41:26
>>637
thx
2003でOOPを謳ってるってことは、ある程度まともには作られてんだろうね多分。
アドレス指定で偶然にそのインスタンスを破壊しちゃう、なんてリスクはないように
出来てるんだろう・・・(どうやって実現してんのかさっぱり想像できないけど)
0641デフォルトの名無しさん2009/10/21(水) 21:31:44
すいません。最近始めた超初心者です。
簡単なシミュレートで
open(10,file='testout.out',status='unknown',form='formatted')
do n=0,nmax
   計算略
write(10,30) t, a(1),a(2),a(3)
30 format(1H ,4(1pe12.4))
enddo
こんな感じで配列の値を表示しようと思うのですが
なぜか出力ファイルが改行されません><
g77でコンパイルしています。コンパイルはできるのですが・・・
どなたかファイルに出力するときの改行の仕方をご教授していただきたいのです
お願いします
0642デフォルトの名無しさん2009/10/22(木) 18:39:19
>>641ですが
出力ファイルをdosに直してませんでした
自己解決しますた
フォートランはフォーマット文がわかりにくいなぁ
0643デフォルトの名無しさん2009/10/24(土) 00:54:54
>>642
FORMATの書き方が古い。
まぁg77だから仕方ないのか。
f90で学びなおせばFORMATもそれほどつらくない。
0644デフォルトの名無しさん2009/10/24(土) 03:17:58
Fortran77では動的メモリ割付け(allocate)は使えないの?
0645デフォルトの名無しさん2009/10/24(土) 03:48:06
>>644
使えない。
0646デフォルトの名無しさん2009/10/25(日) 00:06:12
>>644
大きくCOMMONを取って、必要に応じて自分で切り出して使うんだ。
0647デフォルトの名無しさん2009/10/25(日) 00:56:39
>>644
大きくCOMMONがとれない環境なのです。
allocateしないと最大メモリまで使えない。
0648デフォルトの名無しさん2009/10/25(日) 16:16:54
>>647
むかし過渡期の技術としてダイナミックコモンというのがあった。

ひょっとしたらコンパイラのオプションにあるかもしれない。
その場合、普通のスタティックなコモンより大きく領域が取れるかもしれない。


0649デフォルトの名無しさん2009/10/27(火) 14:20:53
>>646
そんなこと教えちゃらめ〜
0650デフォルトの名無しさん2009/10/28(水) 20:57:22
allocateを使うとパフォーマンスが落ちるって本当ですか?
実際に使われるサイズに関わらず?
0651デフォルトの名無しさん2009/10/29(木) 00:56:45
>>650
多分誤解。
静的配列と比べるならば、それは実行時にアロケート処理するのだから余計な時間はかかるだろう。
しかし、それは計算時間に比べれば瑣末なはず。

POINTERで配列をとった場合は、メモリーの割付が連続したメモリー領域になるとは限らないので
最適化がバリバリなされず、ALLLOCATEでとった場合(連続にメモリーを取る)とくらべて
パフォーマンスが落ちる可能性があるとは言われている。
06526512009/10/29(木) 02:15:09
書き方が悪かった。
POINTERにALLOCATEしたときは連続にメモリーを取るだろうが、
POINTERには、ストライド付きのとびとびメモリーを指示させることもできるので、
最適化には制限が係ることがあるようである。

0653デフォルトの名無しさん2009/10/29(木) 10:15:13
>>651,652
なる〜。Fortran77で

i=10000
call hairetu(i)

subroutine hairetu(i)
integer i
real    data(i)

みたいな使い方で任意の大きさの配列data()をサブルーチン内で扱えるけど、
これがメモリ上でキチンと並んでいるとは限らない(とんだ部分
の取り扱いはOSがするのか?)からね。
77より後のallocatable属性は、出来るだけ連続して確保してね、の
おなじないというか願掛けと思えばいいのだろうな。
0654デフォルトの名無しさん2009/10/29(木) 10:49:44
http://codepad.org/lbdDTMLE

moduleが使う変数や関数、サブルーチンを外部から指定したいのですが可能でしょうか?上のコードは間違ってますが雰囲気を掴んでもらえたらいいかなと思い載せました
0655デフォルトの名無しさん2009/10/29(木) 21:41:04
>>651
じゃあもうallocate使わない理由はないな
コードも綺麗になるしな
0656デフォルトの名無しさん2009/11/02(月) 01:28:57
FORTRAN2008では、メモリー連続を保障する contiguous の属性が導入されるようだ。

まだ2003も碌にコンパイラが無い時点で言っても鬼も大笑いだが。
0657デフォルトの名無しさん2009/11/02(月) 01:52:59
>>653
FORTRAN95/2003 Explained 20.2.1 p.331
"A non-pointer array occupies a sequence of contiguous storage sequences 云々"
とあるので、ALLOCATABLE 配列や AUTOMATIC 配列は、連続メモリーが保障されているんじゃないかな。

■ このスレッドは過去ログ倉庫に格納されています