くだすれFORTRAN(超初心者用)その3

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/01/18(日) 20:12:21
全く同じソースコードがコンパイラのオプション次第で違う結果になって無問題ですか
プログラムってそういうものだったのですね

まあ並列プログラムなら当たり前ですね
ごめんなさい私の認識が根本的に間違えてました
953デフォルトの名無しさん:2009/01/18(日) 20:18:00
>>952
もし新しいコンパイラを、仕様チェックなど何ら下調べもせずに使って
「結果違うじゃん」とか言ってるんだとしたら、おめでたすぎ
そういうやつは古いコンパイラずっと使ってればいい

つーか非線形非定常のシミュレーションだと、オプション次第で結果が微妙に変わるなんて珍しくもないんだが
954デフォルトの名無しさん:2009/01/18(日) 20:20:03
>>951
計算が大きくて特別なハードを使うのが偉いというわけでもないけどな。
古いコードを動かすことが出来るか出来ないかはそれなりに重要。
それに古いコードとの互換性を話することが即
新しいハードの機能を使うことを全く考えない、ということを
意味するわけではないんだけどな。
それこそ特定の機能を使って速度を上げる事「だけ」にうんうん悩むのも
何やってんの?ってかんじだけど。マッチ・ポンプだわな。
ま、それで飯は食えるかもしれんけどね。
955デフォルトの名無しさん:2009/01/18(日) 20:59:25
>>946
vimですかー
vi系は全然知らなくて使えないんですよねぇ
練習しようかな
956デフォルトの名無しさん:2009/01/19(月) 01:01:17
>>938 >>942 >>946
WZ Editor 5 使ってる人いる?
色分けがかなり柔軟だから大好き。
957デフォルトの名無しさん:2009/01/19(月) 03:39:59
>>956
結構高いですね
958デフォルトの名無しさん:2009/01/19(月) 10:26:49
個人的にはMS-DOSプロンプトで動くvi(のエミュレータ)があるといいな。
959デフォルトの名無しさん:2009/01/19(月) 13:07:29
>>956
重さはどんくらい?
コーディング用のエディタは軽いことが大事だと思うんだが
960デフォルトの名無しさん:2009/01/19(月) 13:08:50
>>958
昔elvis.exeってあったぞ。
今でもメンテされてるかどうかは知らん。
961デフォルトの名無しさん:2009/01/19(月) 13:45:14
>>960
情報ありがとう。捜してみる。
962899:2009/01/19(月) 15:37:50
遅レスごめんなさい。CUDAのfortran対応について教えてくれた方々、
ありがとうございました。用途からしてfortranにこそ最初から対応せいよ、
というのは世間の感覚からずれてるんでしょうねw
963デフォルトの名無しさん:2009/01/19(月) 16:23:13
まずはゲームをターゲットとしてるからじゃないの?
ゲームじゃ普通C++だし
964デフォルトの名無しさん:2009/01/19(月) 16:26:39
そこでオブジェクト指向(古っ)でVisualなFortranを・・・
965デフォルトの名無しさん:2009/01/19(月) 16:31:20
call qqほにゃらら...
966デフォルトの名無しさん:2009/01/19(月) 17:45:33
>>959
1万行くらいのソースをいじるけど、
重さを体感できないから、1mg くらい。
967デフォルトの名無しさん:2009/01/19(月) 23:46:22
>>958
日本語Windows版 Vim 7.1 にはCUI版も一緒に入ってるよ。
本家 vim.org の方には16bit DOS用まであるよ。
968デフォルトの名無しさん:2009/01/20(火) 06:09:25
>>967
おお、さんくす!
version6.3以降でCUI対応になってたんだね。さっそく使ってみるよ。
969デフォルトの名無しさん:2009/01/21(水) 00:14:15
>>962
いや、コンパイラの従来言語の範囲内での対応ではFortranとCは同時になされている。
今までのCUDA対応は、あくまで専用言語か、プログラマ側がすべてを負担するAPI
呼び出しになっていた。

