くだすれFORTRAN(超初心者用)その4at TECH
くだすれFORTRAN(超初心者用)その4 - 暇つぶし2ch852:デフォルトの名無しさん
10/01/18 22:53:26
>>851
COSはFORTRANの規格で規定されているINTRINSICな関数で、COSは総称名になっている。
引数の型で関数の値の型も決まる。
ただ、66時代の互換性などから、個別の型をあらわに指定するDCOSなどもある。
しかし77時代以降は総称名を使うのが推奨されていたはず。

さて、ERFの方だがこれはFORTRANの規格にはないベンダーの提供する独自関数である。
したがってその実装や用法はベンダーに依存する。
たとえばINTEL FORTRANの場合は、REAL(8)の宣言無しにDERFが使える。
PGIでは、外部関数扱いで、関数の型を宣言しておく必要があるのだろう。

なお、ERFというのはUNIX系の多くのFORTRANで使えた関数で、半ば標準化している。
Fortran2008ではそれらのエラー関数、ベッセル関数などが正規の規格に入ることになっている。




853:851
10/01/19 00:21:02
>>852
大変分かりやすい解説をしていただき、ありがとうございました。
derfもintrinsicな関数だと思い込んでいました。

854:デフォルトの名無しさん
10/01/19 13:55:21
>>852
>しかし77時代以降は総称名を使うのが推奨されていたはず。
マジ?
律儀にD*使ってた・・・

855:デフォルトの名無しさん
10/01/19 14:00:42
人のデータ使う場合、単と倍精度が入れ乱れるし・・・
普通にd* で明示してもいいと思うけどな。
単精度に揃えたい!とかはコンパイルオプションで出来るし。

856:デフォルトの名無しさん
10/01/19 21:03:41
やっぱ総称名って使わないほうがいいの?

857:デフォルトの名無しさん
10/01/19 21:21:43
インテル Visual Fortranコンパイラ9.1を使っているんですが、インストール後
サンプルプログラム(sample.for)をコンパイルしたところ、下記のエラーがでてしまい、うまくできません。
エラー内容:
ifort: error: unable to run '<Microsoft VC++ Dir>\\Bin'

このため、.objファイルは出力されるのですが、exeファイルが出力されません。
よろしくお願いします。


858:デフォルトの名無しさん
10/01/22 23:41:44
>>857
MSのSDK入れろ


859:デフォルトの名無しさん
10/01/24 21:39:26
"2500/500"のような文字を読み込んで、
2500 / 500 = 5
を計算したいのですが、下のコードでは
"/"が読み込めないみたいです。
改善方法を教えていただけないでしょうか?

できれば、"2500"や"500"の部分を任意の桁数でできると幸いです。
コンパイラはG95です。

IMPLICIT NONE
CHARACTER :: A*5, B, C*5
REAL*8 :: Num1, Num2
PRINT*, "Input"
READ*, A, B, C
PRINT*, "A=", A, " B=", B, " C=",C
READ(A(1:), *) Num1
READ(C(1:), *) Num2
PRINT*, Num1/Num2
END

よろしくお願いします。

860:デフォルトの名無しさん
10/01/24 22:12:58
>>859
FortranのI/Oでは「/」は改行を意味している。
よって文字と解釈していなのだろう。

前にもそんな事を聞いていた奴がいたような・・・

回避する方法は、わからん。
文法書のI/Oのところをじっくり読んで自分で考えてくれ。


861:860
10/01/24 22:27:59
>>859
しらべたw
READ文にFORMAT指定をすればよろし。
READ '(3A)', A,B,C
とすれば多分おk


862:859
10/01/24 22:57:22
>>860

"/"を文字として認識することができました。
ありがとうございます。

863:860
10/01/25 00:38:43
>>859
おk。

任意の桁数でやるには
INTEGER :: kslash
CHARACTER(128) :: text
READ '(A)', text
kslash = INDEX(text, '/')
READ( A(1:kslash - 1), * ) num1
READ( C(kslash + 1:), * ) num2

という感じだろう。TRIMでtextの尻の空白を切ったほうがいいかもしれん。
むろん任意と言ってもREALの範囲内の数だが・・


864:デフォルトの名無しさん
10/01/25 00:39:52
訂正www

