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


855 名前:854 [2007/10/02(火) 19:31:26 ]
すいません、解決しました。
数値を入力すれば良かったんですね。
ありがとうございます。


でも
>>848-849
のように>>839のコンパイラでうまくいかないのはなぜなのでしょうか?
実際に使用するのはFortran77なので
77に準拠したコンパイラを使いたいのですが。


856 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:53:39 ]
>>855
何をやったのか
どんな結果になってうまくいかなかったのか
エラーメッセージが出たらその内容

くらい書かないと「しらねーよ」としか答えられない。

857 名前:デフォルトの名無しさん [2007/10/02(火) 22:06:47 ]
>何をやったのか
>どんな結果になってうまくいかなかったのか
>エラーメッセージが出たらその内容

全部>>839に書いてあるのですが・・・


858 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:04:32 ]
>>857
「コンパイルに失敗しました」と表示されたときに
CPadの下の方のメッセージウィンドウに何か表示されてない?


859 名前:デフォルトの名無しさん [2007/10/03(水) 11:42:56 ]
>>858
■C:\Documents and Settings\....\Fortran> ftn77 /link ttt.for
[Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
0001) !----- Ex1_1: 3種類の平均値 -----
0002) PROGRAM Example_1_1
*** Unexpected continuation line (have you got more than 19?)
0007) PRINT*, av1, av2, av3
0008) END
*** Non-blank label field in continuation line
0008) END
0009)
*** Unexpected end of file (END statement assumed)
3 ERRORS [<MAIN@>FTN77 Ver 4.03]

*** Compilation failed

^C

というエラーが出ています。
どうすればいいんでしょうか?

860 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:51:10 ]
>>859
1から6カラムまで開けろや!

861 名前:デフォルトの名無しさん [2007/10/03(水) 12:34:36 ]
>>860

すいません、どういう意味ですか?
開けるというのは何を開けるのですか?


862 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:12:30 ]
言っちゃ何だが、FORTRANの文法をよく勉強したほうが
いいんじゃないか?

自分のしたいことをコード化できないようじゃ理論ギャップ
があるのかバグがあるのか判断できないじゃまいか。

863 名前:デフォルトの名無しさん [2007/10/03(水) 18:14:39 ]
勉強はするつもりです。
だからとりあえずコンパイラがちゃんと動くしたいのです。




864 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 18:42:19 ]
じゃあ、エラーメッセージ読んで考えろよw

865 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 03:45:16 ]
>>861
>>843

どんな入門書でも最初の数ページ以内に書いてあるような基本的なことだぞ。
ちゃんとしたプログラムが書けなきゃコンパイラがちゃんと動くかどうかも確認できないぞ。

866 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:29:36 ]
>>865
Fortran90と混同しているから、教えるのはかなり大変だぞwwww

教育者としての真価が問われる。 神化しないと切れるだろうwwwwwwwwwww


867 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 03:23:05 ]
もやすみちゃん

868 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:50:10 ]
関数をサブルーチンの引数とすることはできるのでしょうか?
サブルーチンの引数として被積分関数や積分範囲等を設定できればと思っています。
どなたかわかる方がいらっしゃいましたら、ご教授いただければと思います。


869 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 09:45:37 ]
>>868
制限付きでできる。
external 指定をすればよろし。マニュアル味噌。


870 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 13:13:54 ]
>>869

868です。ご返信ありがとうございます。
EXTERNALの指定で無事うまくいきました。

途中コンパイルがなかなか通らずどうしたものかと頭を抱えましたが、
「EXTERNALの指定でうまくいく!」という道筋を示していただけたおかげで、エラーの原因を他のところに絞り込むことができました。

871 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 11:56:52 ]
転置行列を書くために

program ex2_19
implicit none
integer n, i, j
real(8) , allocatable :: c(:,:),ct(:,:)
read(*, *) n
allocate(c(n, n))
call random_seed
call random_number(c(:,:))
write(*, *) c
allocate(ct(n,n))
do i = 1, n
do j = 1, n
c(i, j) = ct(j, i)
enddo
enddo
write(*, *) ct(:, :)