倍精度、IEEE準拠の条件が整ってきた今、Fortranからやれというのは、
それほど的外れでもないと思う。HPC分野に食い込めればの話だが。

970デフォルトの名無しさん:2009/01/21(水) 03:05:11
cudaが倍精度いけるようになってたんだね
971デフォルトの名無しさん:2009/01/21(水) 10:54:58
nvidiaのやる気次第か
いや、やる気はあるが体力の問題か・・・
972デフォルトの名無しさん:2009/01/22(木) 02:20:45
単純な数値計算を行っているのですがデータファイルを読み込むときに
現在はファイル名を直接打ち込んでファイル名を指定しているのですが
Explorerのように選択式にすることってできませんか?

もしくは「あるディレクトリに存在するすべてのファイル名を取得する」コマンドはありませんか?
(DOSコマンドのdirのようなものです)
よろしくお願いします
973デフォルトの名無しさん:2009/01/22(木) 03:59:13
>>972
Win32のAPIを呼び出さないとできない。

974デフォルトの名無しさん:2009/01/22(木) 04:19:22
>>972 の後半
do-loop つかってファイル名を無差別に生成して
inquire つかってしらみっつぶしに・・・
975デフォルトの名無しさん:2009/01/22(木) 06:11:53
cpad for salford ftn77
でプログラミングしてるのですが
倍精度に変えようと型宣言でREALをREAL*8またはDOUBLE PRECISIONに変えてみてもうまく走りません
型宣言はINCLUDEで、.incでまとめて宣言しているのですが…
倍精度で計算するにはどうしたら良いのでしょうか?
976デフォルトの名無しさん:2009/01/22(木) 10:26:07
文字の表示ってPRINT文なのですね
てっきりWRITE(6,)って書くのかと思ってた
977デフォルトの名無しさん:2009/01/22(木) 10:51:33
>>976
FORTRAN77全盛時代はWRITE(6,*)、6が出るのは66時代の名残。
しかし推奨はWRITE(*, *)だった。

普段はWRITE(*,*)を使って、PRINT文はデバッグ出力用にとっておくと、
デバッグ出力の消し忘れがなくなるぞい。

READに対しては、READ(5,*)→READ(*,*)→READ *の、同等な関係がある。
978デフォルトの名無しさん:2009/01/22(木) 16:55:37
どうもありがとうございます
WRITE文で書くと
コンピューターって感じがして好きです
979デフォルトの名無しさん:2009/01/22(木) 17:02:20
>>973
ちょっとがんばってみます

>>973
入力ファイル名は数字のみかつある程度規則性があるので不可能ではないですがやめておきます.
980デフォルトの名無しさん:2009/01/22(木) 17:10:35
ちょっと調べてみたところWin32APIは私には無謀だということが分かりました
素直に打ち込みます
ありがとうございました
981デフォルトの名無しさん:2009/01/22(木) 21:09:51
GUIが簡単に作れる他の言語で選択したファイル名のリストを
ファイルに出力するようなプログラムを作っておいて前処理で走らせる
という手もある。
982デフォルトの名無しさん:2009/01/22(木) 21:21:09
なるほど
無理にひとつのプログラムにしようとするから難しいので
むしろそんなフリーソフト探したらありそうな・・・あった!
それでやってみます。ありがとうございました
983デフォルトの名無しさん:2009/01/22(木) 22:17:09
>>977
>普段はWRITE(*,*)を使って、PRINT文はデバッグ出力用にとっておくと、
>デバッグ出力の消し忘れがなくなるぞい。