READ( text(1:kslash - 1), * ) num1
READ( text(kslash + 1:), * ) num2

865:859
10/01/25 07:35:21
>> 863

おお!重ね重ねありがとうございます。
無事に作ることができました。

866:デフォルトの名無しさん
10/01/25 20:32:37
初心者すぎて笑われるかもしれませんが平面上の3点の座標で三角形つくるときの面積を求めたいのですが
当然ながらヘロンの公式でやりました
辺の長さが出てる場合であればうまくいくのですが長さの計算も入れようとするとどう座標を扱えばいいかちんぷんかんぷんで
X(I)とY(I)で1~3まで動かしかたがわからないというか…その考えが間違ってるのかもわからないです

867:デフォルトの名無しさん
10/01/25 20:57:24
>>863
Fortran兄貴降臨!いつもお疲れさまっす。

ただ、Fortranの思想的に>>859みたいなことは、やるべきではないとは思う。
perlでもpythonでもシェルでもいいが、Fortran実行ファイルを適当なラッパーで
くるむほうが、素直で良いと思う。

868:デフォルトの名無しさん
10/01/25 21:11:49
>>866
君なりのソースをここに書けば直して貰えると思うよ。

869:デフォルトの名無しさん
10/01/25 21:54:30
>>866
数学がわからんの?
Fortranがわからんの?

上の方も書いてるけど、わかってるところまでのソースを書くとよろし。

870:デフォルトの名無しさん
10/01/26 01:04:31
>>867
Fortranでパーサー書こうぜ!
再帰があるから、77時代ほど難しくないはず・・・


871:デフォルトの名無しさん
10/01/26 14:19:14
>>870
とてもうろ覚えだけど・・・
DECのVMSってFortranでかなりの部分は書かれていたような。
IMEというか英語を日本語に変えるやつは堂々Fortranだったような。
・・・とてもうろ覚えだけど。

872:デフォルトの名無しさん
10/01/29 08:26:49
はじめまして。初心者ですがよろしくお願いします。
突然ですが、この問題を解ける方いらっしゃいますか。
学校の宿題なのですが、どうしても分からないのでここにきました。
お願いします。

問題こちら↓
階乗 n! を計算する関数を作成し,
順列
 n個の異なるものからr個取り出して並べる。
 このときの順列の総数をnPrとあらわす。
 nPr=n(n-1)(n-2)・・・(n-r+1)
を計算する関数を作成し,

組み合わせ
 異なるn個からr個取り出して組を作る。
 このときの組合せの総数をnCrとあらわす。
 nCr = nPr/r!

を計算するプログラムを作成しなさい。(問題終わり)

よろしくお願いします。

873:デフォルトの名無しさん
10/01/29 18:29:35
Permut[n_, r_] := Pochhammer[1 + n - r, r]
Permut[n, r]/r!

874:デフォルトの名無しさん
10/01/29 19:47:54
オープンしている特定のファイルのバッファを
フラッシュする方法はありますか。コンパイラはifortです。
出来ればクローズしないでフラッシュしたいのですが、
どうしてもバッファにたまってしまいます。
よろしくお願いします。

875:デフォルトの名無しさん
10/01/30 01:06:31
872の丸投げぶりはすごいな。
途中まで書いたソースコードでもここに貼ったら?



876:デフォルトの名無しさん
10/01/30 01:14:32
C/C++の宿題スレが丸投げだからその流れがこちらまで来たか

877:デフォルトの名無しさん
10/01/30 10:34:15
初秋の青空を連想するくらいのすがすがしい
丸投げw

878:デフォルトの名無しさん
10/01/30 16:23:48
>>874
CALL FLUSH(ユニット番号)

879:874
10/01/31 04:55:24
できました! >>878
ありがとうございます!

880:デフォルトの名無しさん
10/01/31 21:11:44
プログラムで値を入力して計算結果を得たいのですが、結果を出力するとNaNが出てしまいます。
NaNが出力される原因だけでもいいのでわかる方いらっしゃったら宜しくお願いします。
URLリンク(www.dotup.org)
長いのでろだに上げました。テキストファイルですみません…

881:デフォルトの名無しさん
10/01/31 21:24:10
丸投げ、流行ってるな。