end program ex2_19
というプログラムを書いたのですがどうしても出力結果が転置行列になりません。
どうしてでしょうか?誰か親切な方お願いします。

872 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 12:58:33 ]
>>871
代入文をよく見直せ。

873 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 16:23:34 ]
>>871
ct = transpose( c )
でもできる。



874 名前:871 mailto:sage [2007/10/08(月) 18:01:42 ]
>>872
c(i, j) = ct(j, i)
のところでしょうか?

875 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 19:11:47 ]
c が元の行列
ct が転置行列
だよな?

876 名前:871 mailto:sage [2007/10/08(月) 20:18:58 ]
>>875
そうです。
cは適当に乱数で決定されるようにしました。

877 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 22:50:50 ]
> c(i, j) = ct(j, i)
c(i, j) に ct(j, i) の内容を代入

878 名前:871 mailto:sage [2007/10/09(火) 00:23:13 ]
>>877
わかりました!
なんたる初歩的ミス…、頭の悪い質問ですみません。

ありがとうございました。

879 名前:デフォルトの名無しさん [2007/10/15(月) 17:14:30 ]
   K=0         ← こっちが前?
   DO 100 I=1,10
   K=K+I
10  CONTINUE
   WRITE (6,100) K
100 FORMAT(1H ,i5)  ← こっちが前?


880 名前:デフォルトの名無しさん [2007/10/15(月) 17:16:09 ]
プログラムの「前」ってどっちですか?

   K=0         ← こっちが前?
   DO 100 I=1,10
   K=K+I
10  CONTINUE
   WRITE (6,100) K
100 FORMAT(1H ,i5)  ← こっちが前?

881 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 17:23:19 ]
マルチすんなハゲ

882 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 18:36:36 ]
>>879
前とは先頭のほうだw


883 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 01:11:01 ]
 googleg
G| o o |g
 | L  |
 \_e__/ <ぐぐれかす





884 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:22:47 ]
誘導され
>>57
あたりを読みました
FTN95をインストールしました。
plato3(日本語不使用)でコンパイル実行可能でした

fcpadを利用しては出来ないですか?
コンパイラパス
C:\Program Files\Silverfrost\FTN95\ftn95.exe
と入力
コンパイルは通るもののexeファイルが生成されず
おそらく設定の実行付近をいじると出来るのか?と思っていますが

誰か、ご指導願います・・・。


885 名前:884 mailto:sage [2007/10/16(火) 02:40:35 ]
原因は分かりました。
が、解決方法が分からないので教えていただきたいのですが
/LINKがプログラム名の前に入っているため生成が出来ないようです。

【現在】ftn95 /LINK file.f となってしまう
【解決】ftn95 file.f /LINK としたい

解決方法分かる方よろしくお願いします。

886 名前:デフォルトの名無しさん mailto:sage [2007/10/16(火) 02:44:09 ]
>>884
>>355

fcpadは自由形式のプログラム編集には使えない(向かない)けどな

887 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:47:42 ]
割り算の結果がうまく表示されない現象に悩まされています。
integer a,b
character c

write(*,*)'計算式間にスペースを入れて入力'

read(*,*)a,c,b

select case(c)

case('+')
write(*,*)'=',a+b

省略

case('/')
write(*,*)'=',a/b

endselect
stop
end

888 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:33:51 ]
>>887
a,bをINTEGERで宣言しているので、その割り算は切り捨てになる。


889 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:04:30 ]
結果自体が表示されないんですが…。
realで宣言しても同じです

割り算以外の演算は問題なしです

890 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:37:05 ]
>>889
どのようにおかしいか、出力例も交えて、もっと情報を提供しなさい。
>>887の内容では誰も答えられない。

891 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 17:51:28 ]
>>887
やってみた。

例えば、 4 / 2
と入力しても、case('/')に入らない。
もし
case default
を用意したら、そこに入る。

代わりに
4 "/" 2
あるいは
4 '/' 2
と入力したら
= 2
を返した。


892 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 19:00:27 ]
ゲイツにきけwwwwwww