いいこと聞いた!
984デフォルトの名無しさん:2009/01/23(金) 13:01:33
>>980
Visual Fortran なら、サンプルがWin32の下にあったはず。
サンプルディレクトリを味噌。
985デフォルトの名無しさん:2009/01/23(金) 16:00:36
WIN32APIのサンプルありました
あったのですがそれをどのように使えば良いのか理解できませんでしたorz
ちょっと勉強してみようと思います
参考になりました,ありがとうございました
986デフォルトの名無しさん:2009/01/23(金) 22:24:46
今まで使っていた G4 Mac を新しいインテルMac にしたら,今まで使っていたAbsoftの
F77コンパイラが使えなくなりました。そこで g77 を試しているのですが,古いソースで
コンパイルできないものが出てしまいました。例えば次のようなものです。

do 101 i = 1, 5
if (i.eq.2) go to 101
do 101 j = 1, 5
write(*,*) i, j
101 continue
end

エラーメッセージは以下の通りです。

--------------------------------------------------------------------
g77test/test4.f:4:
if (i.eq.2) go to 101
1
g77test/test4.f:5: (continued):
do 101 j = 1, 5
2
Reference to label at (2) inconsistent with earlier reference at (1)
--------------------------------------------------------------------

このような形式で書かれたソースプログラムが山のようにあり,とても全部を書き直す気に
はなれません。何かのオプションを指定してコンパイルすれば良いのではと思い,いくつか
の試みましたがどれもダメでした。良い知恵は無いでしょうか。

PC:MacBook
OS:10.5.6
g77:3.4.3-104
987デフォルトの名無しさん:2009/01/23(金) 22:35:04
>>985 世話が焼けんなw ほとんどサンプルと同じものだが・・・