882:デフォルトの名無しさん
10/02/01 09:17:59
ifort -g -check all traceback
とかでNaNにかぎらず異常値が発生したらその行を教えてくれるような実行ファイルをつくってくれる
オプションがあるはずだから、マニュアルよんでみよう。
>>878
それ、よさそうだね。
ログ生成がゆっくりの場合、あるていど溜るまでディスクには書かれないから不便な事がおおかったけど、
いろいろと助かりそうだ。参考にするよ!

883:デフォルトの名無しさん
10/02/01 18:38:34
へぇそんなんあったんだ

884:デフォルトの名無しさん
10/02/02 00:00:51
>>880
66スタイルで何やってるかわからんなw
NUMPACK使っているところを見ると、富士通、名大・九大・京大あたりの流れか。
ライブラリ関数が無いから実行することもできないしもっと詳しく書いてくれないと誰も答えられないだろう。

まぁ定数や関数の一部が単精度のままなので倍精度にしている意味がない可能性が高い。
その辺かな?w


885:デフォルトの名無しさん
10/02/02 00:04:41
>>882
FLUSHはFortran2003で導入された命令。
IntelのHELPはF2003命令がいまいち入ってなかったりしてアレなので、
文法解説書を買って学ぶがよろしい。



886:デフォルトの名無しさん
10/02/06 09:14:48
>>885
そうなんだ。何年か前に g77 でサブルーチン版の flush をつかったことあがった。
今確認したら、やっぱり使えた。因みに g95 だと関数版の flush が使えた。関数
版だと戻り値でエラーチェックできるから有り難い。

887:デフォルトの名無しさん
10/02/07 15:54:15
FFTについて質問させてください。

大学の講義で、離散フーリエ変換のプログラムについて勉強中です。
講義の最後に、「バイオリンの音のデータをフーリエ変換し、
フーリエ変換した結果を横軸:周波数、縦軸:振幅としてグラフ化せよ」
という課題が出ました。
配布されたデータの読み込みを試みたのですが、どう読み込ませたらいいのかが分かりません。
配布されたデータは2列で構成されており、左の列が時刻データ、右の列は音の振幅を表しています。

↓にプログラムを書きます。よろしくお願いします。

888:デフォルトの名無しさん
10/02/07 15:56:08
--前半--

program fft

implicit none
!========================================================================
include "fftw_f77.i"
integer*8 ::plan
!========================================================================
!サンプリング条件の設定
!サンプリングデータ数N , aの数Ma , bの数Mb
!サンプリング間隔dt = 1/44100 [s] , サンプリング周波数 f0 = 44100 [Hz] , N, Ma, Mb
!周波数分解能df=1/(N・dt)
integer,parameter:: N=10000,Ma=5000,Mb=4999
real(8),parameter:: df=44100/dble(N) , dt=1.0d0/44100
!入力波形のデータの設定fin=100Hz
real(8) ::fin,a0
!作業用の変数
complex(8):: in(N),out(N),c(0:n-1)
integer ::i
real(8) ::t,a(0:Ma),b(1:Mb),x,y

889:デフォルトの名無しさん
10/02/07 15:57:26
--後半--
!入力データの設定
write(*,*) 'Input data:'
open(unit=11,file='violin.dat')
do i=1,N
※ここが分かりません!※
end do
close (11)
!========================================================================
!ライブラリを利用したフーリエ変換(作業領域作成と実行)
call fftw_f77_create_plan(plan,N,FFTW_FORWARD,FFTW_ESTIMATE) !準備
call fftw_f77_one(plan,in,out) !実行
!========================================================================
!結果の変換
c(0:N-1)=out(1:N)
a(0)=c(0)
a(1:Ma)=dble( c(1:Ma)+c(N-1:N-Ma:-1) )
b(1:Mb)=dble( (c(1:Mb)-c(N-1:N-Mb:-1))*(0.0d0,1.0d0) )
!========================================================================
!結果の出力
write(*,*) 'Output data after forward FFT:'
open(unit=22,file='ab-.csv')
open(unit=21,file='c-.csv')
do i=1,N
write(21,'(i6,'','',1pe16.8,'','',1pe16.8)') i,out(i)
end do
write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') 0.0,a(0),0.0
write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') (i*df,a(i),b(i),i=1,Mb)
if (Ma/=Mb) write(22,'(1pe16.8,'','',1pe16.8,'','',1pe16.8)') Ma*df,a(Ma),0.0
close (21)
close (22)