893 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:08:28 ]
並び順番 READ 文の規則
ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/lr/lr10_03_01_02.htm
>実行中に斜線 (/) が現れると,READ 文は終了し,残りの入力並び項目は変更されないままになります。



894 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 20:46:18 ]
誰か、Fortranで(いろんな意味で)生産性の高いコードを書くコツみたいの、挙げてくれ
Fortranユーザって他の言語に比べてそういうのあんまり意識しなさそうだけど

895 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 21:59:39 ]
>>894
つ www.mri-jma.go.jp/Project/mrinpd/coderule.html

896 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:43:34 ]
速度を犠牲にせずに生産性を上げるってのはなかなか難しいね

897 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:12:52 ]
>>891
>>893
ありがとうございました。
FORTRAN学びはじめなので細かいところが分からず

898 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 14:31:50 ]
FortranのIDEみたいな開発環境あるんでしょうか?

899 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:35:15 ]
>>898
色々あることはある。
どういうのが望みだ?



900 名前:898 mailto:sage [2007/10/22(月) 22:47:23 ]
あるんですね。やっぱりFortranコードといえど規模が大きくなるとそういうのは必要ですよね。
Visual Studioみたいなデファクトスタンダートのようなものはあるんでしょうか?

>どういうのが望みだ?
今のとこviでカリカリやってるんですが、とりあえず制御文などのチェック機能(自動ハイライトとか)や行番号の管理とかあると助かります。
(でもこの程度だとIDEなんて大げさなものでなくとも、気の利いたエディタならできるのかも・・・)

規模が大きくなるとサブルーチンの管理とか大変ですよね
皆さんどうやってるんでしょうか?

901 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 01:10:55 ]
>>900
Intel Visual Fortran は visual studio に対応している。
昔はVisualStudioを別売りで買う必要があったが、今は制限版がIntelVisualFortranに付属している。

LaheyのFortranやSilverFrostのFTN95、PGIのVisuialFortranもVisualStudioに対応している。
ttp://www.lahey.com/
ttp://www.silverfrost.com/
ttp://www.pgroup.com/
他の商用コンパイラメーカーも大抵自作の統合環境をつけている。

EmacsもFortranModeがあってシンタックス・カラーリングとかしてくれる。
EclispのFortran環境にはphotranというのがある。
www.eclipse.org/photran/

他にもフリーの環境はある。
昔ロシア人が貧乏人向けにg77とフリー統合環境と廃版英語Textbookを束ねて配っていたのだが、
最近はもう時代遅れか・・・

902 名前:898 mailto:sage [2007/10/23(火) 02:45:05 ]
>>901
ありがとうございます。
Visual Studioに対応してるとは知りませんでした。ちょっとやってみます。

そういえばこれ、当然ながらWindowsでの開発だと思いますが、
Visual C++みたいな独自拡張とかはあるんでしょうか?
せっかく作ったのにLinuxで動かないとなったら困りますよね・・

903 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 02:51:27 ]
色分けやdo-enddoの自動インデントならvimでもやってくれますね。



904 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:46:22 ]
>>902
.NET対応版とか、Windows API 呼び出しとかしなければ、常識的な範囲でOK。

905 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 15:25:50 ]
vimのfotranの色づけはデフォルトだとイマイチなんすけど
ドキュメント読むの面倒なんで、お勧め設定晒してもらいませんか?

906 名前:905 mailto:sage [2007/10/23(火) 15:26:50 ]
×もらいませんか
○もらえませんか

907 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:11:51 ]
Fortran90ではコメント「c」やCOMMONは使えないんですか?
77の(ほぼ)スーパーセットと聞いたんですが、やってみたら駄目でした。

てことは、77のコードをポートするには一般に結構な書き換えを要する、ってことですかやっぱ

908 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:17:28 ]
>>907
先頭cコメントを使うためには、固定形式で記述する必要がある。
中途半端に自由形式を導入していないか?
回答者のために、コンパイラー名を書こう。

909 名前:907 mailto:sage [2007/10/23(火) 18:36:30 ]
>>908
レスありがとうございます。
>先頭cコメントを使うためには、固定形式で記述する必要がある。
そうなんですか。Intel Fortran 9.0なのですが、
固定形式か自由形式かはどうやって決まるんですか?
拡張子(というかsuffix)?