! see c:\Program Files\Intel\Compiler\11.0\066\fortran\Samples\Fortran\Win32\GetOpenFileName
MODULE m_open
USE comdlg32
USE user32 ! Interface for GetForegroundWindow
IMPLICIT NONE
CHARACTER(1), PARAMETER :: eot = ACHAR(0) ! end of text (end of C string)
CONTAINS
!-----------------------------------------------------------------
SUBROUTINE get_file(filename, filter)
IMPLICIT NONE
CHARACTER(*), INTENT(OUT) :: filename
CHARACTER(*), INTENT(IN ) :: filter
TYPE (T_OPENFILENAME) :: ofn
INTEGER :: istatus
ofn%lStructSize = sizeof(ofn)
ofn%hwndOwner = GetForegroundWindow()
ofn%hInstance = NULL ! hInstance
ofn%lpstrFilter = loc(filter)
ofn%lpstrCustomFilter = NULL
ofn%nMaxCustFilter = 0
ofn%nFilterIndex = 1 ! Specifies initial filter value
ofn%lpstrFile = loc(filename)
ofn%nMaxFile = LEN(filename) - 1
ofn%nMaxFileTitle = 0
ofn%lpstrInitialDir = NULL ! Use Windows default directory
ofn%lpstrTitle = loc('' // eot)
ofn%Flags = OFN_PATHMUSTEXIST
ofn%lpstrDefExt = loc('txt' // eot)
ofn%lpfnHook = NULL
ofn%lpTemplateName = NULL
988デフォルトの名無しさん:2009/01/23(金) 22:36:40
istatus = GetOpenFileName(ofn)
IF (istatus .eq. 0) THEN
filename = ''
ELSE
filename = filename(1:INDEX(filename, eot))
END IF
RETURN
END SUBROUTINE get_file
END MODULE m_open
!==================================================================
PROGRAM f_open
USE m_open
CHARACTER(*), PARAMETER :: filter ='ALL Files (*.*) ' // eot // '*.*' // eot // &
'Data Files (*.xy) ' // eot // '*.xy' // eot
CHARACTER(512) :: filename = '' // eot
CHARACTER(132) :: buff
INTEGER :: i
CALL get_file(filename, filter)
OPEN (9, file = filename)
DO
READ(9, '(a)', END = 99) buff
WRITE(*, *) TRIM(buff)
END DO
99 STOP
END PROGRAM f_open

これは特にオプションなどを変えることなくコンソールアプリとしてコンパイル・実行できる。
サブルーチンのパラメータは、ファイルの拡張子の限定だ。
ファイル名を第一引数で返す。
989デフォルトの名無しさん:2009/01/23(金) 23:18:18
>>986
文法的に厳密に言うと、101にとんだ後、どっちのDO...LOOPをまわせばいいのか
決めかねるので、コンパイラが文句を言う気持ちもよくわかる。

文脈的には外側のループを回したいのだろうと思う。
それならば、
C if (i.eq.2) go to 101
if (i.eq.2) CYCLE
で、元のをコメントアウトして、F90文法のCYCLEを使えばいい。


それがいやならABSOFTのMac版を買うのがよろしいw
30日くらいの試用もできたんじゃなかったかな?

あるいはg77ならいくかもしれない。
990デフォルトの名無しさん:2009/01/23(金) 23:51:28
>>987
いやもう本当になんとお礼を言ったらいいのかわかりません
出来ました.完璧です.
buffのところをReal型の変数に変えたらファイルの中の数値もバッチリ読み込んでくれました
ありがとうございます

私の使ってるCompaqの方にもGetOpenFileNameのサンプルありました
(これがファイル名取得のサンプルってことにさえ気づいてませんでしたがw名前モロですね)
それより断然分かりやすくて良かったです
Compaqの方はどれがファイル名の引数かわからなかったですし
私はFortranを本当に少しかじったくらいなのでもう諦めてたんですが
(DO文が指定無しで無限に回ってくれることも知りませんでした)

本当にお手数おかけして申し訳ありません
ただちょっと楽をしたかっただけなのにここまでしてもらってw
このサンプルが理解できるくらいちょっとずつ勉強していきます
本当にありがとうございました
991デフォルトの名無しさん:2009/01/24(土) 03:36:08
>>987
えらいな。

先頭のコメントをみてVisual Fortranのバージョンが11になっているのを今初めて知った。
992デフォルトの名無しさん:2009/01/24(土) 04:08:08
>>975
コンパイル時のオプションのAUTODBLを使うという安易な手がある。

FTN77の場合は、
/DREAL
Enables the automatic generation of DOUBLE PRECISION and DOUBLE
COMPLEX for all REAL and COMPLEX and intrinsic functions.


あと、正攻法で行きたいのなら、メインルーチン、サブルーチン、関数、ブロックデータ等のすべての
プログラム単位の冒頭に、
IMPLICIT REAL*8(A-H,O-Z)
を入れるのが昔の定石。
べた書きの数値定数や複素変数は個別に対応しないと駄目だが・・・
993デフォルトの名無しさん:2009/01/24(土) 11:10:45
>>816
マジレスするとだな

君が応援してる若手騎手を長らく見守って、
彼が中堅になり、やがてはベテランになるころにはわかるよ。

994デフォルトの名無しさん:2009/01/24(土) 12:54:21
入力した実数を小さい順に並べるにはどうしたらよいのでしょうか?
995デフォルトの名無しさん:2009/01/24(土) 13:18:14
>>994
WRITE(*,*) '小さい順に入力して下さい。'
READ(*,*) (A(I), I=1,10)
もしくは ソート でググれ

そんなことより、だれか次スレお願い
996デフォルトの名無しさん:2009/01/24(土) 14:23:24
しまった、もうこんなレス番か・・・
テンプレを充実させようかと思ったが遅かったorz
次スレでやろう
997デフォルトの名無しさん:2009/01/24(土) 16:44:30
埋め その1
998デフォルトの名無しさん:2009/01/24(土) 18:34:04
次スレ

くだすれFORTRAN(超初心者用)その4
http://pc11.2ch.net/test/read.cgi/tech/1232789521/
999デフォルトの名無しさん:2009/01/24(土) 18:56:40
ありがとう
1000デフォルトの名無しさん:2009/01/24(土) 18:57:21
>>993
誤爆?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。