[表示 : 全て 最新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/


952 名前:949 mailto:sage [2007/11/11(日) 12:31:09 ]
>>950
Equivalence使ったことありませんでした。
マニュアルみたら違う変数で同じメモリ領域を使えるようにする、、ってやつなんですね。

つまり整数1byte型x1,x2,x3,x4がy4,y3,y2,y1と同じメモリ領域になるようにし、
逆から順に1byteずつ出力すればいいってことですね。
RECLに関してはマニュアルを読んでみます。

>>951
'DIRECT'、'SEQUENTIAL'、' POSITION=APPEND'
マニュアル見たらACCESS指定子に選択できるのは上記3つだけみたいでした。


953 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:45:48 ]
>>949,950
fortran90以降でequivalence文を使うのは非推奨。

subroutine trans_endian(str,inte)
character(len=1),dimension(4),intent(in) :: str
integer,intent(out) :: inte
inte=transfer(str(4:1:-1),0)
end subroutine trans_endian


954 名前:1/2 mailto:sage [2007/11/11(日) 15:26:51 ]
>>953
とこんな感じで整数をエンディアンの自動判別しながら読める。
正直TRANSFERを使うより、EQUIVALENCEの方がすっきりするよな。
F90はソースコードの見かけに流れされすぎ。

SUBROUTINE check_endian()
IMPLICIT NONE
CHARACTER(LEN = 4) :: ctmp
INTEGER :: itmp
ctmp = 'ABCD'
itmp = TRANSFER(ctmp, itmp)
IF ( CHAR( MOD(itmp, 256) ) == 'A' ) THEN
qlittle_endian = .TRUE.
ELSE IF ( CHAR( MOD(itmp, 256) ) == 'D' ) THEN
qlittle_endian = .FALSE.
ELSE
CALL abort('endian indeterminable')
END IF
RETURN
END SUBROUTINE check_endian
!---------------------------------------------------------------------


955 名前:2/2 mailto:sage [2007/11/11(日) 15:27:24 ]
!---------------------------------------------------------------------
FUNCTION rd_int32() RESULT(ires)
IMPLICIT NONE
CHARACTER (LEN = 4) :: tmp
INTEGER :: i, io, ires
IF (qlittle_endian) THEN
DO i = 1, 4
ir_record = ir_record + 1
READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i)
END DO
ELSE
DO i = 4, 1, -1
ir_record = ir_record + 1
READ(ir, REC = ir_record, IOSTAT = io) tmp(i:i)
END DO
END IF
ires = TRANSFER(tmp, ires)
RETURN
END FUNCTION rd_int32

956 名前:デフォルトの名無しさん [2007/11/11(日) 17:22:06 ]
>>943
コーエンといえば、これワロタ。
F2003が実用的な意味で出てくるのか甚だ疑問だなw

ttp://www.nag.co.uk/market/Malcolm_Cohen_Fortran_Jubilee_Presentation.pdf

The Irony of FORALL
? “world’s slowest high-performance feature” (HPC vendor 1)
? “months just to get the semantics right...” (HPC vendor 2)
? “even on massively parallel machines, it’s slower than DO”
(HPC vendor 3)
? The analysis needed to eliminate the costly array temps...
...would parallelise the obvious DO loop alternative.
So at best FORALL is as good as DO, usually it is slower, sometimes
much slower.
11

957 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 01:50:22 ]
readで配列の行数列数を指定せずにファイルを読み込むにはどうしたらいいんでしょうか?
「end-of-file during read, unit 5」と表示されてしまい、どうやらEND=100のように文番号を指定する必要があるみたいなのですが、
どのように記述すればいいのか分かりません。
どなたか教えてくれませんか?

958 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 07:28:49 ]
>>957
とりあえず切り抜けるには、
READ(nn, *, END =10) A
10 CONTINUE


959 名前:957 mailto:sage [2007/11/13(火) 11:17:16 ]
>>958
出来ました!
かなり助かりました。ありがとうございます。

960 名前:デフォルトの名無しさん [2007/11/13(火) 15:23:03 ]
はじめまして、初めて書き込みするものです。
C言語のプログラムをfortran90で書き換えようとしてるんですが、
C言語の
do{
処理文
}while(条件)
に対応するfortranの命令文は何を使って書けばいいんでしょうか?

あと、C言語で使われている、間接演算子*aなどはfortranではどう扱えば
いいのでしょうか?サブルーチンの仮引数として書いたときに、エラーが
出てしまうので、修正の仕方が分からないで困っています。

アドバイスをいただけないでしょうか?





961 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:03 ]
>>960
C言語の do 〜 while にそのまま当てはまる文はない。