COMMONが使えないというのは勘違いでした。
複数行に渡るときの6列目の文字があるせいでした。90だと行末に&なんですね。


結局のところ、「77の(ほぼ)スーパーセット」といのは、77形式できっちり書いた場合の話であって、
90の機能と何でも混ぜていいわけではないんですね。。

910 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 20:44:40 ]
>>909
通常は拡張子が .f .for .ftn の場合は固定形式、 .f90 の場合は自由形式と解釈される。
# ifort は .f95 をソースとして認識しない。
コンパイル時のオプションに -fixed / -free を指定することによって強制的にそれぞれ
固定形式/自由形式の指定をすることも出来る。
また、拡張子を大文字(.F .FOR .FTN .F90)にするとコンパイル前にプリプロセッサで前処理される。

> 90の機能と何でも混ぜていいわけではないんですね。

1つのソースに固定形式/自由形式を混ぜてはいけない。
ただし、別々のファイルにすれば混在させることも出来る。

911 名前:907 mailto:sage [2007/10/23(火) 23:48:50 ]
>>910
ありがとうございます。非常に勉強になりました。

912 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 03:21:45 ]
High Performance Fortranていう仕様があるようですが、どういうところで使われているんですか?
普通のユーザには縁のないものですか

913 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:04:39 ]
>>912
90年代に並列プログラミングを考慮した規格として提案された。
日本のスーパーコンピュータメーカはコンパイラをちゃんと作ったが、
アメリカがやる気を見せず崩壊した。

地球シミュレータでもHPFは動いている。というかHPFはESに要求された仕様の一つだったような。




914 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 11:13:06 ]
>>913
崩壊、ですか・・・

推進評議会のサイトを見ると、「ユーザが最小限の指示文によってデータの分割配置の方法を
指定すれば、残る作業(計算の分割と通信の生成)をコンパイラが自動的に行う」とありますが、
分散メモリシステムで必要となる領域分割と通信を自動でやってくれる、ということですか?

今はFortran90+MPIという組み合わせが一般的だと思いますが、これよりも良い性能が出るんですか?

915 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 13:22:45 ]
>>914
MPIはどちらかというと消極的な理由でデファクトスタンダードになった。

ソフトウェア中心主義の視点からは、MPIはハードウェアの抽象度が低いので、
HPFのほうが上位に立つのだが、現実的にはハードウェアへの依存性が高くて逆転する。


ここに過渡期に実務で使った人の比較意見が載ってる。
ttp://grape.mtk.nao.ac.jp/~makino/articles/future_sc/note031.html#rdocsect36

916 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:03:35 ]
>>915
消極的ですか。確かにそんな気もしますね
OOPの可能性にwktkするも、性能とのトレードオフに嘆き、手続き型も含めた現実的な方法に帰着する、という話と似てるかも

ところでそのサイト見ていつも思うんですが、マ○ノさんてすごい人ですよね
ここまでコアな人はなかなかいないと思う

917 名前:912=914=916 mailto:sage [2007/10/24(水) 16:04:56 ]
>>915
スイマセン、お礼言うの忘れてました。
どうも有難うございました。

918 名前:デフォルトの名無しさん mailto:age [2007/10/28(日) 19:52:11 ]
WRITE文で改行しない標準FORMATを使いたいのですがどうすればよいでしょうか?
具体的には、
WRITE(*,*) 'x = ', x
という文を改行なしで表示したいのです。ここで、xはDOUBLEで、
xの大きさによって浮動小数点表示と固定小数点表示をコンパイラが判断して欲しいです。
よろしくお願いします。

919 名前:デフォルトの名無しさん [2007/10/28(日) 22:10:09 ]
>>918
改行しないのはFAQ このスレでも何度も出ている。
Fortran90 では、ADVANCE='NO' 

数値の大きさでフォーマットを変えるのは G Format これが77時代からある。

サンプル

PROGRAM unko
IMPLICIT NONE
REAL :: x, y
x = 0.1
y = 1.234567e11
WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'x=', x
PAUSE
WRITE(*, '(A, G15.5)', ADVANCE = 'NO') 'y=', y
STOP
END PROGRAM unko


