くだすれFORTRAN(超初心者用)その4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/01/24(土) 18:32:01もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。
●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ・バージョン)、エラーメッセージも詳しく書きましょう。
●前スレ
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
くだすれFORTRAN(超初心者用)その2
http://pc11.2ch.net/test/read.cgi/tech/1164121236/
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/
●関連スレ
FORTRAN �W
http://pc11.2ch.net/test/read.cgi/tech/1163319215/
0609デフォルトの名無しさん
2009/09/16(水) 10:31:39>>608
ホンットすみません。DIST2222にしたら通りました。んで、OS再起動して元の名前にしても通りました。
なんかの理由で「中間MODファイルが更新されてない」になってたっぽいです。
プログラム上の問題じゃなかったですね…申し訳ない。
0610デフォルトの名無しさん
2009/09/18(金) 13:09:44LINUXでintelのコンパイラ11をインストールしたのですが、
ifort 実行ファイル
で命令すると、次のようなエラーが出てしまいます。
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
ifort: error #10273: Fatal error in /opt/intel/bin/ia32/fortcom,
それぞれ指定されたファイルを見てもよくわからなかったので、
どうしたらコンパイルできるようになるか、ご教授おねがいいたします。
0611デフォルトの名無しさん
2009/09/18(金) 13:24:41ただLINUXと表現するのではなくて、
ディストリビューションとバージョンをさらすといいかもしれない。
0612610
2009/09/18(金) 13:27:340613デフォルトの名無しさん
2009/09/18(金) 13:41:00「intelコンパイラが想定しているc++の標準ライブラリより新しいものが入ってる」
に一票
どっかから, libstdc++.so.5を拾ってくるしかないと思われる
# これ以上は聞かないで, 犬のことはくわしく知らないw
0614デフォルトの名無しさん
2009/09/18(金) 13:55:39ttp://beken.cc.miyakonojo-nct.ac.jp/wp2/?p=1208 によると
> 私の環境で前もってインストールしておくべきだったものは、以下のパッケージです。
> どちらも[システム]>[システム管理]>[Synaptic パッケージ・マネージャ]でインストールしました。
>
> * g++
> * libstdc++5
>
> libstdc++6は既にインストールされていましたが、libstdc++5はインストールされていませんでした。
> またlibstdc++5をインストールしなくてもifort自体はインストールできちゃいますが、
> プログラムのコンパイルの時に必要になります。インストールしておきましょう。
0615デフォルトの名無しさん
2009/09/18(金) 14:01:50こういう数値計算に使うときは少し古めのにするか、もう少し安定志向な
ディストリにするのが良いと思う。豆知識な。
0616デフォルトの名無しさん
2009/09/24(木) 00:31:120617デフォルトの名無しさん
2009/09/25(金) 00:21:580618デフォルトの名無しさん
2009/09/26(土) 02:36:35したいこと:モジュールに関数オブジェクトを保持させたい。
例えば、モジュールに変数3をセットし後に取得するプログラム
module Test
implicit none
integer,private::a
contains
subroutine set(x)
integer,intent(in)::x
a = x
end subroutine
integer function get()
integer::get
get = a
end function
end module
program main
use Test
implicit none
call set(3)
print *,get()
end program
というものを書くことが出来ます。
同じように、モジュールに関数を保持させることは可能でしょうか?
0619デフォルトの名無しさん
2009/09/26(土) 02:43:36subroutine proceed(f,x,y,step)
interface
double precision function f(x)
double precision::x
end function
end interface
...
end subroutine
と引用仕様記述を書くのではなく、例えばtarget_functionという変数名
に保持してしまって、後は
target_function(x)
というのを呼び出すだけ、みたいなのにしたいのです。
0620デフォルトの名無しさん
2009/09/26(土) 19:24:10integer, private, SAVE :: a
にすればおk?
save無くても大概大丈夫だと思うが。
0621デフォルトの名無しさん
2009/09/26(土) 19:50:23値じゃなくて、できれば関数保持する方法が。
>>618は何したいのかわかりやすくする為の例だったんですけど、
我ながら読むと分かりにくい。
似たような感じで、関数を保持させたいんです。
0622デフォルトの名無しさん
2009/09/26(土) 22:21:48PROCEDURE POINTER で駄目かな?
インターフェースは要るが。
MODULE m_unko
IMPLICIT NONE
INTERFACE
REAL FUNCTION f1(x)
REAL, INTENT(IN) :: x
END FUNCTION f1
END INTERFACE
PROCEDURE(f1), POINTER :: unko
REAL, PARAMETER :: pi = 4.0 * ATAN(1.0)
END MODULE m_unko
!
PROGRAM omeko
USE m_unko
IMPLICIT NONE
unko => SIN
PRINT *, unko(pi)
unko => COS
PRINT *, unko(pi)
STOP
END PROGRAM omeko
0623デフォルトの名無しさん
2009/09/26(土) 22:59:4590以降の機能ですかね?
0624デフォルトの名無しさん
2009/09/26(土) 23:51:06Fortran2003 の機能です。
副プログラムのインターフェースを、一括化できたりします。
インターフェースを書く代わりに、 Procedure (sub0) :: sub1, sub2 など。
type っぽいかんじで。
0625デフォルトの名無しさん
2009/09/27(日) 00:28:40なるほど。ありがとうございます!
0626デフォルトの名無しさん
2009/09/27(日) 05:28:41ありがとうございます。
でも、gfortranの4.2じゃできないっぽいですね。
v4.3以降でサポートなので、v4.3入れてやってみます!
0627デフォルトの名無しさん
2009/09/27(日) 07:50:230628デフォルトの名無しさん
2009/09/28(月) 07:04:01implicit none
do while (.true.)
write(*,*) '627 ありがとう'
end do
end program orei
0629デフォルトの名無しさん
2009/10/03(土) 17:46:130630デフォルトの名無しさん
2009/10/03(土) 17:56:000631デフォルトの名無しさん
2009/10/03(土) 18:18:32あえて理由がない限りは、77はすっとばして90の勉強をしたほうがいいと思うけど
0632デフォルトの名無しさん
2009/10/03(土) 18:18:59やっぱ
プログラミングの入門者には迷著かもしれないが
0633デフォルトの名無しさん
2009/10/03(土) 19:00:12そうは言うがな、大佐。
F90以降は入門書どころか日本語の書籍自体少ないし・・・
0634デフォルトの名無しさん
2009/10/03(土) 19:35:16記憶無いんだが。
90 といえば bit の別冊であったけど、あれも絶版だよね。
単行本にしたらいいのに。あとソフトバンクからも90の本
は大昔に出てたそうだな。どっちも持ってないけど。
0635デフォルトの名無しさん
2009/10/04(日) 02:12:27Bit別冊はMetcalf&ReidのFortran90 Explainedの訳本だから、まぁ今は最新版の原著を買えばいい?
入門書とはいえない気もするが。
0636デフォルトの名無しさん
2009/10/04(日) 19:45:15templateとかクラスがなくて心細いよ
0637デフォルトの名無しさん
2009/10/04(日) 20:23:56物理系?
0638デフォルトの名無しさん
2009/10/04(日) 20:38:020639デフォルトの名無しさん
2009/10/04(日) 21:56:45しかもFortran77
過去の資産有りすぎ
Fortranのサブルーチンは変数が参照渡しだから
他の言語に移植するときめんどい
0640デフォルトの名無しさん
2009/10/04(日) 23:59:4990/95とかだと膜ごしに触っているような感触と言うか。
でもINTENTとかをガチガチに書いた90の方が全般的には気持ちいいが。
2003は実行時の多態化とか入れて便利そうなのは分かるが、また実行時バグが増えそうで
微妙な感じがする。
0641デフォルトの名無しさん
2009/10/05(月) 00:07:32>INTENTとかをガチガチ
計算用の言語としては、この辺で十分な気がする。
十分具体的で十分美しい。かつ十分便利。
もう95位で仕様凍結してくんないかな・・・
0642デフォルトの名無しさん
2009/10/05(月) 02:24:23> もう95位で仕様凍結してくんないかな・・・
同意。色々と弄られるとついて行けなくなりそう。個人的には
Fortran90 で十分と思ってしまうのだが、これは少数派かも。
0643デフォルトの名無しさん
2009/10/05(月) 08:27:30interface 文で呼び出す側で心つもりも教え
pure 属性をつけてインラインしやすくしてあげる
だけど固定書式をつらぬくのが漢!
うそだけど。
固定書式に目が慣れてるといまさら自由書式にしにくいのよね。
右側7文字が空いてないとそわそわしてしまう。
0644デフォルトの名無しさん
2009/10/06(火) 10:09:520645デフォルトの名無しさん
2009/10/09(金) 16:19:470646デフォルトの名無しさん
2009/10/13(火) 19:46:13こんな感じ?
module mod1
interface sub
module procedure sub_int, sub_real
end interface
contains
subroutine sub_int(n)
integer, intent(in) :: n
print *, "INTEGER", n
end subroutine sub_int
subroutine sub_real(x)
real, intent(in) :: x
print *, "REAL", x
end subroutine sub_real
end module mod1
! ---------------
program prog1
use mod1
call sub(1)
call sub(2.0)
end program prog1
0647デフォルトの名無しさん
2009/10/13(火) 20:37:51まさにこれです
ようやっと期待通りにコンパイルできました
有難うございました
0648デフォルトの名無しさん
2009/10/15(木) 04:55:19この例のは、引数の型で振舞を変える事ができるから、標準のmaxやmin関数を連想した。
・・・引数の変数名の数の違いで振舞を変えるもの作れるのかな?
0649デフォルトの名無しさん
2009/10/15(木) 13:56:19任意個数引数の副プログラムは作れないと思う。
Array Constructor で、見かけ上引数を沢山並べるが、引数的には配列として受け取るようにすれば
実現できる気もする。
Call sub( [a, b, c, d, e, f, g] )
Subroutine Sub( x )
Real, Intent (in) :: x(:)
みたいな。
0650デフォルトの名無しさん
2009/10/15(木) 14:41:54今コンパイラを使えない状況にいるので・・、
とりいぞぎお礼まで。
0651デフォルトの名無しさん
2009/10/16(金) 00:37:33補足するならば、[ ] はfortran2003での導入なので、f90的には(/ /)となる。
確定した有限個まででよければ、optional引数を使うとか、1個からn個までのサブルーチンを用意して、
総称名を与える方法も考えられる。
0652デフォルトの名無しさん
2009/10/16(金) 20:54:23最初の宣言部であるパラメータのベクトル p を宣言しようと思って、
real, parameter, dimension(3) :: p(1)=0.5, p(2)=0.8, p(3)=1.6
のように入力したのですが、
Error: Symbol 'p' at (1) already has basic type of REAL
というエラーメッセージが表示されました。ただ、このメッセージの
意味さえ解せない状況です。どなたか正しい方法を教えていただけ
ないでしょうか。よろしくお願いします。
0653デフォルトの名無しさん
2009/10/17(土) 00:53:45こうすれば、おk。
PROGRAM test
IMPLICIT NONE
REAL, PARAMETER :: p(3) = (/ 1.0, 2.0, 3.0 /) ! f90/f95
!REAL, PARAMETER :: p(3) = [1.0, 2.0, 3.0] ! f2003
PRINT *, p
STOP
END PROGRAM test
0654デフォルトの名無しさん
2009/10/17(土) 01:29:41ありがとうございます!
0655デフォルトの名無しさん
2009/10/17(土) 20:19:27そのサブルーチンの中で使ってないmoduleをuseしたりすると
(バグの温床になる以外に)何か弊害ってありますか?
どの変数を使ってるか確認する手間が大きくなり過ぎた場合に
全てのmoduleをどさっとuseしても構わないもんでしょうか?
0656デフォルトの名無しさん
2009/10/18(日) 12:57:28依存関係が無くても、USEされているためにリコンパイルされる可能性があるが、
文法的には問題ないような。
0657デフォルトの名無しさん
2009/10/18(日) 17:41:02ローカルの変数とコンフリクトしたらコンパイラが教えてくれるので
ぜんぜん問題ないと思うけど・・・
どっさりuseしなきゃならんサブルーチンの構成は、
見直した方が幸せになれるかもね
0658デフォルトの名無しさん
2009/10/21(水) 07:49:590659デフォルトの名無しさん
2009/10/25(日) 22:49:38ttp://twitter.com/DoctorFortran
じじい受けするのか?
0660デフォルトの名無しさん
2009/10/26(月) 04:02:09発覚するところが離れてる上に乱数使う手法で、しかもたまにしか起こらないので手の付けようがありません。
ズバッと解決はしないかもしれないけど何か助言をもらえればうれしいです。
0661デフォルトの名無しさん
2009/10/26(月) 05:20:01乱数を使っているなら、種を特定すれば良いんじゃないか?種を手で与える方法もあるんだし。
現象が起きるときの種が分かっていればバグ取りは出来るはず。それだけでは足りないかもし
れないけど、何も情報が無いよりはマシ。
あと、NaNが出る式の実行直前に、式で使う変数の中身を書き出せば何か分かるかもしれん。
何をやっているのか分からんので、それくらいしか言いようが無い。
0662デフォルトの名無しさん
2009/10/26(月) 05:43:13Xの値を調べて場合分けするんですが、XがNaNなのでエラーが出て発覚する、って感じです。
その場合分けしてる位置よりかなり以前の複数の場所でXが代入されてる上にXの代入が多すぎて
全部調べるのが厳しいんです。といってもそれしか思いつかずちまちまやってました。
0663デフォルトの名無しさん
2009/10/26(月) 06:44:30NaNや変な値を返して計算をぶっ続けるシステムもあるよね。一応配列もチェックすることをお薦めする。
システムごとにNaNやInf検出して停止させる機能があると思うけどな。
発生した場所をソースの行番号で教えてくれる・・・はず。
富士通Fortranはデバッグ機能が神がかり的に優秀だけどIntelその他にも似た機能はあるだろう。
自分で直接追求するときにはとりあえず
if (.NOT. ((x .GT. -1.0) .OR. (x .LT. 1.0))) then ...
の判定で場所を特定してるけど・・・みんなはどうやってNaN発生を見つけてるの?
0664デフォルトの名無しさん
2009/10/26(月) 07:03:59配列の宣言外領域へのアクセスについては、実行時にチェックするオプションを
付けてコンパイルしている。でも個々の変数の中身がNaNになったら止める方法
は知らない。あれば知りたいくらいだ。
しかし変数にNaNが入った時点でプログラム自体に問題があるように思うのは間
違ってるだろうか?初期化の時にNaNを入れるのも可笑しいしなぁ。
0665デフォルトの名無しさん
2009/10/26(月) 23:19:35Fortran2003ならIEEE754例外を拾う関数がある。
F2003でなくても最近のコンパイラはベンダー拡張サブルーチンでIEEE例外を検知できることが多い。
0666デフォルトの名無しさん
2009/10/27(火) 02:55:23有り難うございます。貧乏なので gfortran しか持ってません。並列とかするわけでもないので
特に困る事もないのですが。で、その gfortran のマニュアルを見ていたら、isnan() という関
数がありました。これで検知だけは出来そうです。オプションでも -ffpe-trap というのがあり
ましたが、使ってみたら実行時に警告が出ただけで、プログラム自体は正常終了してた。使えな
いのかな。それとも PPC なのが悪いのか。取り敢えず気になる変数だけ、isnan() を使ってチ
ェックすれば良いかな、と思うことにしました。
C マニュアルに載ってたサンプル: test_nan.F90 とでもする
program test_nan
implicit none
real :: x
x = -1.0
x = sqrt(x)
if (isnan(x)) stop '"x" is a NaN'
end program test_nan
% gfortran test_nan.F90 -ffpe-trap=invalid
% ./a.out
Fortran runtime warning: IEEE 'invalid operation' exception not supported.
STOP "x" is a NaN
% echo $?
0
0667デフォルトの名無しさん
2009/10/27(火) 08:51:44% gfortran test_nan.f90 -ffpe-trap=invalid
In file test_nan.f90:6
if (isnan(x)) stop '"x" is a NaN'
1
Error: Function 'isnan' at (1) has no IMPLICIT type
コンパイル止まったお! バージョンにも依るのかな?
SPARCかな、CPUによってはNaNやInfが出てくるとハード的にフラグをたててくれるみたいだけど
一般的じゃないからなあ。
>>663 の条件式はハードやコンパイラ関係無くNaNは見つけてくれそうだけど、
システムによっては+/-Infは判定できないんじゃないかな。
0668デフォルトの名無しさん
2009/10/27(火) 09:43:51>>667
うちは
% gfortran --version
GNU Fortran (GCC) 4.4.1
だった。マニュアル(但し 4.4.2 版)によると、isnan は論理型とのこと。オプションの -ffpe-trap=invalid
は無くても isnan 自体には問題なかった。
自宅にある唯一の Fortran90 の本「Fortran90/95 explained (2nd ed.)」によると、ieee_arithmetic という
モジュール?には ieee_is_nan という関数があるとのことだけど、モジュールってどうやって使うの?ずっと
77でやってきたから知りません。イイカゲン90の勉強をした方が良さそうな気がして来たが、もうFortranを
使う用事ってないんだよなぁ。趣味で数値計算でもしない限り。
あと、名前付き定数?(named constants)というヤツの中に ieee_nan というのがあるらしい。取り敢えず
同書から引用しておきます。
ieee_nan The scoping unit must support NaNs for at least one kind of real.
これを何の目的でどう使うのかは分かりません。ゴメンナサイ。
0669デフォルトの名無しさん
2009/10/27(火) 12:41:45GNU Fortran (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
・・・2年前のだった。
こんど再挑戦してみるよ。
0670デフォルトの名無しさん
2009/10/27(火) 18:07:40ゼロ割とSQRTチェックがまだだったら、
そこ見た方がいいよ。
もうチェック済ならスマン
0671デフォルトの名無しさん
2009/10/27(火) 22:09:11考えているのですが、上手い方法が思いつきません。
行の場合は、EOFのチェックをすればいいので簡単なのですが・・・
0672デフォルトの名無しさん
2009/10/28(水) 02:02:02EOR end of record のチェックをするという手もある。自由フォーマットだとうまく行かないが。
あとは、一度一行を文字列として読んで、次にその文字列を内部ファイルとして、それから読み出す
というやり方も考えられる。
データの幅が一定フォーマットなら比較的楽。
空白で切ってるだけで可変長の場合は、ややめんどいかな?
0673672
2009/10/28(水) 02:11:12IMPLICIT NONE
! INTEGER, PARAMETER :: iostat_eor = -2, iostat_end = -1
REAL :: a(20)
INTEGER :: io, i, k
CHARACTER (LEN = 136) :: text
! prepare data
DO i = 1, 10
WRITE(9, '( 10(F10.5, X) )') (REAL(k), k = 1, i)
END DO
CLOSE(9)
! (2)
!
DO
READ(9, '(a)', IOSTAT = io) text
IF (is_iostat_end(io)) EXIT ! f2003
a = a / 0.0 ! NaN
READ(text, *, IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
PRINT *, a
END DO
STOP
! (1)
!
DO
READ(9, '(10F10.5)', IOSTAT = io) a
IF (is_iostat_eor(io)) EXIT ! f2003
IF (is_iostat_end(io)) EXIT ! f2003
PRINT *, a(1:10)
END DO
STOP
END PROGRAM test
0674デフォルトの名無しさん
2009/10/28(水) 15:56:59シンプソン法を用いてy=exp(x)の計算プログラムを作っています。
以下のプログラムの15、16行目のfun()の中には、
何を入れればいいのでしょうか?
0675デフォルトの名無しさん
2009/10/28(水) 15:58:29implicit none
integer::m,i
real(8)::a,b,s,s1,s2,h,x,fun
external fun
1 continue
write(*,*)'INPUT DATA'
write(*,*)'A,B,M ?'
read(*,*)a,b,m
if(m<=0)stop
h=(b-a)/m
s1=0.D0
s2=0.D0
do i=1,m/2-1
s1=s1+fun(i)
s2=s2+fun(i)
end do
s1=s1+fun((m-1)*h+a)
s=h/3*(fun(a)+fun(b)+4*s1+2*s2)
write(6,100) s
100 format(2x,'IR=',D16.6)
end program simpson1
!
function fun(x)
implicit none
real(8)::fun,x
fun=exp(x)
return
end function fun
0676671
2009/10/28(水) 16:19:35ありがとうございます。
「一度一行を文字列として読んでから、その文字列を内部ファイルで読み出す」は応用が利いて便利ですね。
区切りを空白とする以外はフォーマットを限定しない仕様にしたかったので、
この方法がベストだと思いました。NaNのチェックはisnan()を使いました。
最後にもう一点お聞きしたいのですが、EORはformattedで読む場合も関係あるのでしょうか?
また、どういう使い方をするのでしょうか?
0677デフォルトの名無しさん
2009/10/28(水) 17:00:51お忙しいとは思いますが、よろしくお願いします。まず下のソースを見てください。
このプログラム自体は完成しているのですが、
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
の部分をサブルーチンで直して来いといわれたので、
サブルーチンについて調べて色々やりくりしてみたのですが
サブルーチンについての理解が乏しいため上手くいきません。
もしこの箇所をサブルーチンを利用して書き換えるならどのようになるのか教えていただけませんか?
よろしくお願いします。
0678デフォルトの名無しさん
2009/10/28(水) 17:02:47implicit none
integer MM,KK,M,K,a
parameter (MM=400,KK=100)
integer year(MM),month(MM),day(MM),sl(KK,MM),AVE(MM)
character cdummy,CFNAME*110,CFNAME2*80
M=0
CFNAME='/home/maekawa/numeric/kure.txt'
open(1,file=CFNAME,status='old')
1010 M=M+1
read(1,10,END=1020)cdummy,year(M),cdummy,month(M),
@ cdummy,day(M),(cdummy,sl(k,M),k=1,24)
10 format(A5,I2,A1,I2,A1,I2,24(a1,I3))
write(6,*)year(M),month(M),day(M),(sl(k,M),k=1,24)
goto 1010
1020 close(1)
M=M-1
CFNAME2='/home/maekawa/numeric/aki.txt'
open(2,file=CFNAME2,status='old')
DO 1040 a=1,M
DO 1030 k=1,24
AVE(a)=AVE(a)+(sl(k,a))
1030 continue
WRITE(2,*)AVE(a)/24
1040 continue
CLOSE(2)
end
0679デフォルトの名無しさん
2009/10/29(木) 02:45:00EORはF90以降だったようだ。
昨日は勘違いして77時代からあった気になっていた。使い方を良くわかっていなかったww
文法書を見てもらった方が早いが、そもそもFORMATつきでADVANCE='NO'でないと駄目のもよう。
77だとIOSTATでエラー番号を見ればEORを検出できるが、I/Oエラー番号はベンダー依存。
他のI/Oエラーが出ない自信があれば、ERR=nnで飛ぶことも可能。
77だとブランクを数値ゼロに解釈するので、文字列を内部ファイルとして読む場合に
色々前処理をしないとうまくいかないかもしれない。
90なら文字列をTRIMするなり、フォーマットをBNにするなりで対処しやすい。
まとまり無くてスマソ
0680デフォルトの名無しさん
2009/10/29(木) 12:12:40そういうもんだと思って諦めてるけど
0681デフォルトの名無しさん
2009/10/29(木) 14:11:01Allocate...とか、かな。
でもこの辺の取り回しはどの言語も同じだよね。
使っていくうちに増える場合には
一度既存のデータ配列と同じサイズのTempな変数をAllocateしてそこに移して、
元のを開放してからまた同名で要素一個大きいのをAllocateして
TEMPのを移して、TEMP開放、の流れは基本同じだし。
0682デフォルトの名無しさん
2009/10/29(木) 14:13:51データを一度ファイルに落として、そのファイルの行数を数えてから
自動配列で配列生成してそのファイルを読む・・・・・とか。
不可能じゃないけどイヤだなw。
0683デフォルトの名無しさん
2009/10/29(木) 18:38:33Fortranに限らず、データの個数が任意に変わる場合は
ポインタ使ったリスト構造を作るのが普通じゃない?
>>682
結局は、「Fortranでそういうことスンナ」って話になるよねw
速度的にも宜しくないし、データ量の多い科学計算には相容れない
0684デフォルトの名無しさん
2009/10/30(金) 04:46:30メモリがもったいない事は今はあまりないけどやはり非効率だし
場合によっては十分大きくとったつもりでも足りなかったり。
0685デフォルトの名無しさん
2009/10/30(金) 09:47:58大きな配列を最初に定義しなくて良くなりますよ〜、という事を
Allocateのメリットの例にしてるくらいだからな。
0686デフォルトの名無しさん
2009/10/30(金) 13:27:32C/C++ならそういう問題で頭を悩ます必要もないのに
0687デフォルトの名無しさん
2009/10/30(金) 14:46:45最適化がしやすいようにわざと堅く作ってあるんだよ
C/C++は確かに自由な文法だが最適化がしにくい
0688デフォルトの名無しさん
2009/10/30(金) 15:49:03Fortranより大きいと思う。個人的にはこっちがいやで
Fortranを中心に使っている。
でもやはりというかCのI/Oその他の自由度の高さゆえに
最終的には混ぜこぜコードの出来上がり、になる事も多いけど。
Cはコーディングの自由がありすぎて、結局サイトや教科書の
部分的丸写しが多くなっちゃうから上達しないだけなんだろうけどな。
0689671
2009/10/30(金) 18:45:48レス遅くなりましたが、ありがとうございます。調べたところ、要するに
「form='formatted' かつ advance='no' の場合に限り、 eor=文番号 が使える」
ということなんですね。
↓のコードでテストしてみました。
<ソース>
real :: f(5)
write(10,*) 1.0 , 2.0 , 3.0
write(10,*) 4.0 , 5.0 , 6.0
write(10,*) 7.0 , 8.0 , 9.0
rewind(10)
do i=1,2
f=0./0
read(10,'(3f)',advance='no',iostat=io,eor=999) f
print *,'io=',io
print *,f
enddo
stop
999 print *,'EOR detected!'
print *,'io=',io
print *,f
end
<出力>
io= 0
1.000000 2.000000 3.000000 4.000000 5.000000
EOR detected!
io= -2
6.000000 0.0000000E+00 NaN NaN NaN
0690671
2009/10/30(金) 19:00:00単なるASCIIであるformattedでは関係ないはずですよね。
そうすると、EOR(End Of Record)ではなく、EOL(End Of Line)などと
呼ぶほうが適切なのでは、と思ってしまいました・・・。
いずれにしろ、私的には文番号はデバッグ時を除いて使いたくないので、
>>676の方法がベストですね。
0691デフォルトの名無しさん
2009/10/31(土) 20:14:11IOSTATの番号で見ればいいので文番号は必須ではない。
しかし、いったん1行を文字列に読んで、加工するなりして、
内部ファイルで読むのがいろいろ出来て便利。
EORの呼び名に関しては、御説ごもっともだが、多分ADVANCE=’NO'によって、
逐次型本来の行単位のアクセスではなく、その内部の要素ごとで、ファイルの現在位置を
止めうるようにしたので、ダイレクトアクセス的なネーミングにしたのではないかと想像?
0692671
2009/11/01(日) 21:01:41ほんとですね。ありがとうございます。
iostat= と eor= の少なくともどちらか1つを指定していないと、
EORになった時点で↓のようにエラー終了するようですね。
forrtl: severe (268): end of record during read, unit 10, file ・・・
0693デフォルトの名無しさん
2009/11/04(水) 05:59:17その後にgotoスパゲッティになることがあるからムズムズする。
0694デフォルトの名無しさん
2009/11/04(水) 16:22:39安心して使えるFortranのバージョンってどれでしょうか?
少し前は「90にしとけ」って話をよく聞きましたが、最近は
95や2003も問題なく通用すると思って良いんでしょうか?
0695デフォルトの名無しさん
2009/11/05(木) 01:39:36F95が標準の地位を占めたという感じでないか?
更新していないシステムでは、まだF90の環境が結構残っている。
F77はコマンド名として存在していてもF90のコンパイラを固定カラムなどのオプションで
呼び出していることが多い。
F2003はようやくCRAYが完全対応したところで、ベンダーごとに独自の部分的な対応に
とどまっているのが実情。簡単なところから対応しているから大体は重なっているが。
0696デフォルトの名無しさん
2009/11/05(木) 05:21:56でも命令文はF77~95の混在したコードになってもうた。プリプロセスも混ぜてるから拡張子は.fppだ。
まあでも、gfortran と intel fortran はちゃんと処理してくれるから、いいや。
FujitsuのもOKみたいだし。
無駄に行数が増えてしまうけど左側が空いてるとなんか安心するw
0697デフォルトの名無しさん
2009/11/05(木) 14:12:15ありがとうございます。
F95で書こうと思います。
0698デフォルトの名無しさん
2009/11/06(金) 02:03:35少ないように規格されてるから過去の資源も使い易いし。
2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
まだ見たことないや。
0699デフォルトの名無しさん
2009/11/06(金) 15:29:10昔はIBM、日立、富士通、Sun、SGIって色々あったけど、今はそれらは
ほとんど淘汰されてスパコンレベルしか残ってないし。
ま、コードを開発する側としてはやりやすくなったんだろうけど。
0700デフォルトの名無しさん
2009/11/07(土) 00:55:13>2003でスコープ範囲指定が出来るようになるらしいけど、いつ出るんだろう?
>まだ見たことないや。
変数のスコープか?
PRIVATE、PUBLICは今あるままで、PROTECTED(いわゆるリードオンリー)が加わる程度だと思ったぞ。
他にもあんのかな?
0701デフォルトの名無しさん
2009/11/10(火) 09:26:510702デフォルトの名無しさん
2009/11/12(木) 13:05:370703デフォルトの名無しさん
2009/11/12(木) 23:57:09おまえふざけてんのか?w
0704デフォルトの名無しさん
2009/11/13(金) 03:32:540705デフォルトの名無しさん
2009/11/13(金) 08:15:170706デフォルトの名無しさん
2009/11/13(金) 13:00:36両方ともマヨネーズならアリだよな
0707デフォルトの名無しさん
2009/11/13(金) 13:04:07え?
0708デフォルトの名無しさん
2009/11/14(土) 09:03:12■ このスレッドは過去ログ倉庫に格納されています