ループの終了条件判定を前へ持ってきても良いのなら
DO WHILE (条件)
処理文
END DO

条件判定が後ろにないとダメな(最低1回は実行する)場合は
DO
処理文
IF (.NOT. 条件) EXIT
END DO


962 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 22:27:56 ]
>>960
Fortranでは引数は基本的にすべて参照渡しなので
普通に渡して仮引数を書き換えれば実引数の値も変わる。

サブルーチン側で勝手に書き換えられては困る場合は
仮引数に INTENT(IN) 属性を付けておけば書き換えられない
ようになる。というかコンパイル時にエラーにしてくれる(はず)


963 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:07:58 ]
>>961
FortranにREPEAT〜UNTIL型の構造が入らなかったのは何故なんだろうね?
FORTRA66時代のDO〜LOOPがREPEAT〜UNTIL型だった呪いかな?w

>>962
F2003で引数にVALUE属性が導入されるらしい。
コンパイラによっては今でも独自拡張で出来なくも無いが。


964 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 13:38:29 ]
>>961
>>962
ありがとうございます!とても参考になりました。
教えていただいたことを使ってもう一度やってみます。
また分からないことが出てきてしまうと思うので
そのときはまたよろしくお願いします。

965 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 14:10:39 ]
保守代わりに下らない質問
77にはDO WHILE文は無いよね?
77ではIF(〜) GO TO 〜ってやるしかないよね?

966 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 21:25:14 ]
失礼します、初めて書き込みさせていただきます。
以下のようなプログラムを書いたのですが(相当省略してますが)、
nの値を8以上にするとmの値が正しく出ないのですがなぜなのでしょうか。
(とりあえずaはどうでもいいです)

integer :: i, j, m, n
real(8) :: a

read(* ,*) n
do i = 1, 2n-1, 2
m = 1D0
do j = 1, i
m = m * j
a = a + dble(m)
end do
end do
write (*, *) m

mはiまでの階乗を表したくてこのようにしているのですが…

967 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:02:03 ]
>>965
DO WHILEはないが、GOTOの種類ならたくさんあるぞw

>>966
mはintegerだから
基本整数型が32bitの場合、2147483648以上の数は扱えない。

968 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:55:17 ]
>>966
>>967氏を補足するならば、integerで表される最大値は2**31-1だ。
m=m*jをx=x*DBLE(j)にしろ。xはreal(8)な。m=1の代わりに、x=1.0d0。

まぁ整数で何も考えずに階乗を求めると、途中でマイナスになって、
2の補数表現とかコンピュータの勉強になるので、教育的には非常にいい課題だ。



969 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:15:09 ]
>>967>>968
全然知りませんでした。おっしゃる通りに直してみます。
本当にありがとうございました!

970 名前:デフォルトの名無しさん [2007/11/21(水) 02:34:46 ]
Silverfrost FTN77 4.03をダウンロードしたのですが、
セットアップのところを押すと、
「C:¥WINDOWS¥SYSTEM32¥AUTOEXEC.NT.システムファイルは
 MS-DOSおよびMicrosoft Windowsアプリケーションを実行するの
 に適していません。」
と表示されます。どうすればいいでしょうか?教えて下さい。
お願いします。



971 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:50:57 ]
>>970
ttp://support.microsoft.com/default.aspx?scid=kb;ja;324767

972 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:50:42 ]
>>970
特にこだわる理由が無いならFTN95を入れるという選択肢もある。


973 名前:970 [2007/11/22(木) 14:49:08 ]
ありがとうございました。
これで家でも使えるようになりました。

974 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:09:52 ]
学生時代、情報科の先生にプログラミング言語は何教わった?と聞かれて
Fortran77ですと答えたら、それ古いぞ今はCだと言われた。
それからだいぶ経つのに、77を教わっている学生さんが居るとは、
教えてる奴はよっぽど77好きなんだろうな。


975 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:19:46 ]
計算科学あたりでは今でも F77 教えてたりする。
今はもう C すら古いというのに。

976 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:06:43 ]
Visual Fortran10 with IMSL + visual studioって構成でアプリケーション作ったんだけど,
IMSLとのリンクが動的にしかできないからIMSLのインストールされていないPCで動かすことができません.
INCLUDE 'link_fnl_shared.h'
use IMSL_LIBRARIES
ならうまくいくのですが,
       INCLUDE 'link_fnl_static.h'
use IMSL_LIBRARIES
だとリンクエラーになりコンパイルできません.
どなたかアドバイスいただけませんでしょうか?

977 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:21:36 ]
>>974-975
真理は時間や空間には依存しないもの。
流行り廃りがあるような内容は、学問ととして伝授するに値しない。
FOTRANは、普遍的不変なる価値を持つのだ。