920 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:32:38 ]
COMMONブロックをモジュールに書き換える作業をしております。その際わからないことがあったので質問させてください。
jjoo.hp.infoseek.co.jp/tips/f90/common_to_module.html
のサイトを参考に進めてきました。現在のプログラムの概略は次のような感じです(巨大なため全文ではありませんがご容赦くださいませ)
module sub
integer i,j
end modeule sub
program main
 use sub
 implicit none
call 1
call 2
end program main
subroutine 1
implicit none
integer i,j
(略)
end
subroutine 2
implicit none
integer i,j
(略)
end
この状態でコンパイル及び動作は出来るのですがサブルーチンにおいて変数部を
subroutine 1
use sub
implicit none
(略)
end
とするとコンパイル時に symbol 'rmax' ai (1) is defined in multiple modules というエラーが出てしまいます。
これはどのように解決したらよいのでしょうか。よろしくお願いします。

921 名前:918 mailto:sage [2007/10/29(月) 23:48:47 ]
>>919
欲しい結果が表示されました。ありがとうございます。

922 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 00:56:45 ]
>>920
それはエラーメッセージに書いてあるがごとく、複数のモジュールの中で同じシンボル名を
重複して使っているという事だろう。


コモンブロックに当たるモジュールは1個だけ作って、それをUSEで呼び出せばいい。
コモンのときは全副プログラムにコモンを置かねばならなかったが、もジュールは違う。


923 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 14:05:25 ]
CHARACTER*(*) HOGE のように、配列数が(*)となっているのはどういう意味なんでしょうか
動的に確保するということでしょうか?



924 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:18:34 ]
>>923
HOGEの長さは
HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。
HOGEが副プログラムの仮引数の場合、対応する実引数と同じ長さ。
HOGEが関数副プログラムの場合、その関数を使用する側で予め決められた長さ。

925 名前:920 mailto:sage [2007/10/31(水) 05:54:42 ]
>>922
遅くなって申し訳ありません。レス有り難うございました。
なるほど、モジュールは一度読み込めばよいと言うことだったんですか。
そこで、サブルーチン中のuse文を消してみたところ
そのエラーは吐かなくなりました。
その代わり
x0(n)=2.d0*rn
 1
Unexpected array Reference at (1)
と言ったようなエラーが出るようになってしまいました。エラー文では配列の参照がおかしいみたいなことを書いてますがどのようなことなのでしょう。
内容が同じ物をcommon文としてかいた時は問題なく動作したので
配列の宣言がおかしいってこともないと思うのですが・・・

926 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 10:58:31 ]
>>923
FORTRAN90以前では、基本的に変数は参照渡しで、実際には先頭番地しか渡していない。
また呼び出し側と呼び出される側での引数の整合性もチェックしていない。
さらに実行時にも、デバッグオプションをつけない限り、はみだしチェックのようなことはやってない。

したがって、副プログラム側では、引数の大きさはどうでもいいことになる。
このためFORTRAN66あたりまでのプログラムでは、配列にも適当な長さを指定するのが伝統だった。
(文字列は、まだ存在しなかったので・・・というか整数型に突っ込んでいた・・・・質問から外れるが)

というわけで、FORTRAN77規格で、それを明示的に指定した書式が(*)だ。(とおもうw)
長さ『*』は、『適当』という意味だ。文字列のみならず数値型配列の最後の要素にも使える。

Fortran90以後は、色々コンパイル時のチェックが入るようになって、PASCALみたいでうぜぇという人達もいる。
最近のスクリプト言語は、型にゆるいのが多いが、昔のFORTRANに先祖がえりしているのである(嘘w


927 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 11:01:20 ]
>>925
モジュールの宣言は1個で、USEは使うルーチンごと毎回だ。
カスケード的にUSEしているなら、深いほうで1回読んでおけばいい。


928 名前:923 mailto:sage [2007/10/31(水) 18:13:56 ]
どうもありがとうございます。

>>924
>HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。
HOGEをHOGE="hoge"と変数にしたら駄目でした。定数しか駄目なんですね。

>>926
ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね?
例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・

929 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:21:08 ]
>>928
>ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね?
>例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・
いや、別に10のままでも、本質的には何も変わらない。
どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。

あと、多次元配列の場合、最後の次元以外は一応意味があるので、ちゃんと指定しないといけない。
ただ、FORTRAN77では整合寸法を別に引数で送るのが適切とされている。


930 名前:デフォルトの名無しさん [2007/11/01(木) 01:12:57 ]
何が原因かわからないのですいませんがどこが間違ってるのかご指摘お願いします.
縦300横10の配列を読み込んで,ただの列にしたいだけなんです.
エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか?
それも含めて教えてください.


program hairetu
open(30,file='a.dat',status='old')
do 10 j=1,10
read(30,*)(b(i,j),i=1,300)
10 continue
close(30)

open(20,file='b.dat',status='new')
do 50 i=1,300
do 40 j=1,10
write(20,*)b(i,j)
40 continue
50 continue
close(20)

stop
end

931 名前:930 [2007/11/01(木) 01:19:49 ]
付け足しです.このようなエラーメッセージが出ています.


0004) read(30,*)(b(i,j),i=1,300)
*** B is a function name - a function reference is not allowed in a READ
statement list
*** Invalid input/output list
2 ERRORS


932 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:20:00 ]
>>930
> どこが間違ってるのかご指摘お願いします.
・配列 b の宣言がない。
・「縦300横10」のデータなら読み込み時の i, j の終値が逆。

> エクセルを使えば,FORTRAN使うほどのことでもないのでしょうか?
これくらいの処理ならExcelでもなんでも結果が出せればおk
ということで。

gawk "{ for (i=1; i<=10; i++) print $i }" a.dat > b.dat

933 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:36:36 ]
ちなみにスレ違いだがWindows 2000以降なら以下のようなバッチファイルでも処理できる。

@echo off
if exist b.dat del b.dat
for /F "delims=" %%r in (a.dat) do (
for %%f in (%%r) do echo %%f >> b.dat
)



934 名前:923 mailto:sage [2007/11/01(木) 13:21:29 ]
>>929
>どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。
そうなんですか。ちょっと混乱してきたのですが
ということは、仮引数の配列数は結局は関係ないということですか?

>いや、別に10のままでも、本質的には何も変わらない。
では仮引数の配列数を明示指定するのは、単なる慣習みたいなもの、ってことですか?

935 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:14:19 ]
>>934
そういえなくも無い。1960年代のプログラムを見ると、任意長の配列がよく大きさ10で宣言されている。
ただテキストの場合は、本当に10個の要素だと思うがw

SUBROUTINE ZERO(n, a)
DIMENSION a(10)
DO 10 i = 1, n
a(i) = 0.0
10 CONTINUE
END

見たいなのがよく使われていた。

これとまぁ等価なのが DIMENSION a(*) で、もっと上品な書き方は整合配列を用いて DIMENSION a(n)
とやる方法。後者をお奨めする。だがFortran90で書くことをもっとお奨めするw

先頭番地しか渡していなので、呼ぶ側では、配列の途中から渡したりできる。
REAL a(100)
CALL zero(100, a)
CALL zero(50, a(51)) --->Fortran90での a(51:100) = 0.0

普通のテキストには書いてないが、77までのプログラムでは、こういうのを知らないとまともに
プログラムが読み書きできない。昔は誰も教えてくれないので徒弟制度で叱られながら学ぶか、
他人のコードを読んで泣きながら覚えるしかなかった。


漏れの読んだテキストで、そういう事が書いてあったのは、この本くらいか。
ttp://www.star.le.ac.uk/~cgp/prof77.html
(他の本にも書いてあったが、単に読んだ時のスキルが足りなくて理解できなかったのかもしれないがw)

936 名前:923 mailto:sage [2007/11/02(金) 14:17:22 ]
>>935
なるほど・・・よくわかりました。そういうコアな話を聞ける人が周りにいないもので、とても勉強になります。
丁寧な解説ありがとうございました