890:デフォルトの名無しさん
10/02/07 15:59:09
--ラスト--

!========================================================================
!フーリエ変換(作業領域消去)
call fftw_f77_destroy_plan(plan)
end program fft

891:デフォルトの名無しさん
10/02/07 19:29:00
>>889
クラスの友達に聞いた方が早いよ。


892:デフォルトの名無しさん
10/02/07 20:20:13
むしろ、データファイルの中身が必要なんじゃね?

893:デフォルトの名無しさん
10/02/07 20:37:52
>>891
きっとボッチなんだよ。

894:デフォルトの名無しさん
10/02/07 22:48:06
そうなんすよ。
彼女と遊びすぎて留年しちゃったもんで・・・。

895:デフォルトの名無しさん
10/02/07 23:02:40
お前はこのスレを敵にまわした。

896:デフォルトの名無しさん
10/02/07 23:10:16
>>894
教えようと思ったがやめた

897:デフォルトの名無しさん
10/02/08 03:48:18
自分が今いるサブルーチンの名前を取得する方法ってありますか?
デバッグするときにどのサブルーチンで止まってるか確かめたいんですが。

898:デフォルトの名無しさん
10/02/08 07:30:51
終了したのが
なんていうサブルーチンで何行目か、とか
ソースファイルの何行目だったか、とか教えてくれるようにする
オプションってあったと思うけどなぁ。というわけでマニュアルを読もう!

Fujitsuだと超最適化かけてもこの機能はついてくるのが素晴らしいが
PC向けではなかったような・・・。出してくれんかねぇ

899:デフォルトの名無しさん
10/02/08 07:59:22
>>898
いえ、それがめんどくさいことに終了せずにどこかで停止してるんですよ。
write文の中身をいちいち変えてもいいんですけど、
出来るだけコード汚さないように書きたいので。

900:デフォルトの名無しさん
10/02/08 11:25:45
すみません、もう一つ。subroutineの最後に

return
end

って書くのはなんででしょう。サブルーチンでのendってreturnと
同じ意味じゃないんでしょうか?returnが無いと困るケースってあります?

901:デフォルトの名無しさん
10/02/08 12:13:11
ヒント: returnはサブルーチンの最後である必要は無い。

902:デフォルトの名無しさん
10/02/08 13:12:13
大昔はEndSubroutineが無かったから、
このEndはサブルーチンのですよ、とチェックをいれる意味で
推奨されてた名残だね。ぶっちゃげ無くてEndだけでもいい。
Returnはサブルーチン抜けを意味するのだからメイン階層では絶対出てこないので。

903:デフォルトの名無しさん
10/02/08 18:54:13
900じゃないけどreturnとか使った事ありませんでした
勉強になるスレです

904:デフォルトの名無しさん
10/02/08 22:05:26
>>897
__FILE__ を使って後はゴニョゴニョとよくやってた。
Fortran 自体を使わなくなって数年(足を洗ったので)。

905:デフォルトの名無しさん
10/02/08 23:08:56
>>899
Fortranにはそういう命令はない。
しかしコンパイラのtracebackオプションを使えばいい。
大抵のコンパイラにはそういう機能がある。
だがそれは、処理系に依るのでマニュアルでオプションを調べるしか無い。

コンパイラの種類とバージョンを言えばわかる可能性はある。



906:デフォルトの名無しさん
10/02/08 23:13:26
__LINE__使えるんじゃないの?

907:デフォルトの名無しさん
10/02/09 00:35:53
>>906
標準のFortranにはないべ。
Unix系のプリプロセッサの機能だろ。方言のなまりがきつすぎる。


908:ごめんなさい、お願いです。
10/02/10 00:51:22
このプログラムを
明日までに作ってください!!お願いします。

Fortranで,

階乗 n! を計算する関数を作成し,