50年前のコードが動いて、実際使われているんだから、
こんな再利用可能な習得価値のある言語は無い。


978 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:32:26 ]
バグを抑制するための仕様が貧弱だから
保守が大変なんだよ。

979 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:57:45 ]
C言語のことかーーーっ!!!

980 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:58:50 ]
ちょっと前はとりあえずF77でやっときゃおk、だったが今はさすがにF90だろ
いつまでも研究室レベルのコードでいいなら別に構わんけど



981 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:31:30 ]
F90からいきなり入った連中は、変数命名の伝統を守らなかったりするので、再教育が面倒。
規格を硬くして厳格に守るべき部分もあるが、自由度を大きくしたまま慣習法によって厳格に守る部分
があってもいい。いざというときだけ破格で逃げる。とにかくバランスを間違えてはいけない。

英米系の慣習法と独仏系の制定法の伝統にもよるのかもしれないが・・・・
情報学科よりの連中は、PASCALがなぜ廃れたかの教訓を得ていない。

それはそうと本来情報教育の講座が、しっかりした教材を用意すべきだと思うのだが、
連中はFORTRANとかを無闇に馬鹿にして、すぐに忘れ去られる新規言語に飛びつくからワロスワロス

まぁ、FORTRAN全盛時代の代表的なテキストたる浦昭二のFORTRAN本も暗黙の型を
守っていないのでどうしようもないのだがw


982 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:44:51 ]
FORTRAN77 を使ってあまりの酷さに逃げたわ。
何、あの引数の数。構造体が無いから酷い。
それを避けようとしたら COMMON 変数まみれ。
最悪だ。

983 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:22:57 ]
>>982
FORTRANではバッチ処理で物理メモリーを限界まで使うことが多いが、
そうなると自由にメモリーを再利用できるCOMMONは非常に便利。
メモリーが貴重な時代には非常に合理的な仕組みだった。
今風に言うとガベージコレクションを自分でやれる。

その時代時代の最高のハードウェアの制約を前提として限界まで使うにはFORTRANはいい言語。
無限のメモリーやCPU速度を暗黙の前提にしている仮想マシン上の観念言語とは違う。

FORTRAN77程度で逃げるのは根性無し。FORTRAN66で根性つけて出直せw



984 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:01:32 ]
プログラマにはそんな無駄な根性なんて要らない。

985 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:19:09 ]
必要なのはデスマを生き抜く体力のみ。

986 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 19:59:15 ]
Fortran77 は、1977年以前に生まれた人間しか使ってはいけないそうな

987 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:17:12 ]
楽勝で使えるぞな

988 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 00:39:37 ]
そろそろ次スレ用のテンプレについて議論しよう。


989 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:29:10 ]
テンプレって無視されるのが普通だからどうでもいいような気もするけどね。
コンパイラのリンクとか宿題丸投げ用テンプレでも入れる?
F77やF90の簡単な説明もあると良いかな?自分が習ってるのがどっちか分からない子用に


990 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:22:19 ]
>>989
たしかにF77とF90以降の区別は重要だな。質問のときにはっきりさせろと。

あとは、文字列を数字に直すというFAQかな?




991 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 11:33:52 ]
テンプレ議論するには残り少なすぎ・・・
まぁ内部ファイルの質問は多いから入れとこうか

992 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 11:46:42 ]
>>995が次スレを立てるという事で


993 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 07:37:24 ]
F

994 名前:デフォルトの名無しさん [2007/11/30(金) 08:34:03 ]
バイナリデータを書き込むと先頭に余分な6バイトがついてしまいます。
純粋なデータのみを書き込みたいのですが、どのコマンドを使えばよいのでしょうか?

995 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:40:05 ]
>>994
エスパー力が試されているな。
実行環境とどんな型のデータをどんな風に
書き込んでいるのか分からない。

昔Compaq/AlphaでVisual Fortranを使った時の話
open(io,file="hogehoge",access="direct",form="unformatted",recl=2,statu="new")
としてバイナリファイルを作った時、2バイトずつ書き込もうとしても、
コンパイル時にオプション(-assume byterecl)を与えないと8バイトずつになってしまった。
余分な6バイトがつくというのは、こういう状況か?

996 名前:995 mailto:sage [2007/11/30(金) 09:40:56 ]
×statu="new"
○status="new"

997 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 11:29:16 ]
>>994
コンパイラ・処理系などは何だ?



998 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 14:00:28 ]
くだすれFORTRAN(超初心者用)その3
pc11.2ch.net/test/read.cgi/tech/1196384126/

999 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 12:56:23 ]


1000 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 12:57:05 ]
( ´ー`) 1000 !



1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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