937 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 14:04:31 ]
>ただテキストの場合は、本当に10個の要素だと思うがw
これどういう意味ですか?
文字列配列も普通の配列に変わりはないと思うんですが

938 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 18:15:19 ]
>>937
テキストは本当に10個に固定の要素を扱っているのではないかという事。
深い意味は無い。


939 名前:937 mailto:sage [2007/11/05(月) 01:33:05 ]
気になったので簡単にテストしてみました。
サブルーチン内で普通に文字列代入する(sub1)のと直接要素に代入する(sub2)のとでは違うようですね。
後者は通常の配列と同様な参照渡しなのに対し、前者は少し違った処理をする、ということでしょうか?

implicit integer(i-n)
character*3 text1 /'aaa'/
character*3 text2 /'aaa'/
call sub1(text1)
write(*,*) text1
call sub2(text2)
write(*,*) text2
end

subroutine sub1(text)
character*2 text
text = 'b'
end
subroutine sub2(text)
character*2 text
text(1:1) = 'b'
end

<結果>
b a
baa

940 名前:デフォルトの名無しさん mailto:sage [2007/11/05(月) 03:17:08 ]
>>939
たぶんサブルーチン側ではtext*2で宣言しているので、
sub1 では text(1:2) = 'b ' の扱いになったんだと思う。
参照渡しなのは変わんないと思う。

text = 'b' は、一文字目は'b'として2文字目以降宣言長まではスペースを補填するのだと思う。


941 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 13:28:20 ]
fortranの仕様ってどこが決めてるの?
少なくとも数値計算屋だよね?

942 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 00:39:48 ]
>>941
ttp://www.j3-fortran.org/

いちおう、(コンパイラ、ハードウェア)ベンダー、ユーザー、大学人なんかが入っているはず。
なんだかイギリスが生意気にデカイ面している。

Fortran2008で、Crayのハードウェアに最適化されているCoArrayが規格に入ったのが気に食わない。


943 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 01:06:31 ]
コーエンちゃん早く2003の処理系つくって



944 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 14:40:25 ]
>>942
やっぱ向こうじゃNECよりCrayが優先されるんだろうね

945 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:02:52 ]
>>944
『向こう』ってなんだよw 欧米コンプレックスの40代の爺さんかよwwww

Fortran2008は、本来はFortran95のようにマイナーアップデートのはずなのに、
こういう妙な機能を入れ込ませようとする政治臭の漂うことをやると、信頼性をなくすと思うのだがな。



946 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 22:42:08 ]
HP Fortran で以下の二つを実現することは可能ですか?
1) リトルエンディアン形式のバイナリ出力
2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方



947 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:14:02 ]
>>946
マニュアル嫁

1) リトルエンディアン形式のバイナリ出力
Itanium機では出来る?
ttp://docs.hp.com/ja/B3908-90009/ch08s08.html

2) Intel Fortranのopen(10, 中略, form='binary')に相当するやり方
DIRECT ACCESSで1バイトづつ読むというテクニックで切り抜けられる。


948 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:44:30 ]
そういやIntel Fortran もようやく ACCESS='STREAM' が使えるようになったな。
これで処理系毎に書き直さなくて済むようになる。

949 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 23:58:25 ]
>>947
ありがとうございます。

1)
そういえば、CPUの種類は確認してなかった・・。
たぶんItaniumだと思うんですが、、。
職場行ったら確認して試してみます。

2)
これはちょっと大変そうですね。
ヘッダー部、データ部、それぞれで型の違う変数を扱わなければならず、
変換が大変そうです。

4byteの変数を出力する際、1byteずつ逆から出力する必要があるってことですよね・・


950 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:12:25 ]
>>949
文字列で読み出して、それをINTEGERやREALやREAL*8とEquivalenceをかけて置けばOK


処理系によって、RECL=1 にしたときに1byteになるものと、1語になるものがある。
たとえばIntelFortranではデフォールトは1語=4バイトだが、オプションで切り替えできる。



951 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 01:14:51 ]
Fortran2003でOPEN( ... ACCESS='STREAM') が規格に入ったので、新しいコンパイラなら先取り導入
されている可能性大。


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






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

前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