順列
n個の異なるものからr個取り出して並べる。
このときの順列の総数をnPrとあらわす。
nPr=n(n-1)(n-2)・・・(n-r+1)
を計算する関数を作成し,

組み合わせ
異なるn個からr個取り出して組を作る。
このときの組合せの総数をnCrとあらわす。
nCr = nPr/r!
を計算するプログラムを作成してください。
おねがいします。

909:デフォルトの名無しさん
10/02/10 01:55:59
>>908
最近勉強しているのでFortran95 で書いてみた。
たぶん君が求めているのはF77ヴァージョンだろうw

MODULE m_2chan
IMPLICIT NONE
CONTAINS

ELEMENTAL INTEGER FUNCTION factorial(n)
INTEGER, INTENT(IN) :: n
INTEGER :: i
factorial = PRODUCT( (/ (i, i = 1, n) /) )
RETURN
END FUNCTION factorial

ELEMENTAL INTEGER FUNCTION permutation(n, r)
INTEGER, INTENT(IN) :: n, r
INTEGER :: i
permutation = PRODUCT( (/ (i, i = n, n - r + 1, -1) /) )
RETURN
END FUNCTION permutation

ELEMENTAL INTEGER FUNCTION combination(n, r)
INTEGER, INTENT(IN) :: n, r
combination = permutation(n, r) / factorial(r)
RETURN
END FUNCTION combination

END MODULE m_2chan
!


910:デフォルトの名無しさん
10/02/10 01:57:29
PROGRAM twochannel
USE m_2chan
IMPLICIT NONE
INTEGER :: n, k
PRINT *, 'INPUT n and k'
READ *, n, k
PRINT *, 'nCk = ', combination(n, k)
STOP
END PROGRAM twochannel

77育ちの俺様は、暗黙の型に従っていないのですげー気持ち悪いぜwww


911:デフォルトの名無しさん
10/02/10 02:27:41
>>908
数学的にチューニングすべきだが、提示された式のとおりに作った。PROGRAMは改行多杉になるので省略
integer function factorial(n)
implicit none
integer i, n
i = n
factorial = 1
do while(i .gt. 0)
factorial = factorial * i
i = i - 1;
end do
end
integer function permutation(n, r)
implicit none
integer n, r, i
i = 1
permutation = 1;
do while(i .le. r)
permutation = permutation * (n - i + 1)
i = i + 1
end do
end
integer function combination(n, r)
integer n, r, factorial, permutation
combination = permutation(n, r) / factorial(r)
end


912:デフォルトの名無しさん
10/02/10 08:48:40
908の人気に嫉妬

913:デフォルトの名無しさん
10/02/10 08:58:43
>>901
>>902
あ、そうなんですか。別に書かなくてもいいってことですね?

>>904
>>905
>>906
ありがとうございます。でも、エラーが出て終了するんじゃなくて、
ジョブは走ってるんですけどどこかで止まってるっぽいんですよ。
出力ファイルが計算途中で更新されなくなるんです。
で、どこまで進んでどこでどうなってるか調べたいのでいちいちwrite文挟んでるんですが…
tracebackって終了したときしか使えないですよね?

914:デフォルトの名無しさん
10/02/10 10:05:57
デバッガー無いのか? アタッチ出来れば楽勝だな。

915:908です。
10/02/10 11:57:13
みなさん、ありがとうございました!!(泣

916:デフォルトの名無しさん
10/02/10 23:09:07
>>913
仰る通り Traceback は異常終了しないとでない。
しかし、望みの機能が存在しないのは、世の中の人がその機能を欲していないということなので
がんばってPRINT文をばらまいて解決しなさいw

プログラム相談員とか、そういう人に聞くのも、連中の人を小馬鹿にしたような寝言を我慢しないと
駄目だが、有効w


917:デフォルトの名無しさん
10/02/11 13:16:13
>>916
>連中の人を小馬鹿にしたような寝言を我慢しないと駄目だが
ワロタw
あの目線はどうにかならんのか

918:デフォルトの名無しさん
10/02/11 22:18:28
ちょっとお聞きしたいのですが、
fortranでguiプログラミングはできないのでしょうか?

919:デフォルトの名無しさん
10/02/11 23:26:53
>>918
C用のライブラリのAPIを呼びまくるという形ではできる。



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch