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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

●注意事項
・質問する前にGoogle等の検索サイトで検索しましょう。
・回答者にわかりやすい様に、質問内容はできる限り詳しく書きましょう。
・エラーの場合は起きた状況、環境(OS・コンパイラ)、エラーメッセージも詳しく書きましょう。


●前スレ
くだすれFORTRAN(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1138063703/

●関連スレ
FORTRAN W
http://pc8.2ch.net/test/read.cgi/tech/1163319215/
2デフォルトの名無しさん:2006/11/22(水) 09:55:50
質問募集中age
3デフォルトの名無しさん:2006/11/22(水) 16:06:37
関連スレFORTRAN Wの>>64,65,66お願いします。
4デフォルトの名無しさん:2006/11/23(木) 03:07:59
>>3
情報が足り無すぎる。
うまく回らないとは、どのようにうまく回らないのだ?

ランタイムエラーが出るのか?
エラーも出ずに実行は終了するが結果がおかしいというのか?
53:2006/11/23(木) 14:25:34
>4
すいません。
エラーも出ずに実行は終了するが結果がおかしいという感じですね。
ディバック機能でしょうか?使ったら3/3のDO 40〜40CONTINUEあたりが
悪いらしいのですが
6デフォルトの名無しさん:2006/11/23(木) 16:10:46
>>5
正直その質問はスレの趣旨をはみ出している。
それは結果の意味まで理解していないと駄目なので、ここで聞くより周りの人に聞いたほうがいい。

7デフォルトの名無しさん:2006/11/24(金) 12:36:38
f(x)=sinx-sin2x/2+sin3x/3-sin4x/4・・・+(-1)^(n-1)sinnx/n
の値をx=0,0.1,0.2,0.3,0.4,0.5,0.6・・・・0.9,2.0に対して計算し表示するプログラムを作成する
なお,n=8 として計算すること

program report6
implicit none
integer :: n,i
real :: s,a,x

write (*,*) ' n= '
read (*,*) n
do x=0,2.0,0.1
a=(-1)**(n-1)*sin(n*x)
s=0.0
do i=1,n
a=a/i
s=s+a
end do
end do
write (*,*) n,s
stop
end program report6
計算が上手くいきません
8デフォルトの名無しさん:2006/11/24(金) 13:32:41
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

s=0.0

do x=0.0, 2.1, 0.1

do i=1,n
a=(-1)**(i-1)*sin(i*x)
s=s+a/real(i)
end do
write (*,*) x, s

end do
stop
end program report6

改良しましたが、駄目でした計算結果は
9デフォルトの名無しさん:2006/11/24(金) 13:33:35
0. 0.
0.100000001 0.00579053164
0.200000003 0.0474120378
0.300000012 0.164783984
0.400000006 0.380745053
0.5 0.685271919
0.600000024 1.04163218
0.700000048 1.41077828
0.800000072 1.77801299
0.900000095 2.16398764
1.00000012 2.61202049
1.10000014 3.15931892
1.20000017 3.81087661
1.30000019 4.53395605
1.40000021 5.27820969
1.50000024 6.00946999
1.60000026 6.73514318
1.70000029 7.50308847
1.80000031 8.37220001
1.90000033 9.37193203
2.00000024 10.4772806
になりました・・・・
10デフォルトの名無しさん:2006/11/24(金) 13:34:08
ちなみに正しい答は
X F
0.00000000 0.00000000
0.10000000 0.00579053
0.20000000 0.04162151
0.30000001 0.11737194
0.40000001 0.21596113
0.50000000 0.30452693
0.60000002 0.35636017
0.70000005 0.36914620
0.80000007 0.36723456
0.90000010 0.38597476
1.00000012 0.44803283
1.10000014 0.54729855
1.20000017 0.65155733
1.30000019 0.72307980
1.40000021 0.74425435
1.50000024 0.73125988
1.60000026 0.72567332
1.70000029 0.76794499
1.80000031 0.86911219
1.90000033 0.99973196
2.00000024 1.10534859

これです
11デフォルトの名無しさん:2006/11/24(金) 13:53:55
自己解決しました
program report6
implicit none
integer :: i,n
real :: s,a,x

write (*,*) ' n= '
read (*,*) n

do x=0.0, 2.1, 0.1

s=0.0
do i=1,n
a=(-1)**(i-1)*sin(i*x)/real(i)
s=s+a
end do
write (*,*) x, s

end do
stop
end program report6
12デフォルトの名無しさん:2006/11/24(金) 23:17:07
>>11
おめ♪
13お願い:2006/11/26(日) 02:00:57
お願いします。
三次元の法線ベクトルを求めたいのですが、上手くいかないのです。
どうすればいいでしょうか??
とりあえず、今僕が作ったのを貼り付けるので検討してください。

C HOUSEN VECTOR
DO K=1,KMX
DO J=2,JMX-1
   DO I=2,IMX-1

U=(Z(I+1,J+1,K)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))-
& (Y(I+1,J+1,K)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))

V=(X(I+1,J+1,K)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J+1,K))-
& (Z(I+1,J+1,K)-Z(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))

W=(Y(I+1,J+1,K)-Y(I,J,K))*(X(I+1,J,K)-X(I,J+1,K))-
& (X(I+1,J+1,K)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J+1,K))

AK(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

BK(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

CK(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)


END DO
END DO
END DO
14お願い:2006/11/26(日) 02:03:42
DO K=2,KMX-1
DO J=1,JMX
DO I=2,IMX-1
    U=(Z(I+1,J,K+1)-Z(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))-
& (Y(I+1,J,K+1)-Y(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))
    V=(X(I+1,J,K+1)-X(I,J,K))*(Z(I+1,J,K)-Z(I,J,K+1))-
& (Z(I+1,J,K+1)-Z(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))
    W=(Y(I+1,J,K+1)-Y(I,J,K))*(X(I+1,J,K)-X(I,J,K+1))-
& (X(I+1,J,K+1)-X(I,J,K))*(Y(I+1,J,K)-Y(I,J,K+1))

AJ(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BJ(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CJ(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
    END DO
END DO
END DO
15続き2:2006/11/26(日) 02:04:13
DO K=2,KMX-1
DO J=2,JMX-1
DO I=1,IMX

U=(Z(I,J+1,K+1)-Z(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))-
& (Y(I,J+1,K+1)-Y(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))
     V=(X(I,J+1,K+1)-X(I,J,K))*(Z(I,J+1,K)-Z(I,J,K+1))-
& (Z(I,J+1,K+1)-Z(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))
     W=(Y(I,J+1,K+1)-Y(I,J,K))*(X(I,J+1,K)-X(I,J,K+1))-
& (X(I,J+1,K+1)-X(I,J,K))*(Y(I,J+1,K)-Y(I,J,K+1))

AI(I,J,K)=U/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      BI(I,J,K)=V/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)
      CI(I,J,K)=W/DSQRT(U**2.0D0+V**2.0D0+W**2.0D0)

WRITE (*,*) I,J,K,DSQRT(U*U+V*V+W*W)*0.5D0

END DO
END DO
END DO
16デフォルトの名無しさん:2006/11/26(日) 02:21:17
反応工学の課題を解くためにシンプソン法を使って積分する必要があるのですが
プログラミングがサッパリわからないのでプログラムが作れません!
プログラム例を貼り付けていただければそれを改変しあとは自分で何とかします
誰か私めに救いの手を差し伸べていただけないでしょうか?
よろしくお願いします!

fortran77でお願いします
17デフォルトの名無しさん:2006/11/26(日) 02:25:39
上の人と同じですが、
三次元の法線ベクトルの書き方ってどんなのですか??
正立方体だとどんな風に書けばいいですか?

fortran77でお願いします
18デフォルトの名無しさん:2006/11/26(日) 08:32:39
>>16
program integral
implicit none
integer :: N = 36 ! 分割数
integer :: i
real :: x,h,a,b,sum ! x,区間幅、下限、上限、積分値
real,external :: f !被積分関数
real :: PI = 3.1415926
a = 0
b = 1
sum = 0
h = (b-a)/N
x = a
sum = sum + 1.0/3 * f(a)
do i = 1,N-1
x = a + h * i
if(mod(i,2)== 0) then
sum = sum + 2.0/3 * f(x)
else
sum = sum + 4.0/3 * f(x)
end if
end do
sum = sum + 1.0/3 * f(b)
sum = sum * h
print *,sum
end program integral

function f(x)
real :: x
f = x**2
return
end function f
1918:2006/11/26(日) 08:33:13
>>16
fの中を変えて、求めたい積分にしてください。
20デフォルトの名無しさん:2006/11/27(月) 09:11:39
>18
f90で書いたのは何か意味があるの?
21デフォルトの名無しさん:2006/11/27(月) 20:38:19
>>6
すいません、スレチ失礼しました。
22デフォルトの名無しさん:2006/11/28(火) 06:35:16
以下のようなプログラムでは、サブルーチン(sub) で配列Aに対して
segmentation errorが出るはずなのですが出ません。
このようなサブルーチンでもちゃんとエラーを出してくれるようなコンパイルオプションってあるんですか?

program main
implicit none
integer,parameter :: N=10
integer :: A(1:N)
call sub(N,A)
end program


subroutine sub(N,A)
implicit none
integer :: i,N,A(1:N)
do i=1,2*N ! segmentation error??
A(i)=i
enddo
return
end subroutine sub
23デフォルトの名無しさん:2006/11/28(火) 23:52:07
>>21
あやまる必要はないべ

大学なら周りに聞いたほうが早いと思う。
24デフォルトの名無しさん:2006/11/28(火) 23:57:35
>>22
その程度のは見出しではセグメンテーションエラーまでは行かない。
もっと大きく、10**30くらいに書き込んで味噌。


配列はみだしを実行時に検出するオプションは、Subscript Check(添え字チェック) subchk
という名前で知られている。

これはマトモなコンパイラなら必ず付いている。しかし、個々のコンパイラによって違うので
マニュアルやヘルプをみて調べるしかない。

これは、実行が極端に遅くなるので普通debugの時だけ使う。
2522:2006/11/29(水) 00:38:25
>>24
レスサンクスコ!

ifort (ver9.1) 使ってるんですが,
とりあえず/check:allとつけとけば色々検出してくれるようです.
このはみ出しもチェックしてくれました.
26デフォルトの名無しさん:2006/11/29(水) 00:48:57
波数kの関数phik(k)から、xの関数phi(x)へと逆フーリエ変換をする
プログラムを作るのにてこずっています。
phi(x) = sum phik(k)*exp(i*k*x)だと思うのですが、どうもうまく作れません。
xは位置座標、kは波数で、それぞれ-5〜5、-1〜1の間でとっています。
試しに、phi(x)=2cos(0.1x)の波を作るため、k=-0.1と0.1以外は重み
(amp)を0にとりました。
何かがおかしいとは思って考えているのですが、わかりません。
どうかアドバイスを頂けたら幸いです。よろしくお願いします。

integer nx, imax, nk, jmax, i, j
real*8 xmax, dx, kmax, dk, x, k
complex*16 phi(500), phik(500), sumphik
parameter (xmax = 5.0d0, nx = 50, kmax = 1.0d0, nk = 10)
dx = xmax/nx ; imax = 2*nx + 1
dk = kmax/nk ; jmax = 2*nk + 1
do i = 1, imax
x = -xmax + (i-1)*dx
do j = 1, jmax
k = -kmax + (j-1)*dk
if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then
amp = 1.0d0
else
amp = 0.0d0
end if
phik(j) = amp*cdexp((0.0d0, 1.0d0)*k*x)
sumphik = sumphik + phik(j)
end do
phi(i) = sumphik
write(*, *) x, dble(phi(i))
sumphik = 0.0d0
end do
end
27デフォルトの名無しさん:2006/11/29(水) 03:27:07
>>26
if (((k-0.1d0).lt.1.0d-3).or.((k+0.1d0).lt.1.0d-3)) then
これが原因だ。ABSをつければ解決する。

IF ( (ABS(k-0.1d0).lt.1.0d-3) .OR.
& (ABS(k+0.1d0).lt.1.0d-3) ) THEN
ABSが無いと、kが0.1ないし-0.1以下のときは必ず条件を満たしてしまう。

あとsumphik = 0.0d0 の位置が悪い。入れるべき位置はここだ。
あと複素変数なんだから複素でクリアすべし。
do i = 1, imax
sumphik = (0.0d0, 0.0d0)
x = -xmax + (i-1)*dx

FORTRANでは変数の初期値は不定であって0になっているとは限らない。
変数は誰が使ったか分からないコップや茶碗だと思って、必ず洗ってから使うべし。

========
ところで一般的なアドバイスだが、FORTRAN77で行くのなら、暗黙の型を絶対守るべきだ。
そうすることによりいちいち宣言部を見なくても型が分かる。

FORTRAN77で暗黙の型を守っていない場合、もうそれは素人が書いたものとして
普通相手にされない。

普通のFORTRAN使いが、このプログラムを見た場合k,kmaxがreal*8になっているのを見た時点で、
もう問題外としてその先を見るのをやめる。

変数を全部宣言すればいいじゃないかと思うかもしれないが、FORTRAN77は暗黙の型があるため
宣言忘れがエラーにならないのでヤヴァイ。たとえば、このプログラムではampの宣言を忘れている。

Fortran90にはIMPLICIT NONEがあるので暗黙の型宣言を無効化できるが、
それでも暗黙の型を守ったほうがいい。
2826:2006/11/29(水) 03:55:33
26様、お答え下さりありがとうございました。
今までわからず、まだうなっておりました。絶対値を取っていないとは、
本当に馬鹿です。

FORTRANの一般的なアドバイスまでご教授頂き、本当に恐縮です。
変数はなるべく暗黙の型を使うと言うことは、今後は肝に銘じようと思います。
ampの宣言を忘れていることは、全く気づきませんでした。エラーの原因になる
可能性があり、大変危険ですね。

このたびはご助言頂き、本当にありがとう存じました。
2926:2006/11/29(水) 03:58:50
1行目は27様の間違いです。

27様、返す返すこのたびは有り難うございました。
30デフォルトの名無しさん:2006/11/29(水) 22:23:00
windows上で ifort 使ってるんですが
makefileを自動でサクッと作ってくれるツールないでしょか..
csmkmkっていうよさげなアプリを見つけたんですが挙動が変です.

皆さんは手動で書いてるんでしょうか?
31デフォルトの名無しさん:2006/11/30(木) 00:31:46
>>30
インテルのサポート掲示板にも似たような要望が出ていた。
automakeのようなツールを用意することに前向きな姿勢を見せていた。

漏れはモジュールの依存関係が複雑になってから面倒だから統合環境を使っている。
32デフォルトの名無しさん:2006/12/01(金) 07:56:25
fortranにはCのようなインライン関数は無いんですか?
33デフォルトの名無しさん:2006/12/01(金) 10:29:33
>>32
あるが、コンパイラによる自動最適化として行われる。
ベンダー依存のコンパイル指示行をいじれば、制御できる。
34デフォルトの名無しさん:2006/12/01(金) 10:31:58
>>32
あるが、コンパイラによる自動最適化として行われる。
ベンダー依存のコンパイル指示行をいじれば、制御できる。
35デフォルトの名無しさん:2006/12/01(金) 13:14:21
subroutineで戻り値もたせるにはどうしたらいいの?
うまいやり方あるんだよね?おしえて☆
36デフォルトの名無しさん:2006/12/01(金) 13:53:30
PROGRAM REIDAI4_3
IMPLICIT NONE
INTEGER :: I,N
REAL :: S,SS,HEIKIN,SIGMA,BUNSAN
REAL :: A(100)
WRITE(*,*) 'N='
READ(*,*) N
DO I=1,N
WRITE(*,'(1X,A2,I2,A2)') 'A(',I,')='
READ (*,*) A(I)
END DO
S=0.0
DO I=1,N
S=S+A(I)
END DO
HEIKIN=S/N
SS=0.0
DO I=1,N
SS=SS+(A(I)-HEIKIN)**2
END DO
BUNSAN=SS/REAL(N)

SIGMA=SQRT(BUNSAN)
WRITE(*,*) 'ヘイキンチ ハ',HEIKIN
WRITE(*,*) 'ブンサン ハ',BUNSAN
WRITE(*,*) 'ヒョウジュンヘンサ ハ',SIGMA
STOP
END PROGRAM REIDAI4_3
3736:2006/12/01(金) 14:20:58
何故かエラーが出ます・・・・・
38デフォルトの名無しさん:2006/12/01(金) 14:24:37
>>36,37
超能力者を呼べ
39デフォルトの名無しさん:2006/12/01(金) 15:11:32
Fortran90です。
mainルーチンでallocateした配列をサブルーチンに渡して、その中で
サイズを変えて再アロケート(deallocate->allocate)することは出来る
のでしょうか?
40デフォルトの名無しさん:2006/12/01(金) 15:31:09
randomという数値ルーチンはwindows上で動かすと
問題なく動作しているようなのですが、
unix環境になるとまったく動かなくなります。
どうすればいいでしょうか?
Fortran90です。
41デフォルトの名無しさん:2006/12/01(金) 22:49:19
>>40
マニュアル嫁!!

Fortran90固有の乱数サブルーチンはRANDOM_NUMBER()だろ。
RANDOMはベンダー拡張のルーチンだ。

エラーが出たら文法書を嫁! 法律書と同じだ。トラブッたら文法書を開け!
42デフォルトの名無しさん:2006/12/01(金) 22:52:53
>>37
どういうエラーが出るか書け。答えようがない。

ざっと見たところプログラムはおかしくない。
コンパイルして動かしてみたが、ちゃんと動いているように見える。
データ数3個でしか試してないがwww
43デフォルトの名無しさん:2006/12/01(金) 23:03:09
>>39
確か出来たはず・・・・・ 最悪でもポインターで送ればできる。

コンパイラでやってみたらできた。一応F90厳格オプションを掛けたのでおkだろ。
44デフォルトの名無しさん:2006/12/01(金) 23:06:41
>>35
サブルーチンに戻り値を持たせたければ、引数を1こ増やせばいいだろ。

それが嫌ならFUNCTIONを使え。

しかしFORTRANの伝統では、FUNCTIONは返す値が1個で、引数はINTENT(IN)で
副作用なし、と取ることに不文律でなっている。数学のFunctionを連想するので、
これが自然に思える。

Cのような何でもFunctionにするのは愚かな浅知恵だと思う。
45デフォルトの名無しさん:2006/12/02(土) 08:01:34
>>41
マニュアルって、どこにあるんでしょうか?
46デフォルトの名無しさん:2006/12/02(土) 08:49:05
>>45
見つかるまで探せ! 幸せの青い鳥は足元にいるんだ!
47デフォルトの名無しさん :2006/12/02(土) 11:43:15
下記のfortran90のプログラムをfortran77にするとどういうふうになるのか
教えていただけませんか?

PROGRAM vipper
IMPLICIT NONE
REAL :: theta1, theta2, phi1, phi2, alpha, anu, pi
REAL :: rot_z(3, 3), rot_y(3, 3), vec1(3), vec2(3)
CHARACTER :: ns, ew
pi = 4.0 * ATAN(1.0)
alpha = 6242.2 / 6370.0
anu = ( 180.0 - 86.6 ) * pi / 180.0
theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * pi / 180.0
phi1 = ( 139.0 + 12.0 / 60.0 ) * pi / 180.0
!
rot_z(1, :) = (/ COS(phi1), -SIN(phi1), 0.0 /)
rot_z(2, :) = (/ SIN(phi1), COS(phi1), 0.0 /)
rot_z(3, :) = (/ 0.0, 0.0, 1.0 /)
!
rot_y(1, :) = (/ COS(theta1), 0.0, SIN(theta1) /)
rot_y(2, :) = (/ 0.0, 1.0, 0.0 /)
rot_y(3, :) = (/ -SIN(theta1), 0.0, COS(theta1) /)
!
vec1(1) = SIN(alpha) * COS(anu)
vec1(2) = SIN(alpha) * SIN(anu)
vec1(3) = COS(alpha)
!
vec2 = MATMUL(rot_z, MATMUL(rot_y, vec1))
!
48デフォルトの名無しさん :2006/12/02(土) 11:43:46
theta2 = ASIN(vec2(3)) * 180.0 / pi
phi2 = ATAN2(vec2(2), vec2(1)) * 180.0 / pi
!
PRINT *, theta2, phi2
ns = 'N'
IF (theta2 < 0.0) ns = 'S'
ew = 'E'
IF ( phi2 < 0.0) ew = 'W'
PRINT '(i4, a, i2, 1x, a)', INT(ABS(theta2)), ' ', NINT(( ABS(theta2) - INT(ABS(theta2)) ) * 60.0), ns
PRINT '(i4, a, i2, 1x, a)', INT(ABS( phi2)), ' ', NINT(( ABS( phi2) - INT(ABS( phi2)) ) * 60.0), ew
STOP
END PROGRAM vipper

よろしくおねがいします。
49デフォルトの名無しさん:2006/12/02(土) 12:09:05
>>47
(1) ソースを自由形式→固定形式に変更する
(2) 変数の宣言をF77式に変更する(REAL :: hoge → REAL hoge)
(3) コメント( ! ) をF77式に変更する
(4) rot_z(1, :) = (/ ... /) 等配列に代入している部分は各要素毎に1つずつ代入する
(5) MATMULに相当する手続きを自作する
(6) 関係演算子( < ) をF77式( .LT. )に変更する

まだあるかも知れんが、とりあえずこんなところか。
5039:2006/12/02(土) 13:01:36
>>43
どうも。
出来るのですか。とするとやり方が間違っていたのですね。
fortran90のポインタは使ったことありませんが調べてみます。
51デフォルトの名無しさん:2006/12/02(土) 13:54:41
>>50
こんな感じでできた。IntelFortran
MODULE m_test
IMPLICIT NONE
CONTAINS
!
SUBROUTINE chinpo(kk)
IMPLICIT NONE
INTEGER, ALLOCATABLE, INTENT(IN OUT) :: kk(:)
ALLOCATE (kk(10))
kk = 999
RETURN
END SUBROUTINE chinpo
!
END MODULE m_test
!=============================================================
PROGRAM unko
USE m_test
IMPLICIT NONE
INTEGER, ALLOCATABLE :: n(:)
CALL chinpo(n)
PRINT *, n
STOP
END PROGRAM unko
52デフォルトの名無しさん:2006/12/02(土) 15:22:54
[7] g77 -o r7 r7.f
/tmp/cc9A4yij.s: Assembler messages:
/tmp/cc9A4yij.s:136: Error: symbol `MAIN__' is already defined
/tmp/cc9A4yij.s:299: Error: symbol `MAIN__' is already defined


こういうエラーが出ます・・・・
53デフォルトの名無しさん:2006/12/02(土) 15:23:29
>>52>>37です。
54デフォルトの名無しさん:2006/12/02(土) 16:52:25
windows上で使えるフリーのコンパイラはありますか?
55デフォルトの名無しさん:2006/12/02(土) 18:02:24
>>52
はじめっからエラーメッセージを書くべし。

それはメインルーチンが複数あるということだから、メインルーチンと勘違いされるような
行があるということだ。

g77についてはよく知らんが、136や299がエラー行を表しているんじゃないか?
その辺の行を見て味噌。
一見空行でもみょうな制御コードが混じっていたりするとこういう事が起こる。

たとえば2バイトの日本語文字とか。
そもそもg77は2バイト文字に対応しているのかね?

>>54
本スレの>>1をみろ!
FORTRAN W
http://pc8.2ch.net/test/read.cgi/tech/1163319215/
56デフォルトの名無しさん:2006/12/03(日) 01:14:01
三次元のポアソン方程式を解きたいのですが、どんなプログラムにしていったらいいでしょうか??
fortran77で書いているのですが、なかなか上手くいかなくて…
お願いします。教えてください。
57デフォルトの名無しさん:2006/12/03(日) 09:04:58
もーーどーーしてもうまくいかないので質問させてください。

自宅のwinXPでfortran95を使いたくて、本スレにリンクしてある「FTN77/95のインストール方法」を参照していたのですが・・

まず、リンク先から「Salford FTN95 Personal Edition」をデスクトップにDLしました。

次に、インストーラを起動させてC:\Program Files\Salford Software\FTN95にinstallしました。

で、参照ページを見ると.NETを持ってない場合はDOSでテストしてみると書いてあったので、
DOSでcd C:\Program Files〜に移動して、ftn95とコマンド入力。
そしたら「Ver4.9 copyright 云々」と出たので多分OK。

次に、installしたフォルダに一緒に入っていたfcpad.exeを起動すると書いてあるので、起動。
するとコンパイラのパスを求められたので、C:\Program Files\Salford Software\FTN95と入れてOKを押しました。

そしたら、「コンパイラのパスが正しくありません」と言われてしまいます。
コンパイラftn95.exeを右クリック→プロパティで「場所」をコピーしてやってみてもやっぱりだめでした。

長文ごめんなさい、自分のやり方はどこが間違ってるのでしょうか?

58デフォルトの名無しさん:2006/12/03(日) 09:13:18
>>57
>するとコンパイラのパスを求められたので、
>プロパティで「場所」をコピーしてやってみても


C:\Program Files\Salford Software\FTN95\ftn95.exe
でもダメ?
5957:2006/12/03(日) 09:36:44
>>58

で き ま し た 。

なんか単純常識的なことを知らなかったようで・・
即レスありがとうございました。
60デフォルトの名無しさん:2006/12/03(日) 11:15:26
>>59
いいのよ〜♪
61デフォルトの名無しさん:2006/12/03(日) 12:12:39
>>57,59

CPad for Salford FTN77もいいけど FTN95付属のPlato3 IDEも使ってやれよー。
日本語が使えなかったりプラトン先生の顔が怖かったりするけど
ちゃんと自由形式で色分けしてくれてデバッガもついとるでよー。
62デフォルトの名無しさん:2006/12/03(日) 15:22:42
>>47 世話が焼けるなー
PROGRAM vip77
REAL rotz(3, 3), roty(3, 3), vec1(3), vec2(3), tmp(3)
pi = 4.0 * ATAN(1.0)
degrad = pi / 180.0
alpha = 6242.2 / 6370.0
anu = ( 180.0 - 86.6 ) * degrad
theta1 = ( 90.0 - ( 35.0 + 40.0 / 60.0 ) ) * degrad
phi1 = ( 139.0 + 12.0 / 60.0 ) * degrad
C
rotz(1, 1) = COS(phi1)
rotz(1, 2) = -SIN(phi1)
rotz(1, 3) = 0.0
rotz(2, 1) = SIN(phi1)
rotz(2, 2) = COS(phi1)
rotz(2, 3) = 0.0
rotz(3, 1) = 0.0
rotz(3, 2) = 0.0
rotz(3, 3) = 1.0
C
roty(1, 1) = COS(theta1)
roty(1, 2) = 0.0
roty(1, 3) = SIN(theta1)
roty(2, 1) = 0.0
roty(2, 2) = 1.0
roty(2, 3) = 0.0
roty(3, 1) = -SIN(theta1)
roty(3, 2) = 0.0
roty(3, 3) = COS(theta1)

63デフォルトの名無しさん:2006/12/03(日) 15:23:37
C
vec1(1) = SIN(alpha) * COS(anu)
vec1(2) = SIN(alpha) * SIN(anu)
vec1(3) = COS(alpha)
C
CALL mulmat(3, roty, vec1, tmp)
CALL mulmat(3, rotz, tmp, vec2)
theta2 = ASIN(vec2(3)) / degrad
phi2 = ATAN2(vec2(2), vec2(1)) / degrad
PRINT *, theta2, phi2
STOP
END
!
SUBROUTINE mulmat(n, a, b, c)
REAL a(n, n), b(n), c(n)
DO 10 i = 1, n
c(i) = 0.0
DO 20 j = 1, n
c(i) = c(i) + a(i, j) * b(j)
20 CONTINUE
10 CONTINUE
RETURN
END
6462:2006/12/03(日) 16:12:00
使っているのは高校でも習う座標の回転だけだ。
高校では2次元、ここでは3次元だが、y軸とz軸に関して廻すだけだから
高校のものと本質的には変わりはない。COS、SINが湧いて来るのはそれが理由だ。

あと、FORTRANの三角関数はラジアンで与えることになっているから、
度表示をラジアンに直さなければならない。π/180はそこから湧いてくる。

また、角度表示は古代メソポタミア文明以来の60進法が使われているので、
度、分、秒を度の小数点表示にしてから、さらにラジアンにしている。
それが60で割ったりしている部分だ。

あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。
座標系は右手系を取るのがふつう。(右手系とは右手のお父さん指がx軸、
お母さん指がy軸、のっぽのお兄さん指がz軸だ。)


考え方はこうだ。まず八王子が北極にあるとする。北極からミサイルをぶっ放した
到着点をしるのはたやすい。その地点をvec1に入れている。
ここで北極点を本来の八王子の位置に持っていくように座標軸を回転させる。
このときvec1にも同じ回転をかければ求める地点が分かる。それがvec2だ。

その他、問題文にもあるが、弧の長さと半径が分かれば角度が出る。
方位角ν(読み方はニュー速のニューだぞ)は、本来の八王子から見て真北から
時計回りにとると考える。(問題文からは判然としないが、常識的にはこう取るのが普通)
北極点から考える場合は南極向きで時計回りになる。


6562:2006/12/03(日) 16:14:05
訂正

>あと、座標としては極座標をとるが、北緯、東経などを極座標に直す必要がある。

角度の取り方は極座標の取り方をとって、x、y、zの直交座標系を右手系でとった。
66デフォルトの名無しさん:2006/12/03(日) 20:00:45
>>62
解説乙。
本当は出題者が地球半径を与えている筈ですね。
もし地球を楕円体として考えた場合、かなり面倒そうですね。
67デフォルトの名無しさん:2006/12/04(月) 02:54:16
>>66
それは強烈に難しいw
6839:2006/12/04(月) 10:07:52
>>51
ありがとうございます。出来ました。
subroutineをmoduleで包まないといけないのですね。
最近77から移ってきたのでどうもmoduleの使い方がいまいち
分かりません。
69デフォルトの名無しさん:2006/12/04(月) 13:54:10
subroutineのなかにsubroutineとかfunction定義できるの?
自分で実験したほうが早いって?www
70デフォルトの名無しさん:2006/12/04(月) 23:50:42
>>69
できる・・・・が、それは普通のサブルーチンやファンクションとは違っている。
親ルーチンの変数をプチ・グローバルに共有している。

うっかりiとかjとかローカルに宣言しわすれたまま使ってしまうと、
親ルーチンのほうのiやjが書き換わってとんでもないことになる。

好みの問題だが、漏れはあまり好きくない。

71デフォルトの名無しさん:2006/12/05(火) 14:31:45
CPad for Salford FTN77
のコンパイラのパスが分かりません。
教えて下さい
72デフォルトの名無しさん:2006/12/05(火) 14:43:44
>>71
>>57のへん見れ
73デフォルトの名無しさん:2006/12/05(火) 14:51:02
>>72
C:\Program Files\Salford Software\FTN95\ftn95.exe
と入力しても
”コンパイラのパスが正しくありません”と表示されます
ちなみにOSはXPです
74デフォルトの名無しさん:2006/12/05(火) 14:55:10
>>73
エクスプローラで"ftn95.exe"を検索したら?
75デフォルトの名無しさん:2006/12/05(火) 22:57:15
>>73
つーかお前の使いたいコンパイラはFTN77かFTN95かどっちなんだ?
FTN77しか入れてないのにftn95.exeを探しても見つかりっこないぞw
76デフォルトの名無しさん:2006/12/06(水) 15:06:43
FTN77です
77デフォルトの名無しさん:2006/12/06(水) 15:10:42
もぅ、ぉにぃちゃんしっかりしてよ〜
78デフォルトの名無しさん:2006/12/06(水) 15:29:18
>>71
なんとかできました
79デフォルトの名無しさん:2006/12/06(水) 15:42:22
>>78
どうやったら「なんとかでき」たの?
80デフォルトの名無しさん:2006/12/07(木) 13:24:39
FTN77peをダウンロードして,コンパイラのパスに
FTN77pe〜exeと入力してら、できました

81デフォルトの名無しさん:2006/12/10(日) 00:22:42
FTN95ってどうよ?
82デフォルトの名無しさん:2006/12/10(日) 02:43:06
>>81
コンパイル時/実行時のエラーチェックがけっこう強力で
デフォルトで未使用変数の警告なんかも出してくれるので、
入門用やエラーチェック用にイイ感じ。
Personal版がフリーで使えるし。

その他の特徴としては
・Visual Studio 2003/2005上で使える(もちろんVSは別途購入する必要がある)
・VSがなくても独自のIDEが付属する(日本語は使えないが)
・(今時のFortranに必要かどうかはともかく)インラインアセンブラが使える
・(これも実用性のほどはともかく).NETなプログラムも作れる
・GET_COMMAND_ARGUMENT()、[...] 等Fortran2003の一部に対応(他のコンパイラでも大抵使えるレベルだが)

83デフォルトの名無しさん:2006/12/10(日) 17:07:02
>>82
dクス。
意外に高機能だな。
サポートとかはどうなんだろう?パッチとか結構でてるんだろうか?
84デフォルトの名無しさん:2006/12/10(日) 20:23:17
intel fortran ver 9.0 for winを使っております。
自分でプログラムを組んでコンパイルできるところまでは到達したのですか実行すると
forrtl: severe (168):Program Exception - illegal instruction
Image PC Routine Line Source

Stack trace terminated adnormally.

と実行してくれません。なにがおかしいのでしょうか?
ソースをのせるべきなんでしょうがnetnumpacから主に引っ張ってきている分権利がややこしそうです。

よろしくお願いします。
8584:2006/12/10(日) 20:35:24
program main
common/ numbb / nnn,lll,dz,ameson
integer :: nnn, lll
real*8 :: dz, ameson, dr(251),scr,hx
open (unit=10, file='functest0.txt', status='unknown')
open (unit=11, file='functest1.txt', status='unknown')
open (unit=12, file='functest2.txt', status='unknown')
open (unit=13, file='functest3.txt', status='unknown')
open (unit=14, file='functest4.txt', status='unknown')
open (unit=15, file='functest5.txt', status='unknown')
nnn = 6
lll = 5
dz = 60.0d00
ameson = 413.536d00
dr(1)=exp(-8.8)*dz
hx=5.d-2
86デフォルトの名無しさん:2006/12/10(日) 20:37:23
do l=2, 251
dr(l)=dr(1)* exp(hx*(l-1))
end do
zero = 0.0
y = 0.0
do i = 1, 251
call GASND (zero, dr(i), screen, 40, Y, ICON)
scr = y
write(10,'("i="i2," dr(i)="e15.8," scr="e20.10)')i,dr(i),scr
end do
close (unit = 10)
close (unit = 11)
close (unit = 12)
close (unit = 13)
close (unit = 14)
close (unit = 15)
end
8784:2006/12/10(日) 20:38:49
function screen(ddr)
! it's the Dnl(r)
common/ numbb / nnn,lll,dz,ameson
real*8 :: a1, a2, a3, al1, arn
integer :: nnn, lll, l5
real, external :: DPLAGG
integer, external :: factorial
real, intent(in) :: ddr
a0 = ameson
arn = - a0 * ddr
aa1 = 2.0d00*dz/(nnn*a0)
nl = nnn-lll - 1
nll = nnn + lll
a2 = factorial(nl)
a3 = factorial(nll)
a4 = 2.0d00*dble(nnn)*a3*a3*a3
a5 = aa1*(a2/a4)
l5 = 2*lll + 1
l6 = 2*lll
a6 = (arn)**(l6)
al6 = dble(l5)
al7 = DPLAGG(nll,al6, arn)
al8 = al7*al7
ss = a5*exp(arn)*al8*a6
screen = ss
write(11, '("nnn="i2," ss="e20.10)') nnn, ss
end function screen
8884:2006/12/10(日) 20:40:33
function factorial(n)
integer :: fact
integer, intent(in):: n
fact = 1
do i = 1, n ,1
fact = fact*n
end do
factorial = fact
write (12, '("n="i1," fact="i10)') n, fact
end function factorial

FUNCTION DPLAGG (N, A, X)
IMPLICIT REAL (8)(A - H, O - Z)

END FUNCTION DPLAGG
SUBROUTINE GASND (A, B, FUN, N, Y, ICON)
IMPLICIT REAL (8)(A - H, O - Z)
EXTERNAL FUN
DIMENSION X (50), W (50)
SUBROUTINE WGLEGD (NP, PT, WT, ICON)
! LEGENDRE-GAUSS FORMULA
IMPLICIT REAL (8)(A - H, O - Z)
DIMENSION X (25, 50), W (25, 50), PT (NP), WT (NP)
8984:2006/12/10(日) 20:42:38
netnumpacからのソースはプログラム名だけにしました
変数の定義があったりなかったりで非常にみづらいとは思いますがよろしくお願いします。
90デフォルトの名無しさん:2006/12/10(日) 21:08:10
>>84 これは試したかい?
Re: forrtl: severe (168) Program Exception - Illegal instructiom
Reply Quote
Turns out that the problem was caused by an older-generation processor not understanding
newer instructions. The application had been compiled with the "Generate most optimized code"
(/fast) setting, which implies /arch:host. Unfortunately, the project settings box display doesn't
reveal the implied switches, leading to this sort of problem.

Steve

http://softwareforums.intel.com/ISN/Community/en-US/forums/thread/106764.aspx
91デフォルトの名無しさん:2006/12/10(日) 21:21:02
>>83
SilverfrostのホームページからForumを見に行くと
ここのAnnouncementsにパッチの情報も載っている。
9284:2006/12/10(日) 21:41:42
>>90
英語をよみくだくと /arch:hostのコンパイラオプションをしろ ですよね
やってみましたが変化なしでした。
環境はpen4 2.4BGHz 1024MB 845Echipset winxp sp2なんですがね
93デフォルトの名無しさん:2006/12/10(日) 22:03:23
>>92
debugモードでtracebackもonにしてどのソース行でおかしくなってるか調べてみたら?
94デフォルトの名無しさん:2006/12/11(月) 01:23:37
>>92
Pentium 4の2.4BGHzだと拡張命令はSSE2までだから、
どこかにSSE3等を使ったコードが紛れ込んでるんですかね。

別のPCでコンパイルしたライブラリをリンクしているのなら
そのライブラリがSSE3命令を使っている可能性も考えられます。
9584,92:2006/12/11(月) 03:06:49
>>93
debugモードは使ったことがないけどやってみます
>>94
ライブラリはもってきていないはずなので
SSE3をつかったコードが紛れ込んでるんですかね
96デフォルトの名無しさん:2006/12/11(月) 08:32:14
>>95
つーかVisualStudio使わないでコマンドラインでやってるの?デフォはdebugのはずだが。

debugモードを使わないという神経が分からんぞい!
まずは警告オプションも全部onにしてやりんしゃい!
97デフォルトの名無しさん:2006/12/13(水) 20:37:45
fortran77でファイルに書き込みをするときに
open(2,file='filename.txt')
とかけばfilename.txtに結果が書けるのですが、

ひとつのプログラムでa=1〜100まで変化したときに
(do a=1,100 〜continueを利用)
a=1のときの結果はfilename1.txtに記録
   ・・・
a=100のときの結果はfilename100.txtに記録
するにはどのようにすればいいのでしょうか?

可能であればa=i,b=j(i,jに自然数が入る)のときに
filename_a=i_b=j.txt
に書き込めるように、お願いします。
98デフォルトの名無しさん:2006/12/13(水) 21:58:54
>>97
前スレでも出てたと思うが、FORTRAN77の場合だと
fmt, fname は適当な長さの文字列変数として

write(fmt,100) int(log10(real(i)))+1, int(log10(real(j)))+1
100 format('(''fname_'',I',I1,',''_'',I',I1,',''.txt'')')
write(fname, fmt) i, j
open(10, file=fname, ...

書式に 'I0' を指定すると「その数値を表現するのに最小の欄幅」を取ってくれる処理系なら

write(fname,'(''filename_'',I0,''_'',I0,''.txt'')') i,j
open(10, file=fname, ...

個人的には数値は適当な桁数にそろえて
filename_001_001.txt, ..., filename_010_010.txt, ..., filename_100_100.txt, ...
としたほうが後でデータファイルをいじったりする時に都合がよいように思う。

write(fname,'(''filename_'',I3.3,''_'',I3.3,''.txt'')') i,j
open(10, file=fname, ...
9984,92:2006/12/13(水) 23:06:12
>>96
コンパイラマシンは混んでいていつもコンパイルのみに使っていたのでdebugモードは未経験でした

debugしてみたとこと
dr(1)=exp(-8.8)*dz がひっかかっており
sub = -8.8
dr(1) = dz *exp(sub) としたら動くようになりました。

exp(-8.8)がSSE3なりを使用しているんでしょうか
100デフォルトの名無しさん:2006/12/14(木) 00:25:28
最適化オプションを無効にすればSSE/2/3は使われないはずだが。
101デフォルトの名無しさん:2006/12/14(木) 01:14:45
>>99
ReleaseでSSE抑止命令(CPUを旧型に指定)すれば、SSEが原因なのかどうか分かる。

定数式だから変な最適化でバグったのかね?
102デフォルトの名無しさん:2006/12/14(木) 03:12:02
求めるP3の値がちょうど3(限りなく近い)値になるときのdaの値
を小数点6桁ぐらいまで求めたいのですが、どうすれば次のプログラムを
効率よくdaの値が一回で出せるプログラムにできるか知恵をお貸しください。

DIMENSION E22(2),oo(2)
REAL k,pi,a,o,z,Kf,kf1
pi=3.1415926
DO 30 da= 1.000 , 0.800 , -0.002
DO 30 n4= 8 , 8

k=5.319
a=k/0.529177
o=(a**3)/2.0*da
oo(1)=o
z=1.0
103デフォルトの名無しさん:2006/12/14(木) 03:12:51
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+0.0155*pi/Kf)
Ei=1.79186*z**(5.0/3.0)/(3.0*o*rs)
P=-Ei*1.4703*10**4
E0=-4.42*z/(3.0*o*rs**2)+0.916/(3.0*o*rs)+0.031/(3.0*o)
P0=-E0*1.4703*10**4
Rmk=3.182
q0=0.89*2*0.3947587
uk=q0*Rmk*cos(q0*Rmk)/(sin(q0*Rmk)-q0*Rmk*cos(q0*Rmk))
E1=-2.0*pi*z*2.0/o**2*(z*Rmk**2*(1.0+2.0/3.0*uk))
P1=-E1*1.4703*10**4
DO 20 L= 1 , 2
E2=0.0

IF(L.EQ.1) GO TO 100
o=o*0.996
oo(L)=o
a=(o*2.0)**(1.0/3.0)
rs=(3.0*o/(z*4.0*pi))**(1.0/3.0)
Kf=(9.0*pi/4.0)**(1.0/3.0)/rs
Ef=Kf**2
c=2.0*1.0/(1.0+(0.0155*pi)/Kf)
104デフォルトの名無しさん:2006/12/14(木) 03:13:27
100 DO 10 n1= -n4 , n4
DO 10 n2= -n4 , n4
DO 10 n3= -n4 , n4
IF(n1==0.and.n2==0.and.n3==0)GO TO 10
IF(MOD(n1+n2+n3,2)/=0)GO TO 10

G=2.0*pi/a*SQRT(FLOAT(n1*n1+n2*n2+n3*n3))
f=G**2/(2.0*(G**2+c*Kf**2))
ae=1.0+(1.0-f)*4.0*pi*z*2/(o*G**2)*3.0/(2.0*Ef)*
&(1.0/2.0+((4.0*Kf**2-G**2)/(8.0*Kf*G))*ALOG(ABS((2.0*Kf+G)/(2*Kf-G))))
V=(-4.0*pi*Z*2.0/(o*G**2))*((1.0+uk)*cos(G*Rmk)-uk*sin(G*Rmk)/(G*Rmk))

E3=1.0/(4.0*pi*2.0/(o*G**2))*V**2*(1.0/(1.0-f))*(1.0/ae-1.0)
E2 = E2 + E3

10 CONTINUE
E22(L)=E2/2.0
20 CONTINUE

E8=(E22(2)-E22(1))/(oo(2)-oo(1))
P2=-E8*1.4703*10**4
P3=P+P0+P1+P2

WRITE(6,50)P3
50 FORMAT(F15.8)
30 CONTINUE
WRITE(*,*)P,P0,P1,P2
WRITE(6,601) P3
601 FORMAT(1H , F15.8)
STOP
END
105デフォルトの名無しさん:2006/12/14(木) 10:13:55
>>102
その質問の仕方じゃ 答えようがない。
もう少し何をやっているのか、根本から家
10697:2006/12/14(木) 13:14:13
>>98
出来ました。ありがとうございます!
107デフォルトの名無しさん:2006/12/14(木) 16:39:03
fortran90です。
いまwindows上で動かしてたプログラムを
Linuxに移そうとしてるんですが

Unable to open MODULE file dflib.mod

とエラーが出てきます。
どうすればいいでしょうか?
108デフォルトの名無しさん:2006/12/14(木) 20:00:26
Unable to open MODULE file dflib.mod
   ↓
エキサイト翻訳
   ↓
MODULEファイルdflib.modを開くことができません。
109デフォルトの名無しさん:2006/12/14(木) 20:12:39
>>107
ほかの人にやってもらう
110デフォルトの名無しさん:2006/12/14(木) 22:50:01
>>107
dflib.mod はDECの拡張モジュールだから、そのままではLinuxでは動かない。

DECの拡張ルーチン中で用いているものがPOSIX互換のルーチンだったら
LINUX上に移植できるだろう。

そうでないなら、自分で回避策を考えねばならない。

とりあえず、USE DFLIB となっている行を全部つぶすべし。
そうして出てきた未定義ルーチン・エラーをひとつひとつ調べるべし。
111107:2006/12/14(木) 23:36:52
>>110
やはりそうですかー。気が遠くなりそうですが、やってみます。
ありがとうがざいました。
112デフォルトの名無しさん:2006/12/15(金) 00:48:58
>>111
あぁ、もしLinux上のIntelFortranを使っているなら、DFORTをIFORTに変えて試してみるといい。
今のWin上のIntelfortranではDFORTはIFORTになっている。
Intelが移植用に互換モジュールを用意してくれているかもしれない。

とりあえず一応マニュアルを検索してみるといい。

どっちにしろコマンドライン引数を取るために使っている程度なら、g77でも移植可能だ。
113102:2006/12/15(金) 01:26:40
このプログラムだとわざわざDOループのdaの値を何回も変えてよりP3の値が3に近い値のda
を求めなければいけないのですが、それを実行一回で求めたいのですがどうしたら
よいでしょうか?
114デフォルトの名無しさん:2006/12/15(金) 01:55:18
>>113
見た感じ非線形だから1回は無理で、はさみうち法とかでイターレションするしかナインでないの?
というかもし1回で求まるなら、はじめっからdaについての式を逆関数的に定式化してあるのでは?
115デフォルトの名無しさん:2006/12/15(金) 10:24:04
>>112
なるほど。試してみます。
ありがとうございました!!
116デフォルトの名無しさん:2006/12/17(日) 09:35:52
下記のプログラムについて、fortran77で行うと実行できないのです><
何がおかしいですかね><
よければ、教えていただけませんか?


dimension ia(100),vw(12),ivw(12),vw2(100)
data am,ix,n/1.0 ,0 ,100/

call poiss(am,ix,ia,n,vw,ivw,vw2)

write(*,*) (ia(i),i=1,n)

stop
end
 
  subroutine poiss(am,ix,ia,n,vw,ivw,vw2)
dimension ia(*),vw(*),ivw(*),vw2(*)
real*8 x,y
data bm/-1.0/


if (am.ne.bm) then
bm=am
vw(1)=exp(-am)
vw(2)=vw(1)*am
m=2.0*am+10.0

do 10 k=2,m-1
vw(k+1)=vw(k)*am/k
10 continue

117デフォルトの名無しさん:2006/12/17(日) 09:38:41
do 30 k=1,m-1
if (vw(k).ne.0.0) then
x=vw(k)
do 20 j=k+1,m
y=x+vw(j)
if (y.eq.x) go to 50
x=y
vw(j)=x
20 continue
go to 40
end if
30 continue

k=m
40 j=m

50 do 70 i=j,m
vw(i)=1.0
continue

mm=j-k+1
ai=mm




118デフォルトの名無しさん:2006/12/17(日) 09:39:33
do 70 i=1,mm
af=(i-1)/ai
do 60 while(af.gt.vw(k))
k=k+1
60 continue
ivw(i)=k
70 continue
end if

call unfm2(ix,vw2,n)

do 90 i=1,n
k=vw2(i)*ai+1.0
if(k.eq.mm+1) k=mm
j=ivw(k)
do 80 while(vw2(i).gt.vw(j))
j=j+1
80 continue
ia(i)=j-1
90 continue

return
end
119デフォルトの名無しさん:2006/12/17(日) 09:40:24
subroutine unfm2(ix,vw2,n)
implicit real*8 (a-h,o-z)
dimension vw2(*)
real*8 aa/32771.d0/,b/1234567891.d0/,x
real*8 c/2147483648.d0/,ci/4.6566128730773925d-10/

x=ix

do 10 i=1,n
x=dmod(aa*x+b,c)
vw2(i)=x*ci
10 continue
ix=x

return
end

120デフォルトの名無しさん:2006/12/17(日) 12:11:06
>>116
質問の仕方がなっちょらん。
本文からコンパイルエラーなのか実行時エラーなのかすら読み取れない。
エラーメッセージを出すくらいの知恵も無いのか!www 

と叱られるよ
121デフォルトの名無しさん:2006/12/17(日) 14:34:44
>>116
一応DEGITAL Visual Fortranでコンパイルしてみた。
do 70のループが原因でコンパイルが通らない。
後ろの70を170にして、その前のcontinueしかなかったところを70にした。
コンパイルはできるが実行中にArray Bounds Exceededが起こる。

プログラムの中身を追いかけるのは面倒だからやらない。
122デフォルトの名無しさん:2006/12/21(木) 18:06:44
高校の課題なんですが、妹に教えられなくて兄としての威厳がかかっていますw
正直、プログラムはさっぱりなんですが、シスアド初級持っているために安請け合いしてしまったのが間違いですたw

以下の問いなんですがよろしくお願いします。


乱数(0〜1までの範囲)を7個発生させなさい。
その発生させた7個の乱数はそれぞれa,b,c,d,e,f,gと定義する。
このa〜gの中で、最大値と最小値をとるものを選別するプログラムを作りなさい。

というものなんですが、例として何か提示していただけませんか?
それを本みながら自分で理解して、妹に説明できるようにしたいんで。
123デフォルトの名無しさん:2006/12/21(木) 20:01:24
program main
a=rand()
b=rand()
c=rand()
d=rand()
e=rand()
f=rand()
g=rand()
write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)
stop
end
124122:2006/12/21(木) 21:05:49
>>123

この

write(6,*) 'MAX ',max(a,b,c,d,e,f,g)
write(6,*) 'MIN ',min(a,b,c,d,e,f,g)

の、

maxとminっていうのは最初に宣言しなくても機能するんですか?
125デフォルトの名無しさん:2006/12/21(木) 21:34:43
>>124
機能する。 最大値/最小値を返す関数の総称名として規格で規定されている。
RAND() の方は使えない可能性がある。
126122:2006/12/21(木) 23:31:03
>>125

ありがとうございました。
127デフォルトの名無しさん:2006/12/22(金) 00:35:10
>>122 Fortran90風には国府田。

PROGRAM chinpoko
IMPLICIT NONE
REAL :: a(7)
CALL RANDOM_NUMBER(a)
WRITE(*, *) 'MAX=', MAXVAL(a)
WRITE(*, *) 'MIN=', MINVAL(a)
STOP
END PROGRAM chinpoko
128デフォルトの名無しさん:2006/12/23(土) 00:01:40
ちょっと122番と若干かぶる要素があるんだけど、

0から1までの乱数@〜Dまで存在すると仮定する。

問1.乱数をそれぞれ、@*A、@*B、@*C、@*D…C*Dとすべてのパターンの積を求める問題。

問2.問1で得られた結果に100を掛けて、小数点以下を切り捨てる。

問3.問2で得られた全ての結果に対して50より小さい場合残し、そうでない場合は残さない。残すもの、残さないものを分けろ。

問4.問3で得られた結果(残った数値)を以下のような形でまとめるようにせよ。

yi(y1,y2,y3…yn)

問5.問4で得られた結果からその中で最大値を求めよ。


という5つの問題がある。元は一個の問題なんだが、問題文が無駄に長いので俺が解釈して5つに分割してみた。


質問1.問1を俺なりにやってみたんだが、いまいちプログラムがわからないので自力で全て値を@*Aというように入力していったのだが、もっといい方法はないかな?
質問2.50以下のものとそうでないものを分けるとき、使う分は「if」でいいのか?
質問3.yi(y1,y2,y3…yn)とあるけど、これはdimension?使えばいいのか?


わかりにくいけど質問の回答よろしくお願いします。
129128:2006/12/23(土) 00:03:53
できたら、問ごとにプログラムの例文作ってくださると理解しやすいのでありがたいです。
130デフォルトの名無しさん:2006/12/23(土) 01:12:30
>>129
FORTRAN77かFortran90か指定はあるか?
131129:2006/12/23(土) 16:36:07
特にないです。今使ってるのは、visual fortranってやつなんでたぶん新しい方だと思う。
132デフォルトの名無しさん:2006/12/23(土) 18:27:45
>>128
PROGRAM q1
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), y(n * (n - 1) / 2)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
y(k) = x(i) * x(j)
END DO
END DO
PRINT *, x
PRINT *
PRINT *, y
STOP
END PROGRAM q1

大文字はFortranに存在する命令。小文字は自分の定義する変数名など。
RANDOM_NUMBER()は0以上1未満の数を返す。
>>132 インデント
133デフォルトの名無しさん:2006/12/23(土) 19:13:04
>>128
PROGRAM q2
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2)
REAL, ALLOCATABLE :: y(:)
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
PRINT *, x
PRINT *
PRINT *, w
STOP
END PROGRAM q2

問2
INT()は切り捨て整数化。AINTは切り捨て整数化を実数で返す。
>>133
134デフォルトの名無しさん:2006/12/23(土) 22:44:21
PROGRAM q3
IMPLICIT NONE
INTEGER, PARAMETER :: n = 5
INTEGER :: i, j, k
REAL :: x(n), w(n * (n - 1) / 2), y((n * (n - 1) / 2))
CALL RANDOM_NUMBER(x)
k = 0
DO i = 1, n
DO j = i + 1, n
k = k + 1
w(k) = x(i) * x(j)
END DO
END DO
w = AINT(w * 100.0)
k = 0
DO i = 1, n * (n - 1) / 2
IF (w(i) < 50.0) THEN
k = k + 1
y(k) = w(i)
END IF
END DO
print *, 'no. of less than 50 =', k
PRINT *, y(1:k)
STOP
END PROGRAM q3
135デフォルトの名無しさん:2006/12/24(日) 19:37:56
すいません。FORTRANについての質問かどうかわからないのですが…。
2次元配列DDDD(512,512)に物理量、1次元配列X(512),Y(512)に座標値が
格納されている場合で、Text column形式で出力するならば
OPEN(10,FILE='TXTCOL.D')
DO L = 1, 512
DO K = 1, 512
WRITE(10,*) X(K),Y(L),DDDD(K,L)
END DO
END DO
というのは理解しているのですが、Binary Columns形式ですとどのように
書けば良いのでしょうか?
Binary Matrix形式ですと
OPEN(20,FILE='BINMAT.D',ACCESS='direct',FORM='unformatted',recl=8*512*512)
WRITE(20,rec=1) ((DDDD(K,L),K=1,512),L=1,512)
とすれば良いと勝手に思っています(※これだと座標値が入ってません)。
そもそもバイナリ書き出しを全然、理解しておりません。
どなたかお教えいただけないでしょうか?
136デフォルトの名無しさん:2006/12/24(日) 20:01:14
>>135
いまいち何をしようとしているのか理解できないが、単にバイナリー形式で配列を
書き出したいなら書式なし形式で出せばいい。
WRITE(10) DDDD
でおk
WRITE(10) X,Y,DDD
なら、Xのすべて、Yのすべて、DDDのすべて
の順で書き出される。

直接アクセス方式は、要素をランダムにアクセスしたいときの形式。
OPEN文のRECLは単一要素の大きさなので512*512はいらない。
あと、処理系によってバイトかワードか単位要素か単位が違うのでマニュアルで
確かめる必要がある。
WRITE文でのRECは位置を指定するので、要素ごとに1づつ増やしてゆかねばならない。

直接アクセス方式はしばらく使ってないから細部を忘れたw
マニュアルを穴があくまでにらんで読んでくれ。
137デフォルトの名無しさん:2006/12/28(木) 04:22:27
fortran77を使用して、cos(pi*x)を初期値とした熱方程式の時間発展を計算したいと思います。
範囲は0≦x≦1です。
これで作られたdatファイル('C:\out.dat')が(exp((-(pi)**2)*0.05))*cos(pi*x)
とぴったり重なる様な結果を得たいのですが、ずれてしまいます。
改善点をご指摘いただければ幸いです。よろしくお願いします。
program heat equation
implicit none
integer i,j,nstep,n,ndim
parameter (ndim=5001)
double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
double precision a,b,c
dimension a(ndim),b(ndim),c(ndim),u(ndim)
n=10
dt=0.005d0
tmax=0.05d0
h=1.0d0/float(n)
flam=dt/(h**2.0d0)
c1=1.0d0-2.0d0*flam
c2=flam
do 1 i=1,n-1
a(i)=c2
b(i)=c1
c(i)=c2
1 continue
do 2 i=1,n+1
fi=i-1
u(i)=f(fi*h)
2 continue
OPEN(11,FILE='C:\out.dat')
nstep=0.0
138デフォルトの名無しさん:2006/12/28(木) 04:23:45
3 continue
do 4 i=1,n-1
4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
do 5 i=n,1,-1
5 u(i+1)=u(i)
a(1)=0.0d0
b(1)=c1
c(1)=2.0d0*c2
a(n+1)=2.0d0*c2
b(n+1)=c1
c(n+1)=0.0d0
nstep=nstep+1.0
t=dt*float(nstep)
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end

function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end
139デフォルトの名無しさん:2006/12/28(木) 05:40:21
>>137
ぴったり重なるといっても、どの程度の重なりを求めているのか?
そもそも積分方程式を差分化して数値積分している時点で誤差が溜まってゆくので
相応の誤差はある。見積もり以上の誤差が出ていると言いたいのか?

中身を全く見ていないが、表面だけを見た感じでは
floatは単精度を返すので、DBLEにしてみそとか、
『fi=i-1』も単精度に変換されているだろうといえる。

*昔のコンパイラは倍精度に単精度の数を入れると、あまった桁数にはゴミが入るので
結局数値誤差は単精度と変わりないレベルまで汚染されてしまう。

140137:2006/12/28(木) 06:08:19
>>137
ご指摘の点、早速改善させて頂きました。
ありがとうございました。
ずれは、x=1付近ではほとんどありませんがx=0では誤差では済まない程あります。
グラフにすると形もcos関数ではなくなってしまっているのですが、
改善する手立てが見つけられないでいます。
141デフォルトの名無しさん:2006/12/28(木) 12:22:48
>>137
なんでFORTRAN77のプログラムを1カラム目から書いてるの?
整形めんどい。
142デフォルトの名無しさん:2006/12/28(木) 13:17:56
>>141
s/^/ /

FORTRANネタじゃないけど、まいっか
143141:2006/12/28(木) 14:16:16
どうも。
質問者がこれを暗黙に要求するのはどうかと思いまして。

viを起動して137-138をコピーペーストして、
:%s/^/ /
を実行した後数字のラベルの前の空白を手動で2カラム削除しました。
スレ違いで済みませんが、
「7カラム目が数字の行の先頭を2カラム削除する」というのもsedかviで
自動で処理出来るのでしょうか?
144デフォルトの名無しさん:2006/12/28(木) 15:03:05
/^......[0-9]/s/^..//
145141:2006/12/28(木) 17:33:24
>>144
ありがとうございます。
146137:2007/01/01(月) 04:02:41
前述の計算は以下のように書き直したら期待通りのグラフが描けました。
       program heat equation
       implicit none
       integer i,j,nstep,n,ndim
       parameter (ndim=5001)
       double precision flam,f,h,u,c1,c2,fi,t,tmax,dt
       double precision a,b,c
       dimension a(ndim),b(ndim),c(ndim),u(ndim)
       n=10
       dt=0.005d0
       tmax=0.05d0
       h=1.0d0/dble(n)
       flam=dt/(h**2.0d0)
       c1=1.0d0-2.0d0*flam
       c2=flam
       do 1 i=1,n
       a(i)=c2
       b(i)=c1
       c(i)=c2
      1 continue
       do 2 i=1,n+2
       fi=i-2.0d0
       u(i)=f(fi*h)
      2 continue
       OPEN(11,FILE='C:\out.dat')
       nstep=0.0
147137:2007/01/01(月) 04:13:19
      3 continue
       do 4 i=1,n
      4 u(i)=b(i)*u(i+1)+a(i)*u(i)+c(i)*u(i+2)
       do 5 i=n+1,1,-1
      5 u(i+1)=u(i)
       a(1)=0.0d0
       b(1)=c1
       c(1)=2.0d0*c2
       a(n+2)=2.0d0*c2
       b(n+2)=c1
       c(n+2)=0.0d0
       nstep=nstep+1.0
do j=1,n+1
if(mod(nstep,5).eq.0)then
write(11,*) j*h-1.0d0/n,u(j+1)
end if
end do
write(11,*)' '
if(t+dt.lt.tmax+0.10d0*dt) go to 3
end
function f(x)
implicit none
double precision x,f,pi
pi=3.14159265358979323846264338327950288
f=dcos(pi*x)
end
しかしcos(pi*x)としていた初期関数を
if(x.le.0.5) f=x
if(x.gt.0.5) f=1.0d0-x
に変えてみると誤った計算結果が出ます。
改善点等みつかりましたらご指摘頂けると幸いです。
148JAVAはじめました:2007/01/01(月) 07:10:35
初めてプログラミングをやってみましたが本の通りに入力してもできません(涙)。
こんな事聞いたら馬鹿にされるかもしれませんが、これができなければ前に進めません…
ソースコードをコンパイルできません…何度やっても「javacはコマンドとして認識できません」とエラーが起きます。
Java2SDKの本を買って付属のCDROMよりインストールしたのですが、いったいどこが悪いのかわかりません。
ソースコードにはミスないはずなのにPCが壊れてるのかな?…すいませんわかる方教えてください
149デフォルトの名無しさん:2007/01/01(月) 13:46:06
>>148
このスレッドはFORTRANという(恐らくキミが生まれるより以前から存在する)言語の
スレッドであって、Javaのスレッドではありません。適切なスレッドに映ってください。

一般的に、コンピュータは同じ事を繰り返すと同じ結果が得られます。
何も変更しないで同じ事を繰り返して、↓こういう結果になるのは極めて当然、当たり前。
> 「javacはコマンドとして認識できません」とエラーが起きます。
150デフォルトの名無しさん:2007/01/05(金) 21:11:49
登山道がAからFまであるとする。

さいころX,Yを二つ振って、出た目の合計でその登山道を選ぶかどうか決定する。

出た目の合計が7以上であるならば、その登山道を登ることができる、とする。

それぞれの結果を、Aは**、Bは**というように表示し、

Aは8だから行ける、Bは5だから行けないと表示するプログラムを作りなさい。


こんなプログラムなんだが、まずサイコロをどう表現したらいいかわからない点、
次に、でた結果を全てAは**、Bは**というように表示すんのはいいんだけどさ、

行くか行かないかを判別するのって一個一個ifで分岐させてやらないかんの?
151デフォルトの名無しさん:2007/01/05(金) 21:19:44
追加で書かせてもらうと、

if ( AからFの結果 >7) then
write文で表示する
else
データ破棄、


みたいな感じにしたいんだけど…
プログラム全然できなくて日本語はいりまくりですが…
 
152age:2007/01/05(金) 21:55:11
おお!こんな奇跡のスレがあるとは…
まじヘルプお願いします。


        え-------------か
      /
    い
  /   \
あ       お-------------き
  \
      / 
    う -------------------く


上記のような図がある。
あ〜くはそれぞれ独立した乱数である。

あ〜くで、次の経路の距離は(例:あ−い間はあ・いの積を小数点第3位で四捨五入したもの
)とする。

終点までの全経路の距離の合計を表示し、(例:あ+い+え+か、あ+う+く etc)
もっとも合計距離が小さいものを選ぶプログラムを作りなさい。


なんか上のほうにも似たようなものたくさんあるけど、応用力がなさすぎて作れない…
助けてください…orz
153デフォルトの名無しさん:2007/01/06(土) 05:53:37
>>152
Fortranで挑戦、途中で挫折・・・
その後、rubyで作成しました。
あいうえおかきく→abcdefghと置き換えて
tree[]にabc...fghの値を入れると答えを見つけてくれます

#------------------------------
a=0; b=1; c=2; d=3; e=4; f=5; g=6; h=7;
null = nil
$ans = []

# a,b,c,d,e,f,g,h
tree=[1,2,3,4,5,6,7,8]

aa = [b,c]; bb = [e,d]
cc = [d,h]; dd = [g,null]
ee = [f,null]; ff = [f,null]
gg = [g,null]; hh = [h,null]

node = [aa,bb,cc,dd,ee,ff,gg,hh]

def len(tree,node,i,n)
tree[i]*tree[node[i][n]]
end

def path(x)
pair = ["a","b","c","d","e","f","g","h"]
pair[x]
end


154デフォルトの名無しさん:2007/01/06(土) 05:54:24
>>153

def get_ans(node,tree,i,n,sum,_path_)
_next = node[i][n]
if _next == i then
a = [[sum,_path_]]
$ans = $ans + a
elsif _next == nil
nil
else
x = len(tree,node,i,n)
for j in 0..1
get_ans(node,tree,_next,j,sum+x,_path_+path(_next))
end
end
end

# --- main ---
for i in 0..1
get_ans(node,tree,0,i,0,path(0))
end
p $ans.sort
# --- end main ---

#[[27, "ach"], [38, "abdg"], [42, "abef"], [43, "acdg"]]
155デフォルトの名無しさん:2007/01/06(土) 20:59:33
>>152
real function distance(path)
common /rval/ rval
real rval(10)
integer path(*), i

distance = 1.0
do i=1,1000
if (path(i) .lt. 1) then
distance = int((distance + 0.5) * 100) / 100.0
return
endif
distance = distance * rval(path(i))
enddo
write(*,*) 'internal error'
stop
end
156デフォルトの名無しさん:2007/01/06(土) 21:00:26
>>155
program f152
common /rval/ rval
real d(6), minimum
integer i, path(10,6)
data path /
+ 1,2,4,6,0,0,0,0,0,0, ! あいえか
+ 1,3,5,2,4,6,0,0,0,0, ! あうおいえか
+ 1,2,5,7,0,0,0,0,0,0, ! あいおき
+ 1,3,5,7,0,0,0,0,0,0, ! あうおき
+ 1,3,8,0,0,0,0,0,0,0, ! あうく
+ 1,2,5,3,8,0,0,0,0,0 ! あいおうく
+ /
real rval(10)
rval(1) = rand(1) ! seed
do i=1,10
rval(i) = rand(0) * 10
enddo
minimum = 3.40282347E+38
do i=1,6
d(i) = distance(path(1,i))
if(minimum .gt. d(i)) minimum = d(i)
write(*,'(i10,f10.3)') i,d(i)
enddo
write(*,'(a10,f10.3)') 'mininum :',minimum
stop
end
157デフォルトの名無しさん:2007/01/07(日) 17:59:33
質問させてください.
Windowsのgfortranだとコンパイルも実行もできるソースが,
Linux版のgfortranではコンパイルは通るのに実行時に
  At line 91 of file LHDmake.f90
  fortran runtime error;Bad adress
となって止まってしまいます.

LHDmake.f90はMODULEで,その91行目は「WRITE(21,*) ''」という文(データを改行するため)
なのですが,なにがおかしいのでしょうか?

ちなみにUNIT=21は
「OPEN(UNIT=21,file='Result/plotLHD1_polygon.dat',status='unknown')」
です.

コンパイラのバージョンは
Win:gcc version 4.2.0 20060401 (experimental)
Linux:gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
です
158デフォルトの名無しさん:2007/01/07(日) 20:33:38
159デフォルトの名無しさん:2007/01/08(月) 16:12:05
「0.360e-10」は0.360×(10の-10乗)ですよね。

eがなくて、「0.360+250」のように表示されるのは
どういう意味でしょうか?
160デフォルトの名無しさん:2007/01/08(月) 16:51:03
指数が3桁になって表示を切り詰めたんじゃないのかな?
161デフォルトの名無しさん:2007/01/08(月) 19:14:02
>>159
マニュアルでFORMAT文のところを嫁
162デフォルトの名無しさん:2007/01/09(火) 15:52:01
すいません…どなたか150の回答お願いします…
163デフォルトの名無しさん:2007/01/09(火) 18:18:55
課題で、

-4(V/x)^2*a^3-2*(V/x)^2*3a^2+λv3a^2+a{2-2*(V/x)^2+4λV}+1+λV=0

V=0.1、xは0.1-1.0、
未定乗数λ=1,2,…t適当に入れて決める
求めたいのがaなのですが、
3次方程式なのでまったくプログラムが解りません
お助けねがえないでしょうか?
フォートランのバージョンはFujitsu Fortran V4.0L10です。
知恵をおかしください。 
164デフォルトの名無しさん:2007/01/09(火) 20:45:15
>>162
program hoge
integer, parameter :: N=6; real :: X(N), Y(N); integer :: Z(N)
character(len=8) :: f(N) = "行けない"
call random_seed(); call random_number(X); call random_number(Y)
Z = int(X*6 + 1) + int(Y*6 + 1); where (Z >= 7) f = "行ける"
print "(1X,A,A,I2,A,A)",(char(ichar("A")+i-1),"は",Z(i),"だから",f(i),i=1,N)
end program hoge
165デフォルトの名無しさん:2007/01/09(火) 23:29:07
>>163
安直にはニュートン法でとくべし。

1個は必ず実の解がある。残りはたとえば2次方程式として公式で。
166デフォルトの名無しさん:2007/01/10(水) 00:10:01
fortran77 でのプログラム作成なんですが、

x=1でのf(x)=exp(x)の一次微係数を2点微分方と4点微分法を用いて、
hを0.1から0.01ずつ掛けながら数値微分するプログラムを作れ。
hは10^(ー15)まで変化させ各hでの値と厳密値とを比較せよ。

f(1)(x)を一次微係数を表す式としますと

2点微分法は

f(1)(x)=(f(x+h)-f(x))/2h

4点微分法は

f(1)(x)=(8f(x+h)-f(x+2h)-8f(x-h)+f(x-2h))/12h

で表されています。

どなたか分かる方お願いします。
167デフォルトの名無しさん:2007/01/10(水) 02:31:47
double precision f,dx2,dx4,h,x
integer i
f(x) = exp(x)
dx2(h,x) = (f(x+h)-f(x)) / (2*h)
dx4(h,x) = (8*f(x+h)-f(x+2*h)-8*f(x-h)+f(x-2*h)) / (12*h)
x = 1.0
write(*,*) 'exp(1) = ', exp(1.0D0)
do 10 i=1, 15, 2
h = 0.1D0 * 10.0D0**(1-i)
write(*,*) h, dx2(h,x), dx4(h,x)
10 continue
end
168デフォルトの名無しさん:2007/01/10(水) 15:35:09
>>165
ニュートン法は使ってはいけない
ということなので、
他の方法はないのでしょうか?
169デフォルトの名無しさん:2007/01/10(水) 17:00:29
>>168
つ ニュートンラプソン法
170デフォルトの名無しさん:2007/01/10(水) 17:26:19
三次方程式なら普通に代数的解法があるんだからそれを使えばいいんじゃね?
171デフォルトの名無しさん:2007/01/12(金) 04:54:06
   REAL*8 FM(6),X(6),H,T,TI,TF
   WRITE(*,201)
 201 FORMAT(' ',5X,'T',9X,'X',11X,'Y',11X,'U',11X,'V')
   OPEN(8,FILE='b:alinda.dat')
CALL ICOND(N,TI,TF,H,X)
DO 20 T=TI,TF,H
WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
WRITE(8,'(2F10.5)')X(1),X(2)
CALL RUNGE(N,H,T,X,FM)
DO 30 I=1,N
30 X(I) = X(I) + FM(I)*H
20 CONTINUE
CLOSE(8)
END


上記のプログラムで、理解できないところがありまして。
>WRITE(*,'('' '',F8.1,4F12.7)')T,(X(I),I=1,N)
ここの括弧内なのですが、[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
あと、Tが何のためにあるのかがわかりません。
172デフォルトの名無しさん:2007/01/12(金) 12:26:52
退職金1000万を源資とし、毎年100万ずつ引き出して使用した場合
預金が無くなるまでの毎年の元利合計を計算するプログラムを作れ
なお、年利率が0.1%、1%、5%の3種類について計算を実行して
預金が無くなるまでの年数を比較しなさい
(預け入れ時点では引き出さず、1年後から引き出すものとする)

という課題が出たのですが、分らなくて困っています。
教えて下さい。
173デフォルトの名無しさん:2007/01/12(金) 12:50:45
program report11_2
implicit none
integer :: a(3),n,i,j,b
real :: r(3)

read(*,*) a(1)
do i=2,3
a(i)=a(1)
end do
do i=1,3
read(*,*) r(i)
end do
read(*,*) n

b=100.0
do i=2,n
do j=1,3
a(j)=a(j)+a(j)*r(j)/100.0-b
end do
write(*,*) i,(int(a(j)),j=1,3)
end do

stop
end program report11_2

ここまでやってみました。
174デフォルトの名無しさん:2007/01/12(金) 13:00:11
n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、
質量中心を計算するプログラムを作れ。

っていう問題なんですが、どのようにすればいいでしょうか?
If文とDo文と配列を使わないといけないのですが・・・。
よろしくお願いします。
175デフォルトの名無しさん:2007/01/12(金) 23:51:10
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
お願いします
176デフォルトの名無しさん:2007/01/13(土) 00:48:37
超素人な俺が考えてみた
 PROGRAM DISTS
C
C
C
real x,y,z,max,min,mid,hyoujun,heikin,wa
print *,'enter x,y,z
read x,y,z
wa=x+y+z
***heikinti***
heikin=wa/3
print *,'heikin=wa/3
***max***
if (x .gt. y) .and. (x .gt. z)
print *,'max=x
elseif (y .gt. x) .and. (y .gt. z)
print *,'max=y
elseif (z .gt. y) .and. (z .gt. x)
print *,'max=z
endif
***min***
if (x .gt. z) .and. (y .gt. z)
print *,'min=z
elseif (y .gt. x) .and. (z .gt. x)
print *,'max=x
elseif (z .gt. y) .and. (x .gt. y)
print *,'max=y
endif
***mid***
177デフォルトの名無しさん:2007/01/13(土) 01:06:20
>>175
program hage
real :: a(3),b,c(1),d(3)=3;read *,a
c=maxloc(a);d(int(c(1)))=0;print *,maxval(a)
c=minloc(a);d(int(c(1)))=0;print *,minval(a)
print *,pack(a,d>1);b=sum(a)/3;print *,b
print *,sqrt(sum((a-b)**2)/3);print *,sum((a-b)**2)/2
end program hage
178デフォルトの名無しさん:2007/01/13(土) 01:46:19
177を初心者向けのプログラムに出来ませんか?
179デフォルトの名無しさん:2007/01/13(土) 07:47:54
>>178
十分初心者向け
180デフォルトの名無しさん:2007/01/13(土) 11:55:23
>>178 >>177は筋が悪い、学んでもかえって馬鹿になるからやめとけ。
181デフォルトの名無しさん:2007/01/13(土) 12:53:05
fortran90の課題なのですが、分からなくて困っています。
どなたか優しい方、よろしくお願いします。

数字1.2.・・・.nを様々な順序に並べたものを置換という。
例えば、1.2.3の置換は次の6通りである。
(1.2.3)(1.3.2)(2.1.3)(2.3.1)(3.1.2)(3.2.1)
1.2.・・・.nの置換はn!通り存在するが、これらを全て重複なくリストアップする
プログラムを作れ。

というものです。
182181:2007/01/13(土) 13:08:34
追加です。

nはデータとして読み込むものとする。

ってのを忘れてました。
よろしくお願いします。
183デフォルトの名無しさん:2007/01/13(土) 13:23:09
順列 再帰 でググるといいかも
184デフォルトの名無しさん:2007/01/13(土) 13:43:50
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
誰か教えてください。
185デフォルトの名無しさん:2007/01/13(土) 13:57:58
> 数字1.2.・・・.nを様々な順序に並べたものを置換という。
なぜ教育課程でも使われている順列という定義があるのに、独自の定義をするのだろう?
186172:2007/01/13(土) 15:13:59
どなたかお願いしますorz
187デフォルトの名無しさん:2007/01/13(土) 15:41:25
184頼みます
188デフォルトの名無しさん:2007/01/13(土) 18:52:53
>>184
UZEEE
一般性を考慮しないF90の糞プログラム例だ。
PROGRAM vip
IMPLICIT NONE
REAL :: x(3), xmin, xmax, xmed, xmean, sigma, usigma
x = (/10.0, 1.0, 5.0/)
xmin = MINVAL(x)
xmax = MAXVAL(x)
xmed = SUM(x) - xmin - xmax
xmean = SUM(x) / SIZE(x)
sigma = SUM( (x - xmean)**2 ) / SIZE(x)
usigma = SUM( (x - xmean)**2 ) / ( SIZE(x) - 1 )
WRITE(*, *) xmin, xmax, xmed
WRITE(*, *) xmean, sigma, usigma
STOP
END PROGRAM vip
189デフォルトの名無しさん:2007/01/13(土) 18:55:28
>>185
有限群論とかでは置換群とか呼ぶから、そっち方面の方言だべ
190デフォルトの名無しさん:2007/01/13(土) 19:02:08
>>172
subroutine calc(x)
real rate
integer balance, years, interest

balance = 10000000
years = 0
write(*,*) 'rate = ', x, '%'
rate = x / 100.0

10 continue
interest = int(balance * rate + 0.5)
if (interest .ge. 1000000) then
write(*,*) 'rate too much'
stop
endif

balance = balance + interest - 1000000
years = years + 1
if (balance .le. 0) return
write(*,*) years, balance
goto 10
end

program report172
call calc(0.1)
call calc(1.0)
call calc(5.0)
stop
end
191デフォルトの名無しさん:2007/01/13(土) 19:12:33
>>186
超適当。0.1%, 1%の時は10年後に残金約50万円。5%の時は14年後に残金20万円。


PROGRAM no_dream
IMPLICIT NONE
REAL, PARAMETER :: rinterest(3) = (/0.1, 1.0, 5.0/), rstart = 1.0e7
REAL :: deposit
INTEGER :: i, j
DO i = 1, 3
WRITE(*, *) 'Case', i, 'Interest =', rinterest(i), '%'
WRITE(*, *) '----------------------------------------------'
deposit = rstart
j = 1
DO
deposit = deposit * (1.0 + rinterest(i) / 100.0) - 1.0e6
WRITE(*, *) 'Year', j, ' Remaining Money ', deposit
j = j + 1
IF (deposit < 1.0e6) EXIT
END DO
WRITE(*, *) '=============================================='
END DO
STOP
END PROGRAM no_dream

192デフォルトの名無しさん:2007/01/13(土) 22:01:56
x = (/10.0, 1.0, 5.0/) 
この文章の意味を教えてください
193デフォルトの名無しさん:2007/01/13(土) 22:47:05
n原子分子を構成する各原子の質量Miと座標(Xi、Yi、Zi)を読み込み、
質量中心を計算するプログラムを作れ。

という問題なんですが、どうしていいか分かりません。
If文とDo文と配列を使わないといけないのですが・・・。
よろしくお願いします。
194デフォルトの名無しさん:2007/01/14(日) 00:12:32
どなたか171お願いします
195デフォルトの名無しさん:2007/01/14(日) 00:37:31
>>171
>[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
はい、幅12小数部7桁の実数を4回表示する、という意味です。

>あと、Tが何のためにあるのかがわかりません。
何ででしょうね。 時間も表示させたかったんじゃないですかね。
196デフォルトの名無しさん:2007/01/14(日) 00:39:09
>>194
4F12.7の4は反復数、Tは出力するREAL*8型の変数。
197デフォルトの名無しさん:2007/01/14(日) 00:48:03
>>192
配列構成子を使って配列に値を代入する。
198デフォルトの名無しさん:2007/01/14(日) 01:43:43
>>192
x(1)=10.0
x(2)=1.0
x(3)=5.0
と同じこと。
199デフォルトの名無しさん:2007/01/14(日) 01:45:33
>>193
解法とプログラムのどちらが解らないのかはっきりしたまえ。
200193:2007/01/14(日) 08:13:45
>>199
プログラムが分かりません。
よろしくお願いします。
201デフォルトの名無しさん:2007/01/14(日) 09:45:27
>>200
我輩が知っている解法ではdo文と配列は使用するが、
if文は使用しないのだ。
その、解法を提示しろ。
202193:2007/01/14(日) 11:33:59
>>201
i<=2までの場合と2<iの場合で質量による
重心のバランスの出し方って変わりませんかね?
すいません。
ちょっと間違ってるかもしれません。
203馬鹿ですいません:2007/01/14(日) 13:55:06
198ってx(1)が10、x(2)が1,x(3)が5、という定数だという事を示しているんですよね?
定数を指定してしまうと最初から各値が決まってる気がするんですけど・・

204デフォルトの名無しさん:2007/01/14(日) 14:43:11
>>203
変数x(1)に10を格納する。
変数なので格納される値は書き換える事ができる。
205馬鹿ですいません:2007/01/14(日) 16:09:39
204>>なんとなくわかりました。
もしx(1)に10を格納しなかったらプログラムとして不成立?
206デフォルトの名無しさん:2007/01/16(火) 12:51:51
>>202
重心の出し方は n<=2 だろうが 2<n だろうが変わらないはず。
(M1×y1 + M2×y2 + ... + Mk×yk)
-------------------------------- (y座標)
k

x座標もz座標もyをx、yに変更すればO.K.

おそらくif文を使うのは、何個の原子があるかを判定するところで使うのでは?
つまり、プログラムに原子の個数をあらかじめ与えておくのではなく、与えられた初期データを読み込むときに原子が何個あるかをプログラムがカウントするということね。
207デフォルトの名無しさん:2007/01/16(火) 16:24:45
あるプログラムを作っているのですが、
配列に入れる値をテキストファイルから読み込むことが何度もあります。
その部分をサブルーチン化したいのですが、うまくいきません。
次のようなエラーが出るのですが、どう改善すればようでしょうか?

変数'x'の宣言において,整数式であるべきところが整数式ではありません.
'UNIT'指定子の値または型が正しくありません.
'FILE'指定子の値または型が正しくありません.
'UNIT'指定子の値または型が正しくありません.
'UNIT'指定子の値または型が正しくありません.

subroutine data(x,n,unit,file)

real,intent(inout),dimension(n) :: x
real,intent(in) :: n, unit, file

open(unit,file)
do i = 1,n
read(unit,*) x(i)
end do
close(unit)

end subroutine
208207:2007/01/16(火) 17:34:39
xは値を入れたい1次元配列
nは配列の要素数
unitはファイルに付ける番号
fileは読み込むテキストファイルの名前です。

↑の形にこだわらなくてもいいので、
同じことができる方法があれば教えてください。
209デフォルトの名無しさん:2007/01/16(火) 18:04:40
>>207
fortran90は使ったことないが、
> real,intent(in) :: n, unit, file
realじゃいやーん
といってるんだろ。
210デフォルトの名無しさん:2007/01/16(火) 22:29:53
>>208
漏れは>>207は釣かとオモタよ。
本気で聞いてるなら、しょん便で顔を洗って出直してくるべき。
211デフォルトの名無しさん:2007/01/17(水) 00:41:03
y(x)=F(x)*cos(m*x)の形をした関数を数値積分(積分範囲0〜2pi)
をシンプソン則で計算させようと思っているんですが
試しに、F(x)=1、x軸上のサンプリングポイント2000点とし、自然数mを1から1000まで連続的に増やして計算させたところ、
あるm=650近傍で積分値が大幅に振動し、それ以降では振動がある程度収まるという結果になりました。
この振動を抑えるための解決策があればご教授お願いします。
212デフォルトの名無しさん:2007/01/17(水) 10:37:07
>>211
三角関数の振動の周期と積分のステップ幅の関係を考えねば。
たぶん2π/650〜Δ1/1000くらいなんだろ。
積分範囲が分からんので断言できないが・
213デフォルトの名無しさん:2007/01/17(水) 18:19:49
>>209
ありがとうございます。
これ書いたときはだいぶ疲れてて気がつきませんでした。

そもそも文字列(ファイル名)を引数にしようとしていました。
214デフォルトの名無しさん:2007/01/17(水) 22:37:20
>>213
>そもそも文字列(ファイル名)を引数にしようとしていました。
それは可能姉妹
215デフォルトの名無しさん:2007/01/19(金) 17:30:31
某サイトからの引用ですが

CHARACTER::f*63,q=""""
f="('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END')"
PRINT f,q,q,q,q,q,f,q
END

を,まわすとプログラムソースと同じ答えが返ってきます.
そこの解説読んでも何故そうなるのかわかりません.
誰か詳しく解説してください.お願いします
216デフォルトの名無しさん:2007/01/19(金) 21:19:25
CHARACTER(LEN=43) :: f="('hoge',A,A,A,A/'huge',A,A,A/'hage'/'hige')"
WRITE(*,FMT=f) '"', '"', '"', '"', '"', f, '"'
END
217デフォルトの名無しさん:2007/01/20(土) 01:19:34
>>215
1)FORMATは文字列として与えても良い。 fはFORMAT文としてと文字列としてと
  2回違う意味で使用されいる。

2)PRINT fmt、text = WRITE(*、fmt) text
  PRINT文の1個目の引数?はフォーマットを表している。

3)文字変数 q = ” (引用符中の2連発の同じ引用符は1個の文字扱いとなる。)

4)PRINT f,q,q,q,q,q,f,q の意味は、以下と同じ。
100 FORMAT('CHARACTER::f*63,q=',4A/'f=',3A/'PRINT f,q,q,q,q,q,f,q'/'END')
    WRITE(*、100) q、q、q、q、q、f、q  

5)FORMAT文の斜線は改行。 
  文字列は文字列としてそのまま出力。
  Aは文字変数qに対応する文字型指定子。

218デフォルトの名無しさん:2007/01/20(土) 01:25:00
f2cで変換したソースを読む気がしない
219デフォルトの名無しさん:2007/01/21(日) 02:04:51
exe にしたファイルを元に戻したいのですが何か良いツールはないでしょうか?
20行くらいの簡単なファイルなのですが数がめちゃくちゃあって一から入力する気になれないです
どなたかそんなツール知っている方いましたらレスお願いします
220デフォルトの名無しさん:2007/01/21(日) 10:59:47
>>219
つ 「逆アセンブラ」「逆コンパイラ」

まあ、こいつらの出力を見たら一から入力する気になると思うがな。
221215:2007/01/21(日) 18:04:45
>>216
>>217
なるほど...fortran奥が深いですね
222デフォルトの名無しさん:2007/01/22(月) 22:44:47
>>220

それをやってくれるツールみたいなのはないのでしょうか?
フリー・シェアのどちらでも構わないのですが・・・
223デフォルトの名無しさん:2007/01/23(火) 00:32:55
>>222
Googleで「逆アセンブラ」とか「逆コンパイラ」で検索すれば色々見つかるよ。
Fortranの逆コンパイラは知らんが。

但し、実行ファイルから完全に元のソースにもどしてくれるようなものを期待しているのなら
そんなのもは無い。
224デフォルトの名無しさん:2007/01/25(木) 06:14:36
 来週の月曜までが期限の課題なのですが全く分からなくて困っています。
 内容としては、以下のプログラムでは行列の対角成分に0があると逆行列を
計算できないので、それをできるように改良するというものです。
 行列の対角成分の絶対値が大きくなるように行を入れ替えるピボット選択を
すればいいみたいなのですが…
 2chに書き込むのは初めてなのでおかしな点があったら申し訳ありません
が、何かヒントをいただければ助かります。
225デフォルトの名無しさん:2007/01/25(木) 06:18:26
>>224のプログラムです。
   PROGRAM INVERSE MATRIX

   INTEGER I,J,K
REAL A(3,6)

PRINT *,'Input matrix A'
DO 1000 I=1,3
READ *,(A(I,J),J=1,3)
DO 2000 J=4,6
IF (I+3 .EQ. J) THEN
A(I,J)=1.0
ELSE
A(I,J)=0.0
ENDIF
2000 CONTINUE
1000 CONTINUE
226デフォルトの名無しさん:2007/01/25(木) 06:20:32
>>225の続きです
   DO 3000 K=1,3
DO 4000 J=K+1,K+3
A(K,J)=A(K,J)/A(K,K)
DO 5000 I=1,3
IF (I .NE. K) THEN
A(I,J)=A(I,J)-A(K,J)*A(I,K)
ENDIF
5000 CONTINUE
4000 CONTINUE
3000 CONTINUE

PRINT *,'Result'
DO 6000 I=1,3
PRINT *,(A(I,J),J=4,6)
6000 CONTINUE

END
227デフォルトの名無しさん:2007/01/25(木) 15:09:45
>>223

ない
228デフォルトの名無しさん:2007/01/25(木) 21:22:12
ん? なにが?
229デフォルトの名無しさん:2007/01/26(金) 09:44:10
文脈から判断すると、fortran逆コンパイラ。
230デフォルトの名無しさん :2007/01/30(火) 01:24:15
X(O)=1としたとき、K=1,2,3,...の順に
X(K)=COS(X(K-1))
をくりかえして、
|X(K)-X(K-1)|<0.00001
になったら反復を打ち切るプログラムを作れ。

という問題なんですけど、どうすればいいでしょうか?
DO WHILEを使うのは分かるんですが…
どなたかお知恵をお願いします。
FORTRAN90です。
231デフォルトの名無しさん:2007/01/30(火) 11:46:43
もう少し歯ごたえのある問題をもってこい!
232デフォルトの名無しさん:2007/01/30(火) 11:57:43
>>230
program test
real :: x(0:1000)
integer :: i,k
k=0
x(k)=1.
do
k=k+1
x(k)=cos(x(k-1))
if(abs(x(k)-x(k-1))<0.00001) exit
enddo
do i=0,k
print *,i,x(i)
enddo
end program test
233age:2007/01/31(水) 00:11:58
ご指導ください.
関数副プログラムをF1,F2として,
A=F1*F2
としたとき,
write(*,*) A,F1*F2
の結果が

NaN,[実数値]

となるのはなぜですか?????
謎です・・・
234デフォルトの名無しさん:2007/01/31(水) 02:15:26
>>233
ソースがないとなんとも言えないが、
変数の型は大丈夫かな?
235デフォルトの名無しさん:2007/01/31(水) 03:00:46
>>233
NaNとはNot A Numberの略で、実数として違法な表現が入っている場合などに起きる。

コードをもう少し広く見ないと分からない。
>234の言うように型を間違えている可能性が高い。
236デフォルトの名無しさん:2007/01/31(水) 04:39:27
>234,235
ご回答ありがとうございます.
そうですか・・・
関数も倍精度,代入している変数も倍精度で定義しています.
なぜ代入してから表示するのと,代入する前の状態で表示するのと
で変わるのでしょうか?

関数は内部関数にしているのですが,なにか関係があるのでしょうか?
コードを貼り付けると非常に長くなりますので,
考えうる可能性としてはどのようなものがあるのでしょうか?
237デフォルトの名無しさん:2007/01/31(水) 04:46:39
A=F1*F2からwrite(*,*) A,F1*F2までの間で何かAに副作用を及ぼすようなことをしていない?
238230:2007/01/31(水) 08:04:05
>>232
ありがとうございます。できました。
DO WHILE 使わなくても出来ますね。全然気がつきませんでした。
239デフォルトの名無しさん:2007/01/31(水) 11:12:23
>>236
出してる情報が少なすぎるから、エスパー以外答えられんよ。
せめてWrite文の結果とエラーメッセージくらい出せば少しはわかる。
コンパイラの種類もわからないし。


まぁ漏れのESPカードによると、F1*F2は巨大数でオーバーフローして倍精度では表せない
数になった。もしくはアンダーフロー。WRITE文が4倍精度に対応しているのでエラーが出なかった。

最近4倍精度をサポートしている処理系が増えているので、Intel・Lahey(Fujitsu)・PGI・Absoft、etc、
十分ありうる。
240デフォルトの名無しさん:2007/02/01(木) 04:48:46
とあるプログラムのformat文の中に「1pg」と書いてあったのですが,
これは何を意味しているのでしょうか
241デフォルトの名無しさん:2007/02/01(木) 12:13:32
>>240
1P G のこと。 

それはFとEを自動で切り替えるGフォーマット に 小数点の位置をずらすP フォーマット
が組み合わさったもの。

F90時代にはESあたりを使うがよろしい。
プログラム書法では推奨されていたが、もはや時代遅れ。

詳しくはマニャル嫁。
242240:2007/02/02(金) 13:02:07
>>241
はい!せんせい
243デフォルトの名無しさん:2007/02/02(金) 19:11:37
すいませんちょっとお聞きしたいのですが
ちょっと計算機を変えて計算しはじめたのですが
以下のように今まで読めてたopen文が読めなくなってしまいます
これってコンパイラとか計算機によって依存するんでしょうか
なにかヒントいただければと思うのですが・・・
getRegFromUnwindContext: Can't get Gr0 from UnwindContext, using 0
forrtl: severe (59): list-directed I/O syntax error, unit 515, file /・・・・・
244デフォルトの名無しさん:2007/02/02(金) 19:14:36
すいませんあげさせてください
245デフォルトの名無しさん:2007/02/02(金) 19:47:52
ついでにエラー部分は
open(515,file='bc2.dat')
cwrite(*,*)'test'

cwrite(*,*)'test2'
read(515,*)iob  ←ここで止まってる
cwrite(*,*)'test3'
read(515,*)(iobb(i),i=1,iob)
close(515)
です
246デフォルトの名無しさん:2007/02/02(金) 19:54:46
すいません自己解決しました
読み込むファイルのスペースの数が悪いようでした
書き換えます・・
247デフォルトの名無しさん:2007/02/02(金) 20:47:42
やっぱりめんどくさいです
どうやら改行もだめのようです
こんなことってあるんですか?
248デフォルトの名無しさん:2007/02/03(土) 14:17:31
Makefileについて質問があります.

test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので
次のようなmakefileを作りました.

第2,3行目を追加したら常にclean:が実行されるようになってしまったのですが
何ででしょうか..
環境はWindows XP SP2 pro,Intel Visual Fortran 9.1で,
MSのNMAKEを使ってます.


FLAGS=%F90FLAGS% %LINK_F90%

.PHONY: all
all: main.exe

main.exe: main.obj sub1.obj
%F90% $(FLAGS) main.obj sub1.obj /o main.exe

main.obj: main.f90
%F90% $(FLAGS) main.f90 /c

sub1.obj: sub1.f90
%F90% $(FLAGS) sub1.f90 /c

.PHONY: clean
clean:
del *.obj
249デフォルトの名無しさん:2007/02/03(土) 14:19:09
すみません;
× test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので
○ main.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので

あとコマンド行の前にはもちろんタブが入ってます.
250デフォルトの名無しさん:2007/02/03(土) 16:46:25
>>248
nmakeが .PHONY に対応しておらず、通常のターゲットとみなしてしまうから。

.PHONY: all
を消すか、 all: の後に持って行くかすれば良い。
(nmakeで使う分には残しておいても意味はないが…)

make は結構方言がきついので、油断していると変なところではまってしまうぞ。
251デフォルトの名無しさん:2007/02/03(土) 17:17:48
>>247
何を言っているのかよく分からんが、一番確実なのは書いたとおりに読み込むことだ。

1行を頭から途中まで読んで、尻のほうを捨てることも出来る。
その場合、次のREAD文では、ファイル内の次の行を頭から読むことになる。

途中まで読んで、その行の残りを別のREAD文で読みたければ、
F90以降で導入されたADVANCE=”NO”を指定する必要がある。

詳しくはマニャル嫁
252248:2007/02/04(日) 00:39:15
>>250
ありがとうございます!
NMAKEの仕様を調べなおします.
253デフォルトの名無しさん:2007/02/05(月) 14:10:47
254デフォルトの名無しさん:2007/02/07(水) 20:01:12
まず、最初に規定の値(xとここではする)を決める。
そのxに乱数によって導き出された数y(計算方法は下記に記す)を引いていく。
これをz回(zはあらかじめ決めておく)繰り返す。
そのとき、計算過程がマイナス、または0になったとき、「miss」という項目に+1し、
xの値を初期値に戻す。というものです。

たぶんわかりにくいと思うので具体例を挙げて説明します。

(例) 各々の初期値を
x=7
y=int(rand()*10) ※この場合計算結果が3だったとします。
z=10
miss=0
とします。

このとき、x-y(以降、仕事と呼ぶ)をz回繰り返します。

@7-3=4
A4-3=1

1-3=miss
miss=0+1
ここで、xの値を7に戻す。

B7-3=4
C4-3=1


という感じで、missになる仕事以外の回数をz回繰り返します。
missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
よろしくお願いします。
255デフォルトの名無しさん:2007/02/07(水) 20:18:47
>>254
>missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
繰り返し処理に入る前に x の初期値を適当な変数に保存しておく。
missに +1するところで保存しておいた値を x に代入する。
256デフォルトの名無しさん:2007/02/08(木) 00:45:13
>>254
その日本語の解説どおりにFortranで書けばOKだ。
ほとんど完成している。
257デフォルトの名無しさん:2007/02/08(木) 18:22:36
「miss」か「Z=今までの仕事回数+1」

の判断はif文で分岐させればいいんですよね?
258デフォルトの名無しさん:2007/02/08(木) 18:42:46
そのためにあるのがIF文です。
259デフォルトの名無しさん:2007/02/09(金) 23:45:42
副作用のないLispで、変数の型に制約がつけられる、という理解でいいか?

参照透明性とはチューリング機械で言うと内部状態を持たないということか?
260254:2007/02/10(土) 20:21:30
今自宅なので、実際にプログラムを起動させて確認を取ることができないので、
構文だけここに記入します。間違いなどを指摘してくだされば幸いです。

※xfirstはxの初期値とする。

program main

integer x,z,xfirst,miss
real y

x=7
xfirst=7
y=int(rand()*10)
z=10
miss=0

do 20 z=1,10

x-y=x
if(x .gt. 0) then
z=z+1

else

miss=miss+1
x=xfirst

end if

20 continue
261デフォルトの名無しさん:2007/02/10(土) 21:47:13
FORTRAN77です
ビルドしたら<静的変数の合計の大きさまたは共通ブロックの大きさが、許容量を超えました>
というエラーがでたのですが、プログラムを分割するしかないのでしょうか?
262デフォルトの名無しさん:2007/02/10(土) 23:16:50
>>261
OSの制限なら分割するしかない。

32BitOSだと1配列やコモンブロックあたり2Gバイトまでというのはよくある。
(符号付32ビット整数の正の最大値=2G)

そうではなくて、コンパイラのデフォールトの制限でエラーが出ることもある。
その場合はマニュアルを見て、リンカーのオプションを変えればOSの制限値までは増やせるだろう。
263261:2007/02/11(日) 02:00:00
>>262
アドヴァイスありがとうございます
264デフォルトの名無しさん:2007/02/11(日) 02:06:56
>>260
文法のチェックだけでよければ
http://www.lahey.com/check.htm
ここでWEB上でチェックできる。


内容は見ていないが、ざっと見た範囲では
x-y=x
これがおかしい。あと末尾に END が必要。
265デフォルトの名無しさん:2007/02/12(月) 15:32:45
>>264


アドバイスありがとうございます。

x-y=x
というのは、x-yという演算を行い、そのときに出た結果を表現したつもりです。

例文でいうところの、7-3=4、4-3=1…と、4や1にあたる表現をしたいのですが、
なかなかうまいこといかないんです…
このような計算を行う場合、たとえばどのように計算してやればいいですかね?
266デフォルトの名無しさん:2007/02/12(月) 16:54:45
>>265
x = x - y
向きが逆
267デフォルトの名無しさん:2007/02/12(月) 21:08:29
>>265
266で言われてますが、=は左の変数に
右の計算結果を代入するものです。
268デフォルトの名無しさん:2007/02/13(火) 00:52:49
>>265
初心者の頃の俺と同じことやってるw
= は変数の値を左右が釣り合うようにするワケじゃなくて
= の右側の結果を左側の変数に入れるものだよ。

「←」の代わりだと思えば良いかな。
269デフォルトの名無しさん:2007/02/13(火) 01:20:57
do i=1,10
うんこ
if (i.eq.1)then
なんちゃら
else if(i.eq.2)then
なんちゃらちゃら
 endif
enddo
なんか一気に何ちゃらちゃらまでまわっちゃうんです><
うんこ→なんちゃら→うんこ→なんちゃらちゃら の順番になるはずですよね?
というかなんちゃらでエラーが出てます><これが原因でしょうか?
このエラーなおしたらちゃんとまわるようになるんでしょうか?まずはえらー直すことが先だと思うんですけど
構造的にはあってますよね??
270254:2007/02/13(火) 02:04:09
>>264であるサイトいったんですけど、errorってでてダウンロードできなかった…orz
構文はあってますかね?
271デフォルトの名無しさん:2007/02/13(火) 02:29:37
>>270
ダウンロードするのではなく、自分の書いたソースをアップロードするのだ。

で、>>260をそのままチェックした結果:

Diagnostic messages: program name(main)
1026-S: "SOURCE.F90", line 1: Corresponding END statement missing.
2004-I: "SOURCE.F90", line 8: 'y' is set but never used.
1302-S: "SOURCE.F90", line 14: Not a valid Fortran statement.
1635-S: "SOURCE.F90", line 16, column 7: DO variable 'z' cannot be redefined in range of DO construct.

上から
・ENDがない
・8行目(y=int(rand()*10))で y に値が代入されているが使われていない(これは次のエラーと関連している)
・14行目(x-y=x)の文が変
・16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。

構文的におかしいのはこんなところ。
>>254の題意からすると、zの使われ方が少しおかしい。
272254:2007/02/13(火) 15:36:17
>>271

zの使い方がおかしいとありますがどのようにおかしいのですか?
z=10とdo文の前で定義しているのがおかしいということですか?

do 20 z=1,10
で、仕事回数zの表現をしたかったんですが…
273デフォルトの名無しさん:2007/02/13(火) 15:51:51
>>272
もしかして日本語を理解できない人?
> 16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。
DOループの中でそのDOループのiteratorであるzをz=z+1という文で変更しようとしているが、
それはコンパイラとしては許せないことであると言われている。
274254:2007/02/13(火) 15:57:26
では、このような表現ではだめでしょうか?
work(10)は10回までの仕事を表現します。
work(z)というように表現し、do変数zで表現したいと思います。
このプログラムの最終目的は、missの回数をエクセルに出力して、グラフを作成することなんです。
そのために、結果を出力したいとおもっています。

以下に構文を示します。

program main
integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10
x-y=x

if(x .gt. 0) then
write work(z)   →※何回目の仕事かどうか、演算結果を表示したい。
else
miss=miss+1
x=xfirst
end if
end

20 continue
275デフォルトの名無しさん:2007/02/13(火) 16:31:29
あーダメだ x-y=xを見て諦めた
宿題スレじゃないしこっちは考えるヒントだけ出して自分で完成することで
プログラミングの達成感が味わえれば少しはプログラミングが面白くなるかもとか一瞬思ったが
散々言われてたx-y=xを直す気もなさそうだし相手にするだけ無駄っぽい
276254:2007/02/13(火) 18:40:47
>>275

あ、すいません…

間違ったソースコードをコピペしてしまったんで…
いまエラーを一個ずつ直してますが、確かに直っていくと面白いですね。
277254:2007/02/13(火) 20:41:21
理解力がなくてすいません。これが最後の質問です。

program main

integer x,z,xfirst,miss,work(10)
real y

x=7
xfirst=7
y=int(rand()*10)
miss=0

do 20 z=1,10

x=x-y
if(x .gt. 0) then

write(*,*) work(z)

else

miss=miss+1
x=xfirst


end if


20 continue


end
278254:2007/02/13(火) 20:51:19
上記のような構文を作ってコンパイルしたら、error 0 warning 0となっているのに、
題意のような結果がうまく表示されません。

おそらく、>>271で指摘されている
・8行目で y に値が代入されているが使われていない という点が原因だと思います。

しかし、ここがイマイチよく理解できません。

とありますが、yは、y=int(rand()*10で値が決定されていますよね?
ここで乱数計算によって、たとえばy=3という結果が出た場合、以後のプログラム内における
yという値は全て3というように決定されるんじゃないんですか?

x=x-yという式によって、yという変数はプログラム内で使われているのではないんですか?
この点がイマイチよく理解できないんです。

ドシロートですいません。
279デフォルトの名無しさん:2007/02/13(火) 21:19:35
>>277
>・8行目(y=int(rand()*10))で y に値が代入されているが使われていない
というのは
x-y=x とやってた為にコンパイラが

「x-y=x」は不正な文だからとりあえず無視
 → 他に y を参照している箇所がない
 → 「yが使われていない」と警告

として出てきたものだ。x-y=xを正しく書き直せば出なくなし、結果がおかしいのとは関係ない。

y=3でテストしたければ「y=int(rand()*10」の後ろに「y=3」と書いて走らせてみたらいい。

ところで、work(z)にはどんな値が入っているかわかるかな?
280254:2007/02/13(火) 21:42:46
>>279

仕事回数z、つまりそのときの仕事の結果を表示していくつもりで書いたんです。
zが3回目の仕事のときに、3回目の仕事の結果を出す、というようにしたんですが、
間違ってますかね?
281デフォルトの名無しさん:2007/02/13(火) 21:45:08
workに何も代入してないじゃん。
282254:2007/02/13(火) 22:01:02
>>281

つまり、work(1)〜(10)までを定義してやる必要があるということですよね?
(1)〜(10)を「どのように求めるつもりなのか」を明記するってことですか?

この場合だと、x-yでいいのかな?
283デフォルトの名無しさん:2007/02/13(火) 22:15:46
彼が何をしたいかわからない俺は馬鹿
284254:2007/02/13(火) 22:36:55
>>283

バカですんません。
とりあえず、やりたいことというのは、

@定められた仕事回数の分の仕事(x-y)をdo loopで行う。
Ax-yを実行する度に、仕事回数zの数を増やす

※x-yがマイナスに達した時、xの値を初期設定の値に戻す。仕事回数zに+1する代わりに、
その後、missの項目に+1する。

B仕事回数が規定に達したらそこでプログラム終了。

何故、こんな意味のわからないプログラムを組むのかというと高校の卒業課題で使うためです。
これによってある計算をしなければならないので…(詳細はここでは書けませんが)

とりあえず、x-yの計算結果と、missの回数すら出力できてないので、僕は非常に混乱しています…
バカでほんとうにすいませんorz
285デフォルトの名無しさん:2007/02/13(火) 23:50:05
>>284
卒業課題って今年度の?
今の状態で行き当たりばったりにプログラム書くより、教科書なり参考書なりをよく読んで
もう一度基本的な文法を覚えなおした方がいいよ。

それからパソコン持ってるなら家でも予習復習できるように処理系の1つも入れておけ。
Windowsで学校の課題程度ならこれくらいで十分
ttp://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran.htm
他は本スレ参照のこと
http://pc10.2ch.net/test/read.cgi/tech/1163319215/2
286デフォルトの名無しさん:2007/02/14(水) 21:38:36
構造格子上の3次元の温度データから等数値面をつくり、
その面に沿って面積分を行いたいのですが、うまくいきません。
 そもそも曲面の求め方が悪いのか(勾配から法線ベクトルを出し格子内
で面を張っているだけ)チェック用に完全な球を作り、
面積分を行っても球の表面積と桁が違うような結果になってしまいます。
 曲面の作成と面積分のやり方、あるいはfortranのサンプルプログラム等
に関してご存知でしたら教えてもらえませんか?
287デフォルトの名無しさん:2007/02/15(木) 21:46:19
倍精度複素数型 cKappa には,
純虚数 か 実数 かの何れかが格納されています.

つまり,cKappaを2乗すると必ず実数になるのですが,
この値を倍精度実数型 dE に代入したいときは,

dE = cKappa * cKappa

で問題ないのでしょうか?
288デフォルトの名無しさん:2007/02/17(土) 01:12:06
初心者でもぅさっぱり分かりません。
VS2005を入れてSilverfrostのftn95をインストールしてVSでftn95を選択。
一番簡単な
PROGRAM MainProgram
write(*,*) 'TEST'
END
を打ちデバッガ実行するとLINKエラーになります。このLINKエラーって何でしょうか?
289デフォルトの名無しさん:2007/02/17(土) 01:21:03
288です。失礼
------ Build started: Project: FortranApplication2, Configuration: Debug .NET ------
Building project FortranApplication2...
Updating References...
Linking...
LINK : error - File not found: C:\Documents and Settings\.dbk
こんなエラーです。
290デフォルトの名無しさん:2007/02/17(土) 01:50:41
>>288
VS2002だが、うまく行っている。
エラーメッセージを見る限り、ファイルそのものが見つかっていないような。
まず単独でビルドしてみたら?


Building project FortranApplication1...
Updating References...
Compiling file: FreeFormat1.f95
Linking...
Assembly file Debug\NET\FortranApplication1.exe for .NET 1.1 produced
Build log saved at: "file://C:\Documents and Settings\All Users\Documents\FORTRAN\FortranApplication1\Debug\NET\buildlog.txt"
FortranApplication1 build succeeded.
291デフォルトの名無しさん:2007/02/18(日) 01:07:44
>>まず単独でビルドしてみたら?
時間がなく、余り調べていないのですが、自分はVSが初心者です。
コマンドプロンプトからはexeを生成し、実行まで出来るのですが、VSだと・・・orz
上記の「単独でビルド」とは何の作業をさすのでしょうか?
292デフォルトの名無しさん:2007/02/18(日) 14:19:54
>>291
エラーメッセージから見ると、ソースファイルをプロジェクトに登録していないように見えるんだが。
New で作ったならそういう事は起きないが既存ソースなら登録がうまく言ってないのかも?
293デフォルトの名無しさん:2007/02/25(日) 14:25:10
s = a**b

の計算が必要なときは

s = exp(b*log(a))

と書いた方が計算が速いと聞いたのですが,本当でしょうか?
294デフォルトの名無しさん:2007/02/25(日) 17:37:12
>>293
自分でベンチマーク作って確かめろw

どっちにしろ一般のべき乗はexp log で計算しているはずなので、
8087のようにハードウェア的に実装されたexpを利用したかしないかの違いだろう。
295293:2007/02/27(火) 10:33:43
>>294
うちのPCではどうやら後者の方が2割程度早いようです.
コンパイラはIntel Visual Fortran 9.1です.

それでこれからは全てexp logで計算しようと思ったのですが,
問題が発生しました.

次のような,モジュールで変数を共有する仕様の
プログラムを書いたのですが,コメントしているように,
共有用モジュールの変数を介して値を渡した場合と
直接値を代入した場合で結果が異なってしまいます.

ちなみにb**bで計算した場合はどちらも同じ結果を出力します.

b=0の場合を除いて演算してもいいのですが,
NaNになる原因が分からないので何とも怖くて使えません.

何かアドバイスあったらお願いします..

296293:プログラムリスト:2007/02/27(火) 10:34:24
module commons
implicit none
real(8) a(1:10)
end module commons

program main
use commons
implicit none
a(1)=0.d0
call sub
end program main

subroutine sub
use commons
implicit none
real(8) b

!こちらを使うと出力は NaN
b=a(1)

!こちらを使うと出力は 1
b=0.d0

write(6,*) exp(b*log(b))
return
end subroutine sub
297デフォルトの名無しさん:2007/02/27(火) 21:19:52
>>295
組み込み関数 LOG(X) はXが実数の場合、Xは正(X>0)でなければならない。

IVFでは -∞ を返しているが、b * log(b) = 0 * -∞ = NaN となるので、
exp(b * log(b)) = exp(NaN) = NaN となる。

b=0.d0 の時に 1 と出力されるのは、コンパイル時に bの値が既知の定数(=0)なので
最適化によりプログラム中で b*log(b) が計算されず、直接 exp0.0D0) を求めてるため。
最適化なし(-Od)でコンパイルすると両方とも NaN になる。
298293:2007/02/27(火) 21:35:35
>>297
おおー!確かにそうなります!

実にすっきりしました.
どうもありがとうございます.
299293:2007/02/27(火) 21:39:28
途中で書き込んでしまいました.

あまりに訳が分からないので
さっきVinu Linuxをわざわざインストールしてgfortranでも
同じことをしたんですが,こちらは b=0.d0 と書いても b=a(1) で渡しても
NaNとなりました.

今まで最適化で問題が発生したことが無かったこともあって,
原因がコンパイラの最適化にあったとは全然気がつきませんでした.
300デフォルトの名無しさん:2007/02/27(火) 23:39:40
Xが0以下の実数の場合、LOG(X) の結果は処理系依存になるので
実行時エラーを出してプログラムを止める処理系もある。
301デフォルトの名無しさん:2007/02/28(水) 00:44:46
最近の処理系はIEEE準拠になって途中で実行時エラーで止まることが少なくなってありがたい。

せっかくIF文で例外を排除しているのに、コンパイラが最適化して勝手に投機的実行をして、
挙句に0割とかで実行時エラーを起こしてとまるとか、ウンコのようなことが昔はよくあったwwww

302デフォルトの名無しさん:2007/02/28(水) 04:01:39
学校で今週までの課題で
『n元連立一次方程式をガウス・ザイデル法を利用して解くプログラムを作成し、テストを行え』
という課題がだされたのですが、全くわかりません(;_;)
頑張って本を読んでみたのですが理解できなくて(;_;)
最終手段として、ここに来ました(>_<)
どなたか、ご教授下されば幸いです(;O;)
初めての書き込みなので粗相があったらすみませんm(__)m
ちなみに学校で使っているのはフォートラン77です。
303デフォルトの名無しさん:2007/02/28(水) 12:05:08
またガウス・ザイデル法かw

こんなの教科書にも載りまくりだろう。

誰かFAQにでも入れておけ。
304デフォルトの名無しさん:2007/03/01(木) 23:14:14
>>302
IMPLICIT REAL*8(A-H, O-Z)
PARAMETER (NMAX=99, LMAX=100, EPS=1.D-10)
REAL*8 A(NMAX,NMAX), B(NMAX), X(NMAX)
OPEN(10, FILE='DATA.TXT', STATUS='OLD')
READ(10,*) N
DO 100 I = 1,N
READ(10,*) (A(I,J), J=1,N), B(I)
100 X(I) = 1.
DO 110 I = 1,N
110 WRITE(*,'(1X,100F12.6)') (A(I,J), J=1,N), B(I)
CLOSE(11)
DO 220 L = 1,LMAX
ERR = 0.
DO 210 I = 1,N
TX=B(I)
DO 200 J = 1,N
200 IF (I .NE. J) TX = TX - A(I,J)*X(J)
TX = TX / A(I,I)
ERR = ERR + ABS(TX - X(I))
210 X(I) = TX
220 IF (ERR .LT. EPS) GOTO 299
STOP
299 WRITE(*,'(1X,F12.6)') (X(I), I=1,N)
STOP
END
305デフォルトの名無しさん:2007/03/03(土) 12:26:05
まだ77教えてるところなんてあるんだな。センセたちも古い規格しか知らなく
て「古い古い」言ってんだから世話ないな。
306デフォルトの名無しさん:2007/03/03(土) 13:21:34
古いからこそ実績や信頼性の有るコードが多い。
研究室に入った学生が真っ先にする仕事は古いFORTRANコードのメンテだ。
FORTRAN77を学ぶことは、まだまだ有益なのだ。



決して、ン十年前の講義ノートを使い回しているだけじゃありませ(ry
307デフォルトの名無しさん:2007/03/03(土) 16:07:37
古いと、妙な手あかがつきまくって、
難解で珍妙なコードになってることもあるぜ。

FORTRAN は言語的にバグを出しにくくするサポートが未熟で
デバッグしづらくて困る。
308デフォルトの名無しさん:2007/03/03(土) 20:10:54
>>305
コンピュータ言語の教育という面ではF77は切り捨てたほうがいいのだが、
現実にメンテさせられるコードは77以前なのだから実用性からはそれもありかなとw

まぁクイズとか解いてりゃいい新型言語とは違うしw

309デフォルトの名無しさん:2007/03/03(土) 20:32:13
310デフォルトの名無しさん:2007/03/03(土) 20:35:33
fcpadでftn77を使っているのですが、あるプログラムをコンパイルして実行
しても結果が一瞬表示されて消えてしまいます。どうしたらいい?
311デフォルトの名無しさん:2007/03/03(土) 20:42:35
>>310
pause文を入れろ
312デフォルトの名無しさん:2007/03/03(土) 20:50:36
>>311
これってもしかしosのてシステム上の問題?
xpつかってるからセキュリティのservice pack2が問題かもしれん。
コマンドプロンプトからプログラム名を指定して実行したら成功しますた
313デフォルトの名無しさん:2007/03/03(土) 21:34:50
>>312
コンソールアプリはそれが普通。
処理を停めなければDOS窓はすぐに消える。
それが嫌ならpauseで停めろ。
それより結果はファイルに出した方が良いぞ。
314デフォルトの名無しさん:2007/03/03(土) 21:42:27
>>313
ということはつまり結果をテキストファイルみたいにしてだすわけですね?
OPEN文つかうんですよね?

ご指導ありがとうございます
315デフォルトの名無しさん:2007/03/03(土) 22:45:09
DOS 窓開いてから実行すればいい
316デフォルトの名無しさん:2007/03/03(土) 23:44:05
ありがっと
317デフォルトの名無しさん:2007/03/04(日) 19:02:27
OPEN文でファイルからデータを読ませようとしてるんですけど「ファイルがない」って
エラーが出ます。あるのに。


なぜですか
318デフォルトの名無しさん:2007/03/04(日) 19:16:03
事故解決しました。
UNIT=1にするとエラー
UNIT=2にするとコンパイルはできるが入力データに上書きされてしまう
UNIT=3にするとコンソール画面に結果がでてウマー
319デフォルトの名無しさん:2007/03/04(日) 23:12:07
CSQRTって使えるの?
320デフォルトの名無しさん:2007/03/04(日) 23:49:23
>>319
FTN77で。
321デフォルトの名無しさん:2007/03/05(月) 00:06:07
>>317
一桁目は歴史的な理由から予約されていることが多い。
処理系によっては90番台も予約されていたりする。

特に理由が無ければ避けるのがよろし。


>>320
たしか、77の規格には無かったはず。
EXPを使って解け。
322デフォルトの名無しさん:2007/03/05(月) 00:44:52
>>320
こんなとき(だけ)役に立つ、岩波FORTRAN辞典〜♪
によるとFORTRAN77でもSQRTの引数複素数時の個別名はCSQRTだ。よかったな。

だが、総称名使え。
323デフォルトの名無しさん:2007/03/05(月) 06:01:36
>>321
一桁目ってunit=1から9のことdふぇすか?


複素数のはびっくりした。ああなるほどっておもた。オイラーの公式だね

exp(iθ)=cosθ+i sinθ

>>322
ということは、たとえばD=B**2-4*A*Cという式があって、REAL Dとしているとき、
sqrt(D)を計算しようとしますよね。BとAの与え方によってはD<0となり複素数と
なりますよね。そのときCSQRT(D)とすればいいのですか?
324デフォルトの名無しさん:2007/03/05(月) 06:13:49
ま、あれですかね。複素数ってプログラムで扱うもんじゃないんですかね
325デフォルトの名無しさん:2007/03/05(月) 06:51:59
>>323
CSQRTの引数は複素数型。
そしてFORTRANではC言語などの様に引数の型を(関数宣言に合わせて)自動変換したりはしない。
326デフォルトの名無しさん:2007/03/05(月) 07:51:42
ということは

あらかじめ変数宣言でCOMPLEX Dとしていて
CSQRT(D)ならばありってことですか?
327デフォルトの名無しさん:2007/03/05(月) 22:05:32
>>326
文法的にはあり

だがまあその場合、SQRT(D)としとけば内部的にCSQRTを呼んでくれるので
わざわざCSQRT(D)とする必要はないけどな。
328デフォルトの名無しさん:2007/03/07(水) 11:59:22
>まぁクイズとか解いてりゃいい新型言語とは違うし

かっこいいな
329デフォルトの名無しさん:2007/03/09(金) 19:51:16
ちょっとしつもんです。

txtファイルで
0 0.1 3.2 
6.3
1 2.1 5.6 
5.9
・・・

のようにちょっとずれたテーブルがあるんすけどこれを次のようにグラフ化できるように
整理できるプログラムって作れますか?
0, 0.1 ,3. ,6.3
1, 2.1, 5.6, 5.9
・・・

条件は入力がtxtファイルで出力もtxtファイルかcvsファイルにするものです。
330デフォルトの名無しさん:2007/03/09(金) 20:14:07
作れるけど、わざわざ FORTRAN で作るもんでもないと思われ。
331デフォルトの名無しさん:2007/03/09(金) 20:54:43
>>330
おしえてくださいませんか?また、フォトラン使わないならば何を使うのか教えてください。
お願いします先生
332デフォルトの名無しさん:2007/03/09(金) 21:29:25
awk がちょうどいいんでない?
333デフォルトの名無しさん:2007/03/10(土) 01:38:15
じゃあawkで

#! /bin/gawk -f
BEGIN { NMAX = 4; n = 0 }

{
for(i=1; i<=NF; i++) { a[n++] = $i; if (n >= NMAX) { putn(a, n); n = 0; } }
}

END { if (n>0) printn(a, n) }

function putn(a, n, i) {
for(i=0; i<n-1; i++) printf("%4.1f, ", a[i])
printf("%4.1f\n", a[i])
}

もっと簡単に書けるかもしれないけど、こんな感じで。
334デフォルトの名無しさん:2007/03/10(土) 11:17:50
awkってなんですか
335デフォルトの名無しさん:2007/03/10(土) 11:35:44
awkは語るまい。
336デフォルトの名無しさん:2007/03/10(土) 11:56:57
awk というのは、加齢臭の漂うおっさんスクリプト言語。

パソコンの処理能力が上がって、データ後処理がパソコンで実用的にできるようになった頃に
流行っていたスクリプト言語がawkだった。あの頃はperlも何も無かった。

大型計算機のFORTRAN出力をパソコンに落として、awkで整形処理、xyプロットソフトで描く。
という流れが80年代末から90年代初頭に流行った。

そういうわけでロートルはawkが使える。
337デフォルトの名無しさん:2007/03/10(土) 13:10:53
じゃぴったりなわけだ。

awkってコマンドプロンプトさえあればできるんですよね?
338デフォルトの名無しさん:2007/03/10(土) 14:16:18
"フォトラン"ってなんかカワイイ
339デフォルトの名無しさん:2007/03/10(土) 16:11:24
フォトラン20 平成20年バジョン
340デフォルトの名無しさん:2007/03/10(土) 17:24:56
>>337
基本的にコマンドラインでスクリプト・ファイルを指定したり、直接コマンドを書き込んだりして使う。

Linuxには大抵、最初から入ってる。
Windows用のもググれば色々見つかる。
341デフォルトの名無しさん:2007/03/10(土) 17:54:03
にゃるほどシグウィンにするかな。いろいろありがとうごzぁいましゅ
342デフォルトの名無しさん:2007/03/10(土) 18:12:56
すげーすげーすげー
オークすげー

ここの人のおかげで先ほどのデータ並べ替えができるようになりました。
ありがとうございました。
オークの勉強もフォトランと一緒にしようとおもいます
343デフォルトの名無しさん:2007/03/10(土) 22:35:19
>>329
もしFORTRANでやるならどうしますか
344@がばい佐賀:2007/03/10(土) 23:17:15
先ほどからしつこくてすみません。テキストデータの並べ替えを質問してAWKに感動したものです。
実はフォートランでもプログラムを組んでみました。

REAL A,B,C,D
C 読み込みファイル指定(既存)
OPEN(UNIT=3,FILE='data.TXT',STATUS='OLD')

DO 20 I=1,4
READ(3,*) A,B,C,D

WRITE(*,100) A,B,C,D
C 書き出しのフォーマットを指定
100 FORMAT(F6.3,',',F6.3,',',F6.3,',',F6.3)
20 CONTINUE
C 開けたファイルは閉じましょう
CLOSE(UNIT=3)

END

こんなぐあいでやったらコンパイルはちゃんと通ってデータも並びなおしてました。

でも、ちょっと腑に落ちないところがあります。
DO文のところです。俺は、なんとなくI=1,4として「これで1行から4行まで勝手に読み込んでくれるだろ」
という乗りでやったのですが実際のどげんですか?
このI=1,4はA,B,C,Dを読み込むのを4回やれということになりますか?
それとも1行目から4行目までA,B,C,Dを読むのを繰り返せというような行数を表すのですか?

普通、DO文でI=なんとかとしたら
処理のところにA=A+IとかIの入った式を書いたりするじゃないですか。でもこの問題の場合
Iを処理の回数として勝手に認識してくれているのであれば私のプログラムに間違いはない
ですよね
345デフォルトの名無しさん:2007/03/10(土) 23:51:46
>>343
AWKは最近流行らないから、本とかも無いだろ。
今更感が無きにしも非ずだがFORTRAN界では大丈夫かw

PROGRAM test
IMPLICIT NONE
REAL :: a(4)
INTEGER :: i, ip
DO
READ(9, *, END = 999) a
WRITE(*, '(3(f10.4, ","), f10.4)') a
END DO
999 STOP
END PROGRAM test


>>344
あぁ、もう自作したかw

FORTRANでは歴史的な事情により、指定しない限りフォーマット付きI/Oでは、
入力データの空白は0として扱われる。(FORMAT文のNB/NZオプションあたりの説明嫁)

しかし*での自由書式だと空白が区切り記号として解釈される。
また今の場合のようにデータが足りないと改行して読んでくれる。

大昔は容量を節約するため出力データは空白を開けないで続けて書いたりしていたw

質問の解答は『A,B,C,Dを読み込むのを4回やれ』ということになる。
ところがFORMATを指定した場合はこうはならない。
/などで明示的に改行してやらないといかん。

細部は漏れも忘れたので文法書でFortmatのところ嫁。
346デフォルトの名無しさん:2007/03/10(土) 23:58:03
うわーありがとうございます!
347デフォルトの名無しさん:2007/03/11(日) 01:04:48
ところでおすすめの書ありますか?
348デフォルトの名無しさん:2007/03/11(日) 05:38:38
>>345

。・゚・(ノд`)・゚・。
そりゃあ流行じゃないし、数もそれほどじゃないけど絶版になってないのもあるよ
オライリーのとか。
349デフォルトの名無しさん:2007/03/11(日) 11:08:55
>>336
うちの研究室では awk を教えられたぞ。
350デフォルトの名無しさん:2007/03/11(日) 13:00:33
ホムペじゃあまだオークを語ってるところもあるね
351デフォルトの名無しさん:2007/03/11(日) 16:39:20
FORTRAN よりは若い言語だよな。
352デフォルトの名無しさん:2007/03/11(日) 17:32:57
>>351
そりゃFORTRANと比べたら……
353デフォルトの名無しさん:2007/03/11(日) 18:52:48
どなたかご教授下さい!!

FTN95とfcpadの組み合わせで使いたいのですが、
fcpadでコンパイラのパスを「C:\Program Files\Silverfrost\FTN95\ftn95.exe」
として、いざf95のソースファイルをコンパイルすると
[FTN95/Win32 Ver. 5.01.0 Copyright (c) Silverfrost Ltd 1993-2006]
*** Invalid executable file suffix - only .EXE is permitted
と出てコンパイルできません。ファイルの拡張子を.fにしても駄目でした。

どうしたらFTN95+fcpadでコンパイルできるのでしょうか!?
おとなしくplato3を使うしかないのでしょうか・・・
354デフォルトの名無しさん:2007/03/11(日) 19:26:27
>>353
前にも誰かが聞いていたような・・・・

まぁあのキモイ顔のプラトン使ってやれよ!

355デフォルトの名無しさん:2007/03/11(日) 19:40:25
>>353
FTN95のコマンドラインの書式は
> ftn95 <filename> [option [option] ...]
一方、CPad (for FTN77)がコンパイラに渡すコマンドラインの書式は
> ftn95 [option [option] ...] <filename>
書式が違うのでそのままではエラーになる。

解決策としては例えば、↓の様な内容のバッチファイルを

@REM --- ここから ---
@shift
ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 %0
@REM --- ここまで ---

ftn95.exe と同じディレクトリに作成し、fcpadの「基本設定」の「コンパイラのパス(W)」に
このバッチファイルを指定する。

しかし自由書式のプログラム作成とか考えるとCPad for FTN77を使うよりも
付属のplato3か他のエディタを使うことをお勧めする。
356デフォルトの名無しさん:2007/03/11(日) 19:44:46
>>353
このスレの57のあたりを見直せば
357353:2007/03/11(日) 23:32:50
>>355さん
ありがとうございます!
早速バッチファイルを作ってみましたが、結局うまくいきませんでした。
たしかにfcpadにこだわる必要はなさそうなので、vimを使ってみようと思います。

>>354さん
>>356さん
ご意見ありがとうございます!
前述の通り結局vimを使うことにしました^^;
358デフォルトの名無しさん:2007/03/16(金) 18:37:39
こんにちは。現在Fortranでプログラムをしているのですが、難しくててこずっています。
そこで、知恵を貸していただきたいと思い、書き込んでいます。

A=x*exp(-u*B)+y*exp(-v*B)+z*B^(-(w+1))
という関数があり、x,y,z,u,v,wは未知数で
AとBはExcelのA列とB列にそれぞれデータが600与えられていて、
test.csvとして保存しています。

このx,y,z,u,v,wの未知数6個を上式の関数とA,Bの配列(?)を用いて,
収束させることによって求めたいと思っています。

ご教授お願いします。

dimension、open、write、read、doなどを使うのはなんとなく分かるのですが、
、難しくてよく分かりません。
どうぞよろしくお願いします。
359デフォルトの名無しさん:2007/03/16(金) 20:56:50
salford FTN90 とPLATO3のダウンロードできる場所をおしえてくださいお
360デフォルトの名無しさん:2007/03/18(日) 03:57:05
>>358
まずは問題点を切り分けよう。
ファイルの読み込みと実際の計算部分だ。
どちらならできる? 両方とも難しいかい?
361デフォルトの名無しさん:2007/03/20(火) 16:53:44
質問させてください
DO i=1,10
 DO j=1,10
  DO k=1,10
   dt_den(i,j,k) = den(i,j,k) * div_vel
  END DO
 END DO
END DO

というコードを書いたのですが、『ランクが違うので計算できない』という旨のエラーが出ました。
「配列の一つの要素を取り出し、計算して、別の配列の要素へ代入する」
ということをやりたいのですが、どのように書けばいいのですか?
362デフォルトの名無しさん:2007/03/20(火) 21:37:08
Fortran77のコンパイラの選択に関する質問です。

私はこれからFortran77を学ぼうとしているところです。
利用の目的は学術的な数値の計算です。
有償、無償の様々なコンパイラがあることは調べているうちにわかりました。
しかしなにぶん右も左もわからないもので、どれが良いか決めかねています。
信頼性を重視した場合、やはり有償のものを購入する方がよいのでしょうか。
また、お勧めのコンパイラがありましたら教えていただけますと幸いです。

当方Windowsを使用しており、主な環境は以下の通りです。
OS:WindowsXP Professional
CPU:Pentium D(4?) 2.8GHz
Mem:1GB

なお、購入の場合は5〜10万円程度の予算を考えております。
どうぞよろしくお願い致します。
363デフォルトの名無しさん:2007/03/20(火) 21:49:54
!これから学ぶのに、いきなり5-10マソも出すなんてすごい!しかも77だなんて。
!どこかの研究者さんでしょうか。メモリ1GBということは、大規模な計算では
!なさそうなので、無料のG95かgfortranでいい気がするのですが、どうなんでしょう?
!学生の私には判断できません・・・。
364デフォルトの名無しさん:2007/03/20(火) 22:20:08
上に同じ。
安い/無償の環境と高い環境の違いは
・開発のしやすさ
・ライブラリの有無(例:高速な数値演算ライブラリ)
・最適化の性能(=計算速度)
あたりにあるので、まずはフリーのコンパイラを使ってみたらどうか。
365361:2007/03/20(火) 22:37:36
すみません。自分で解決しました。原因は
REAL(8),ALLOCATABLE :: div_vel(:,:,:)
としていたことでした。正しくは
REAL(8) :: div_vel
でした。
366デフォルトの名無しさん:2007/03/21(水) 17:29:05
>>358
その式を解くとなると、
非線形の最小二乗法(または、自乗法)が
必要になります。
もちろん、FORTRANで計算可能ですが、
一からプログラムを書くとなるととっても大変だよ。
367362:2007/03/21(水) 17:40:00
ご返信ありがとうございます。
研究に用いるため信頼性をなによりも重視しており、
予算も高めに覚悟しておりました。
有償無償の間にバグに関して差がないのであれば、
最初は無償のものを使おうと思います。
Salfordのものを使うつもりです。
相談に乗っていただきありがとうございました。
368デフォルトの名無しさん:2007/03/24(土) 02:02:25
>>367
大規模計算はスパコンで、解析は自分のPCでフリーのコンパイラだけど、
特に問題は出ていない。
少なくとも、今のところ、バグで酷い目にあったことは無いかな。

知り合いは、その昔、スパコンのコンパイラのバグで酷い目にあったそうだから、
有償/無償の差よりは、運/不運のファクターの方が大きいかも。
多くの人が使っているものを選べば、まぁ、大丈夫だと思う。

コンパイラのバグに出会ったことは無いけれど、
大規模な新型スパコンが導入されると、設定ミスが発覚したり、
ジョブ管理のシステムの挙動がおかしかったり、トラブルが続いて
落ち着いて使えるまでに少し時間がかかることもある。
数が多く出ているようなシステムは、こういうことは少ないと思うけど。

369デフォルトの名無しさん:2007/03/25(日) 13:03:53
>>367
金があるなら、Intel Fortran + MSVisualStudio の組み合わせでいいんじゃないの?
ソフトは利用者が多い物が勝利するので、寄らば大樹の陰。

VisualStudioはアカデミックなら5,000円なので無問題。
IntelFortranは、やや高いし、毎年$200のお布施でライセンス更新をしないといけないが。
(再インストール出来なくなるだけで、使えなくなるわけではない)
Linux版でよければただで使える。

バックエンドが富士通なら、富士通/Laheyのコンパイラを使うという手もある。

Fortranは未だコンパイラ市場が存在できてい牙城なので、フリーソフトを排撃してこれを守ってゆこうw
370デフォルトの名無しさん:2007/03/25(日) 15:33:39
すいません、初心者です。
↓のようなデータを画面に出したいのですが
参考プログラムを教えていただけませんか?
1964/1/1 115 89 80 81 104 154 209 256 287 298 285 260 229 199 176 170 189
1964/1/2 155 111 89 81 91 124 171 227 266 293 292 274 252 221 190 174 181
1964/1/3 191 147 112 92 94 113 151 194 241 271 290 283 267 241 214 189 176
1964/1/4 222 185 147 117 101 107 134 168 208 248 274 284 274 256 233 208 185
1964/1/5 238 213 184 156 134 127 139 164 193 227 259 276 274 267 249 226 204
1964/1/6 248 234 214 190 165 151 149 161 181 206 234 257 267 266 257 243 222
1964/1/7 234 236 229 215 199 184 175 175 184 203 224 241 256 264 259 248 233
1964/1/8 216 228 234 229 221 213 203 192 190 197 210 225 239 252 258 254 243
1964/1/9 193 212 227 237 238 231 220 209 199 194 195 205 217 232 243 250 246
1964/1/10 163 181 203 226 238 243 240 229 217 205 195 196 202 215 232 245 251
371デフォルトの名無しさん:2007/03/25(日) 16:33:21
>>370
write(6,'(A)') '1964/1/1 115 89 80 81 104 154 209 256 287 298 285
&260 229 199 176 170 189'
write(6,'(A)') '1964/1/2 155 111 89 81 91 124 171 227 266 293 292
&274 252 221 190 174 181'
write(6,'(A)') '1964/1/3 191 147 112 92 94 113 151 194 241 271 290
& 283 267 241 214 189 176'
write(6,'(A)') '1964/1/4 222 185 147 117 101 107 134 168 208 248 2
&74 284 274 256 233 208 185'
write(6,'(A)') '1964/1/5 238 213 184 156 134 127 139 164 193 227 2
&59 276 274 267 249 226 204'
write(6,'(A)') '1964/1/6 248 234 214 190 165 151 149 161 181 206 2
&34 257 267 266 257 243 222'
write(6,'(A)') '1964/1/7 234 236 229 215 199 184 175 175 184 203 2
&24 241 256 264 259 248 233'
write(6,'(A)') '1964/1/8 216 228 234 229 221 213 203 192 190 197 2
&10 225 239 252 258 254 243'
write(6,'(A)') '1964/1/9 193 212 227 237 238 231 220 209 199 194 1
&95 205 217 232 243 250 246'
write(6,'(A)') '1964/1/10 163 181 203 226 238 243 240 229 217 205
&195 196 202 215 232 245 251'
end
372デフォルトの名無しさん:2007/03/25(日) 20:01:53
PROGRAM omanko
IMPLICIT NONE
CHARACTER (LEN = 80):: fmt
INTEGER :: iy, im, id, idat(17)
fmt = '(i4, 2("/", i2.0), 17i4 )'
iy = 1964
im = 3
id = 24
idat = (/115, 89, 80, 81, 104, 154, 209, 256, 287, 298, 285, 260, 229, 199, 176, 170, 189/)
WRITE(*, fmt) iy, im, id, idat
STOP
END PROGRAM omanko
373370:2007/03/26(月) 12:12:59
>>371
それはDO文でやった方がいいですねw

>>372
年月日のところが上手く表示できなかったので
参考にしてみます。

>>371,372
感謝です。
374デフォルトの名無しさん:2007/03/26(月) 20:58:14
plato3で作成したプログラムのエグゼファイルのアイコンをアイコンエディターでつくった
アイコンに変えるにはどうしたらいいですか?
375デフォルトの名無しさん:2007/03/29(木) 22:11:04
>>374
プラトン先生はよく知らんが、リソースファイル書いてアイコン指定すれば?
376デフォルトの名無しさん:2007/04/02(月) 21:07:05
Fortranで何ができるのかも良くわかっていないのですが,
データを出力したときにメモリーの状態はどうなっているのか?
ということを教えて下さい.

その内容は
「Fortranでエクセル形式データを出力させた場合,データは一度
メモリーに格納され,エクセルへ出力するのだと思っているのですが,
出力した後,メモリーは開放されるのでしょうか?」ということです.

当方の環境は,
コンパイラ : fujitsu fortran77
OS : WindowsXP Professional


以上,よろしくお願いします.
377デフォルトの名無しさん:2007/04/02(月) 22:07:34
死にたい
378デフォルトの名無しさん:2007/04/02(月) 23:09:26
>>376
質問の意味が不明瞭だ。

原則としては、プログラムが終了するなら、メモリーは解放される。 

実行中は、静的に確保した部分は確保されたままだし、動的に確保されたものはDEALLOCATE
すれば開放される。




ただしOSやコンパイラにバグがなければ。 
昔のMS-PowerStationにはメモリーリーク・エラーがあって実行中にI/Oがあると、
徐々に使用メモリーが増えていった。
379デフォルトの名無しさん:2007/04/03(火) 02:15:04
>>377
死ぬなら中国大使館に爆弾持って特攻だ!!

380デフォルトの名無しさん:2007/04/03(火) 14:14:52
>>379
FXって言う為替取引で倍率を200倍でやると良いって、死ぬきあるなら博打をしてから詩ねってことだな
381デフォルトの名無しさん:2007/04/04(水) 10:24:58
       r'::::::::,:::::::::::::::::::::::\     【USBオナホを実現させる会】に入会しませんか^^^
         \::/::;;;:::::::::::::::::::::::::\
      , ─ -v_;;. -─ ─ ── ─-、このオナホが実現すれば、パソコンにUSB接続して
    | ,   f-‐ ''_ .二 二二二 二._t  対応エロゲを立ち上げてペニスを挿入するだけで
      Y__,rYニニ -- ‐─ ──‐‐─`ー─‐-- 、画面のキャラクターが喘ぐんだよぉ♪
  ,..‐Kノ,h;;::.,-rェ;ェエf7fv!Tl TiTit.、--':::::::::ノ キミの腰の動きに合わせて
  (:::::::::l::::ヽ.|l.|/,|l.1,!H、ト|`  H┼I、l|l |l ト.-‐ ''´ わたしたちがアニメーションするの。
  `,ニl:::::::::レl/!|lイh_ l|`` ,イrマ,イ| |l |レノ     とっても素敵なアイテムでしょっ☆
  く /|:::::::::レl.ィ!ll.l. ー‐'   , kノハト,イレ:::::l
 / / !:::::::::|1l_l.|l.|ゝ"" (.ア  ,仆!|::´:::::::|   ゆっくり動かすと・・・じわじわと感じて、
└t. l l:::::::::N'::: N´ヽ`,,ーr t1リ::レ::::::::::: !   はげしく動かすと・・・失神とかもするんだよ☆
  `ー弋:::::::`:::::::::ゝ ニァ@'ノ::、:::::::::::::::: ノ
     `ー、::::::: /:::::::,イ !ト`ヽ::ヽ:::::, ‐'´  わたしたちとバーチャルで繋がるから
        `ー1::::::└Ll_rー'::::::〉´    もう、即射精しちゃうよねっ☆

 でも・・・USBオナホールは、まだ実現していないの・・・。
 はやくみんなとエッチなことしたいなぁ・・・。
 USBオナホールを実現させて次元を超えたSEXをしましょうねっ☆
 入会方法はとっても簡単。毎週1回どこかのスレに↑をコピペするだけでいいヨ♪
382デフォルトの名無しさん:2007/04/05(木) 09:23:54
Intel Visual Fortran9.1を使っています.
Fortran90形式でプログラムを書いており,
マトリックスを表示させたいのですが,これに関して質問があります.

現在,2次元配列に格納されたマトリックスを表示するために,

integer         ::  i,j,N
integer,allocatable  ::  A(:,:)
〜〜〜
N=10
allocate(A(1:N,1:N))
A = 123
do i=1,N,1
 write(6,'(100I3)') (A(i,j),j=1,N,1)
enddo

という風にしています.
つまり,横に並べて表示するformatとして 100I3 という風に反復回数を十分大きくとって
対応しています.
この反復回数100の部分を変数にしたいのですが不可能なのでしょうか?
383デフォルトの名無しさん:2007/04/05(木) 17:45:17
>>382
文字型変数で書式を作って渡す。
character(len=20) :: fmt
...
write(fmt, "('(', I5, 'I3)')") N
do i=1,N,1
write(6, fmt) (A(i,j), j=1,N,1)
end do

または、Visual Fortran限定で良ければ書式中の <> 内に整数式を書き込む。
do i=1,N,1
write(6, '(<N>I3)') (A(i,j), j=1,N,1)
end do
384デフォルトの名無しさん:2007/04/05(木) 23:17:58
>>382
これは実はFAQ。このスレでもすでに何回も出てきている。

教科書も少しはこういう事を書けw
385382:2007/04/06(金) 06:49:35
>>383
ありがとうございます.
助かりました.
386デフォルトの名無しさん:2007/04/09(月) 07:37:06
式の前に入れる空白の数によってコンパイルエラーが出たりでなかったりするのですが、
これはどのように決まっているのでしょうか?
387デフォルトの名無しさん:2007/04/09(月) 08:30:56
>>386
ソースやエラーメッセージも貼らずに(ry

空白を追加したら1行が73桁以上になった、に10エスパー
388デフォルトの名無しさん:2007/04/09(月) 10:26:38
73行以上っていつの時代のコンパイラだよw
389デフォルトの名無しさん:2007/04/09(月) 20:02:39
gfortran やIntel Fortran 9.1 でも固定形式ではしっかり73桁目以降を無視してくれますよ。
390デフォルトの名無しさん:2007/04/09(月) 23:45:40
>>388-389
そうじゃないぞ諸君。
一般的なコンパイラでは拡張子によって、デフォの挙動が変わる。
拡張子が.fや.forの場合は、固定書式になって72カラムモードとなる。
.f90などの場合は自由書式になる。

あと、ワークステーションなどでは、よく同じコンパイラが、コマンドとしてf77とf90呼び出される設定に
なっていて、デフォの挙動を変えて作動する。この場合も、固定書式と自由書式にそれぞれなっている。


まぁFORTRANを使うなら固定書式の爽やかさを味わってみるのもいいだろう。
391デフォルトの名無しさん:2007/04/13(金) 19:22:44
n(nx,ny)
という配列をバイナリ形式で
write(8)n
という風に書き出した場合、格納順序はどのようになるのでしょうか?
n(1,1),n(1,2)....
でしょうかそれとも
n(1,1),n(2,1)....
あるいは処理系に依存なのでしょうか?
392デフォルトの名無しさん:2007/04/13(金) 19:30:32
>>391
n(1,1),n(2,1)....
ただし格納されたデータ形式は処理系依存
393デフォルトの名無しさん:2007/04/14(土) 00:40:47
>>391
FORTRANでは規格でn(1,1),n(2,1)....の順にメモリー上に入っている。
さすがにこれは教科書にも書いてある。

というか、これを知らないと整合配列がらみでF77などでは実用的なサブルーチンとか書けない。
またライブラリを呼ぶにしても引数の意味が理解できないだろう。

まぁマニュアル嫁。
394デフォルトの名無しさん:2007/04/17(火) 05:11:11
合同乗積法による乱数生成プログラムを作成しなければならないのですが
どこか参考になるページなどはありませんでしょうか。
かれこれ2、3時間探しているのですが見つかりません。
395デフォルトの名無しさん:2007/04/17(火) 16:42:15
配列の初期化について質問があります.

以下のプログラム (Fortran90です) のように,
変数宣言部で初期化すると,data文が効かずににMatrixの要素がすべて0になってしまいます.
もちろん変数宣言部を

integer :: Matrix(1:3)

に書き換えるとMatrixの要素はそれぞれ 1, 2, 3 と入ってくれます.

これは一体どういうことなんでしょうか?
最適化を外しても同じです・・
頭が変になりそうです.

!---プログラム-----
program MATRIX_TEST
implicit none
integer :: Matrix(1:3) = 0
data Matrix/1,2,3/
write(6,*) Matrix
end program MATRIX_TEST
396395:2007/04/17(火) 17:09:51
色々やった結果,以下のようにしたら期待通りになりました.
変数宣言部で初期化するとsave属性が付くという仕様に気づきませんでした.
data文はsave属性の変数に値を入れることができない(?).
何がなにやら・・

もうdata文を使うのはやめます.

!---プログラム-----
program MATRIX_TEST
implicit none
integer :: Matrix(1:3) = 0
!data Matrix/1,2,3/ ←やめて,下のようにした.
Matrix = (/1,2,3/)
write(6,*) Matrix
end program MATRIX_TEST
397デフォルトの名無しさん:2007/04/17(火) 17:48:06
そういえばfortran90ではdata文を使うのはやめましょうっていう記述結構見かけるんだけど、
多次元配列にデータ入れたい場合どうやってます?

たとえば2×2のマトリックスを3個用意する場合。
1次元目がマトリックスを区別し、2次元目が行、3次元目が列を表すものとして、

integer :: A(1:3,1:2,1:2)
data A(1,:,:) /1,2,3,4/
data A(2,:,:) /5,6,7,8/
data A(3,:,:) /9,10,11,12/

に相当するコードをdata文なしでどうやって書きます?
>>396みたく

A(1,:,:) = (/1,2,3,4/)

と書ければいいんだけど、これはコンパイルエラーになる…

変数宣言部で一気に

integer :: A(1:3,1:2,1:2) = (/1,2,3,4,5,6,7,8,9,10,11,12/)

ってやるしかない??
これだと目的の要素に値入れるのにメモリ上の並びを考えないと
いけないので4次元5次元となると、きついっす。
398デフォルトの名無しさん:2007/04/17(火) 23:51:49
>>394
合同乗積法による乱数 でググルとトップにFortranのプログラムが出てくるぞ!
しょんべんで顔洗って出直して来い!

>>395-397
DATA文は実行文ではなく初期化文だ。
F90では初期化が直接出来るので、わざわざDATA文を使う理由がない。

宣言文での初期化とDATA文での初期化のどちらが優先されるのかは、規格書を見ないと分からんが
そんな使い方は想定していないので、たぶんメーカーの実装に依存していると思われる。

A(1,:,:) = (/1,2,3,4/) がうまく行かないのは、次元があっていないから。
RESHAPE関数を使って次元をあわせればおk。これはよく教科書にも載っているので調べそ。
399デフォルトの名無しさん:2007/04/18(水) 02:24:37
二項分布のプログラムについてなのですが(硬貨の表裏)、表を0、裏を1とした場合
それぞれが1/2の確率で現す書き方がわかりません。
超初心者ですみません。
400397:2007/04/18(水) 06:26:52
>>398
サンクス!
調べてくるお
401デフォルトの名無しさん:2007/04/18(水) 07:00:39
すいません、質問させてください。
コンパイル時どうしても
/opt/intel/fc/9.0/lib/for_main.o(.text+0x41): In function `main':
: undefined reference to `MAIN__'
と出てしまうのですが、これはどういう事なのでしょうか。
402デフォルトの名無しさん:2007/04/18(水) 09:56:11
>>399
0以上1未満を返す乱数のサブルーチンは用意してあるとする。
このとき0以上0.5未満だったら表、0.5以上1未満だったら裏とすればよい。

>>401
確認していないので想像で書くw
メインルーチンが無いだけじゃない?プログラム文が無いとか。
昔のHITACのFORTRANだと、サブルーチン名をMAINにすると、
それをスタートアップルーチンと勘違いしていきなりそこから実行が始まるウンコ仕様だったがw
403399:2007/04/18(水) 14:43:32
なるほど。。
やってみます。ありがとうございました。
404デフォルトの名無しさん:2007/04/19(木) 16:08:05
NaNを検出するような関数ないですか・・
405デフォルトの名無しさん:2007/04/19(木) 16:16:14
すみません自己解決しました
isnan(real)でした
406デフォルトの名無しさん:2007/04/19(木) 22:32:46
>>404-405
IEEEのフラグがらみの関数はFortran2003で導入される予定なので、それはコンパイラ独自の拡張。
コンパイラの種類などを書かないと、誰も答えられないし、何の情報にもならん。
おまんこ。
407デフォルトの名無しさん:2007/04/22(日) 13:18:38
g77はFortran90の機能も内包しているのですか?
408デフォルトの名無しさん:2007/04/22(日) 14:44:17
YES
おまんこ。
409デフォルトの名無しさん:2007/04/22(日) 16:08:24
>>407
ちょっとだけだけどな。
410デフォルトの名無しさん:2007/04/23(月) 14:23:26
実行時間を計ろうと思って色々検索したら,dtimeというサブルーチンが
用意されていると知り,使ってみたのですが,よくわからないエラーが発生してしまいました.

>>410のプログラムをコンパイル&実行すると,なぜか出力がNaNになってしまいます.

call dtimeを削除すると期待した値が出るのですが,なんでこんなことになるのかわかりません…
どなたか助けて下さい (´;ω;`)
ただdtimeがfortran標準でないという記述も見かけたので,使わない方がいいのでしょうか…

コンパイラはIntel Visual Fortran 9.1で,コマンドは f90 /check:all /Od test.f90 でした.
411410:2007/04/23(月) 14:24:32
すみません>>410ではなくて>>411です orz

!-- test.f90--
program test
implicit none
real(8) :: x,y
call SUB
x = 11.d0
y = Func(X)
write(6,*) y

contains
subroutine SUB
implicit none
real tarray(2),result
call dtime(tarray,result)
call dtime(tarray,result)
return
end subroutine SUB

complex(8) function Func(x)
implicit none
complex(8),parameter :: IU=(0.d0,1.d0)
real(8),intent(in) :: x
Func = exp(IU*x)/sqrt(2.d0)
return
end function Func
end program test
412デフォルトの名無しさん:2007/04/23(月) 14:56:37
>>410
Intel Visual Fortranの DTIME は引数が1つの関数だ。サブルーチンじゃない。
SUB の先頭に USE IFPORT をつければちゃんとコンパイル時にチェックしてエラーを出してくれる。
413410:2007/04/23(月) 16:33:19
>>412
アッー!たしかにそうです!
ライブラリ・リファレンスに書いてました・・・・・
ありがとうございました!
414デフォルトの名無しさん:2007/04/24(火) 15:35:00
(1) 2×2の行列A,B の要素を入力し,A+B とAB およびA−1 計算する部分をそれぞれサブル
ーチンとするプログラムを作成せよ.
415デフォルトの名無しさん:2007/04/24(火) 15:40:12
A-1ってA-I(もしくはE)のことか?
416デフォルトの名無しさん:2007/04/24(火) 15:41:13
ああ、逆行列のことか。スマン。
4171/2:2007/04/24(火) 18:53:50
>>414
program main
use la_precision, only: WP => DP
implicit none
integer, parameter :: N = 2
real(WP), dimension(N,N) :: A, B, C, D, E
print *, "input A:"
call sub_read(A)
print *, "input B:"
call sub_read(B)
call sub_add(A, B, C)
print *, "A + B ="
call sub_write(C)
call sub_mul(A, B, D)
print *, "AB ="
call sub_write(D)
call sub_inv(A, E)
print *, "inv(A) ="
call sub_write(E)
4182/2:2007/04/24(火) 18:55:08
contains
subroutine sub_read(X)
real(WP), intent(out) :: X(N,N)
integer :: i, j
do i = 1, n; read *, (X(i,j), j=1,N); end do
end subroutine sub_read
subroutine sub_write(X)
real(WP), intent(in) :: X(N,N)
integer :: i, j
do i = 1, n; print *, (X(i,j), j=1,N); end do
end subroutine sub_write
subroutine sub_add(X, Y, Z)
real(WP), intent(in) :: X(N,N), Y(N,N)
real(WP), intent(out) :: Z(N,N)
Z = X + Y
end subroutine sub_add
subroutine sub_mul(X, Y, Z)
real(WP), intent(in) :: X(N,N), Y(N,N)
real(WP), intent(out) :: Z(N,N)
Z = matmul(X, Y)
end subroutine sub_mul
subroutine sub_inv(X, Y)
use f95_lapack, only: la_getrf, la_getri
real(WP), intent(in) :: X(N,N)
real(WP), intent(inout) :: Y(N,N)
integer :: ipiv(N)
Y = X
call la_getrf(Y, ipiv)
call la_getri(Y, ipiv)
end subroutine sub_inv
end program main
419デフォルトの名無しさん:2007/04/25(水) 00:54:13
>>417-418
正直なところ、たかがこれしきの行列演算をサブルーチンにする意味が分からん。

おまけに逆行列はLAPACK使ってるし。2*2限定なら高校で習う公式で十分だろ。

すべてがjokeなのかもしれないが
420デフォルトの名無しさん:2007/04/25(水) 02:18:40
宿題か何かなんじゃないか?
っていうか超初心者用スレなんだから
サブルーチンにする意味なんか問うな。
Hello worldなんか意味がないとか言っているのと同じだ。
421デフォルトの名無しさん:2007/04/26(木) 00:00:42
>>421
たぶんFORTRAN77での宿題なんでね?
Fortran90では意味を成さない希ガス。
422デフォルトの名無しさん:2007/04/26(木) 01:12:40
>>421
何その再帰呼び出し的アンカー
423デフォルトの名無しさん:2007/04/26(木) 11:11:20
>>422
f90 へのあてつけ
424デフォルトの名無しさん:2007/04/26(木) 16:35:22
最新のgfortranをvistaにインストールし、コンパイルしようとしたら
ld: cannot find -lgfortranbegin
とエラーが出てコンパイルできません。
XPではインストールして問題なくコンパイルできました。
vistaでは使えないのでしょうか?
425デフォルトの名無しさん:2007/04/26(木) 16:41:49
>>423
f90 は再帰できるじゃん。
F77 へのあてつけなら分かるが。
426デフォルトの名無しさん:2007/04/26(木) 21:09:24
>>424
状況がよくわからんが Program Files 以外の日本語や半角スペースを含まないフォルダにインストールし直せばいいんじゃね?
427424:2007/04/26(木) 22:15:59
>426
それも考えてc直下にインストールし直しても結局同じでした。
vistaだからなのかな・・・誰かvistaで動いてる人は居ないんでしょうか。
g95も同じようにエラーが出て使えませんでした(今手元にvistaマシンが無いのでエラーメッセージ分かりません
FTN95はvistaでも動きました。
428デフォルトの名無しさん:2007/04/26(木) 22:39:47
>>424
まったく分からんが、ローダーのエラーなのでコンパイルは行ってるんでない?
単にメインプログラムがないだけとか?
429424:2007/04/26(木) 22:48:44
>428
XPマシン+gfortranでコンパイル→実行できたソース(非常に簡単なプログラム)をコンパイルしようとしたんですが,
上記のようなエラーが出て何も生成されませんでした。
ソースの指定をしないとno input filesが出るので,インストールもされてるしpathも通ってはいるようですが・・・

とりあえず明日にならないとvistaマシンはさわれないので今はどうしようもないですが,
何か分かる方はアドバイス御願いします。
430デフォルトの名無しさん:2007/04/27(金) 13:22:12
平方根について質問があります.
複素数の範囲で -1 の平方根をとった場合,
精度の関係で +i が出力される場合と -i が出力される場合があります.
つまり,

Z1 = (-1.d0, 1d-10)
Z2 = (-1.d0, -1d-10)

のような時に,

Q1 = sqrt(Z1)
Q2 = sqrt(Z2)

を計算したような場合,Q1=i,Q2=-i となります.皆さんはこのような問題を
どうやって排除していますか?
絶対値で見たとき,ある値以下では0.d0で置き換えるという作業も考えられますが,
出る値のオーダがあらかじめ分かっているときしかできません.

それとも初めからルートをとるような計算を
避けるようなアルゴリズムを考えるのでしょうか?

また,平方根をとることによって精度が半分になってしまう場合が多々ありますが,これも諦めるしか
ないのでしょうか.例えば理論上では0となるべきところで,

R = 1d-10

となっているようなときです.

Rと0.d0とを比べたときの誤差は許容範囲内だとしても,sqrt(R)とsqrt(0.d0)とではかなり違ってきており,
sqrtを計算するたびに誤差が馬鹿にならなくなってきます...

このようなときに行う定石みたいな処理があればアドバイスお願いします.
431デフォルトの名無しさん:2007/04/27(金) 14:54:07
i と -i のどちらかでなければダメなのであれば
その問題において何らかの束縛条件があるはずだから、
それに照らし合わせて符号を決めればいい。

どちらでもいい式になってるのなら気にする必要は無い。

どっちかというと、FORTRAN の問題じゃなくて数学の問題かな。
x^2 = -1 の時 x = ±i なわけだけど、
条件によっては +i か -i のどちらかじゃないといけないが、
どちらでもいい、あるいは両方ないといけない場合もある。
432デフォルトの名無しさん:2007/04/27(金) 23:55:16
>>430
ルートを取ったときに誤差が増えるといっているが、そもそも1^-10のルートが1^-5なのだから
そうなるのは当然のことだ。

そもそも根本的な発想が間違っている。それゆえに対処法が見当違いで、ど壺にはまっている。
>>431のいうことももっともである。

身近な詳しい人に教えを乞うて、正しい発想をしなさい。
433デフォルトの名無しさん:2007/05/03(木) 14:13:58
正の整数nを読み込みr=1,2,...,nに対する
nCr=n!/r!(n-r)!
を計算するプログラムを教えてくださいお願いします。
へたれなもんでスマセン。
434デフォルトの名無しさん:2007/05/03(木) 14:20:30
宿題は自分で(ry
435デフォルトの名無しさん:2007/05/03(木) 14:25:48
nCr = n(n - 1)・ … ・(n-r+1) / r(r-1)・ … ・1
nC(r-1) = n(n - 1)・ … ・(n-r+2) / (r-1)・ … ・1

nCr = nC(r-1) * ? / ?
nC0 = 1

nC(n-r) = nCr

これだけ分かってれば解けるはず。
436斎木君:2007/05/03(木) 15:51:22
>>433
program hoge
implicit none
integer :: n, r
read *, n
do r = 1, n
print *, n, "C", r, "=", nCr(n,r)
end do
contains
recursive function nCr(n, r) result (c)
integer, intent(in) :: n, r
integer :: c
if (n < 0 .or. r < 0 .or. r > n) then
c = 0
else if (n == 0 .or. r == n) then
c = 1
else
c = nCr(n-1, r-1) + nCr(n-1, r)
end if
end function nCr
end program hoge
437デフォルトの名無しさん:2007/05/03(木) 15:59:55
パスカルの三角形ってまた重いものをw
438デフォルトの名無しさん:2007/05/03(木) 20:16:03
>>436
再帰は出来るだけ避けろ!w  情報工学科じゃあるまいしw
439デフォルトの名無しさん:2007/05/03(木) 20:17:43
再帰が問題じゃないだろー。
440デフォルトの名無しさん:2007/05/06(日) 07:37:26
gccをfedora core 5、athlon64環境で使っています。
CのfloatとFortranのrealは同じ精度なのでしょうか?
441デフォルトの名無しさん:2007/05/08(火) 22:04:12
>>440
同じ
442デフォルトの名無しさん:2007/05/09(水) 16:37:45
質問があります。
今大学の研究室でプログラミングをやっているのですが、
みんなでやっても出来ません。
問題は「fl」というファイルに20個の数字がランダムにあって、
その数字を大きい順に並び替えるという問題です。
ちなみに今私が作ったプログラムは
program ex4
implicit real*8(a-h,o-z)
dimension a(100)
do 10 i=1,19
open (10,file='fl.dat')
read(10,*) a(i)
do 20 j=i+1,20
if(a(k).gt.a(j))k=j
20 continue
b=a(i)
a(i)=a(k)
a(k)=b
10 continue
open(11,file='ans.dat')
write(11,*) a(i)
pause
stop
end
です。どこが間違っているのかわかる方がいましたら教えて下さい。
443デフォルトの名無しさん:2007/05/09(水) 17:38:53
>>442
院生にきけ
444デフォルトの名無しさん:2007/05/09(水) 18:39:12
ループの中でファイルを開いてるのが意味分からない。
445デフォルトの名無しさん:2007/05/09(水) 19:04:13
open文とread文をループの外にやっても正解のファイルが出てきませんでした。
心優しい人の返信待ってます。ほんとに困っているのでよろしくお願いします。
446デフォルトの名無しさん:2007/05/09(水) 19:05:54
あと今の状態の文は以下のとおりです。
program ex4
implicit real*8(a-h,o-z)
dimension a(100)
open (10,file='fl.dat')
read(10,*) a(i)
do 10 i=1,19
k=i
do 20 j=i+1,20
if(a(k).gt.a(j))k=j
20 continue
b=a(i)
a(i)=a(k)
a(k)=b
10 continue
open(11,file='ans.dat')
write(11,*) a
pause
stop
end
447デフォルトの名無しさん:2007/05/09(水) 19:08:11
ファイルの中身も貼らないようでは困る。
あと、プログラムは間違いすぎていてどう指摘していいのか分からん。
448デフォルトの名無しさん:2007/05/09(水) 20:00:58
アドバイスしたいけれど、院生がだした課題でしょ?
これから研究する上でプログラミングが必要なのだから、
できるだけ努力しようよ。
 # 気むずかしい院生に相談するというのも努力の一つ。

一年生なら、初心者救済のために教えたいけど、
四年生なら、今がんばらないと年末に泣くだけだよ。

課題ができなくて院生に怒られるのも、必要な経験のうちだよ。
また、自分達の理解度を正しく伝えるということも、
恥ずかしいけれど必要な作業。
449デフォルトの名無しさん:2007/05/09(水) 20:02:50
ファイルの中身はこのような感じです。
21.0
54.0
32.0
68.0
64.0
10.0
22.0
98.0
65.0
84.0
81.0
39.0
93.0
74.0
55.0
11.0
71.0
97.0
19.0
50.0
そんなに間違えてるんですか?
よろしかったらプログラムを書いていただいてもよろしいでしょうか?
450デフォルトの名無しさん:2007/05/09(水) 20:13:44
書くわけないじゃん。
451デフォルトの名無しさん:2007/05/09(水) 20:27:59
program ex4
i = system('cat fl.dat | sort -n > ans.dat')
end
452デフォルトの名無しさん:2007/05/09(水) 21:34:27
>>442
とりあえず,

read(10,*) a(i)

の下に

do 999 i=1,20,1
write(6,*) a(i)
999 continue

等と追加し,配列aに入っている値を調べよ.
致命的な間違いに気付くであろう.
453デフォルトの名無しさん:2007/05/09(水) 21:36:09
アンカーミスった>>446ね.
454デフォルトの名無しさん :2007/05/09(水) 21:48:46
フィボナッチ数列 a0=0、a1=1、a(i+1)=ai+a(i-1) (i=2,3,…)
を計算するプログラムを作成せよ。なお計算は例はa(i+1)=20まででよい。
条件1:得られた値が奇数であるならば、数値の右に*をつけ、奇数かつ3の倍数ならば、数値の右に**を付けて出力すること。

どなたかわかる方いませんか?
プログラムお願いします(>_<)
455デフォルトの名無しさん:2007/05/09(水) 21:59:56
宿題は自分でやれ
456デフォルトの名無しさん:2007/05/09(水) 23:26:22
研究室の本棚に回答あるぞ。

F77か知らないが、解説書やプログラムの本にも書いてるぞ。
「並び替え」で調べろ。それの英単語で出てくるだろうけど
敢えて書かない。

>>452
ゴミが入って、そのゴミが正解の場合もあるので
read(10,*) a(i)
の前に
a(i)=-1.0
とかを入れた方が良いかな?

>>446
今の段階で効率良いプログラムを書こうとするな。
とにかく動くプログラムを書け。

b=a(i)
a(i)=a(k)
a(k)=b
が、どういう時に作用させたいか、今現在はどのように動いているか
調べろ。
457デフォルトの名無しさん:2007/05/09(水) 23:35:43
>>456
いや・・・そもそも i に値が入る前にiを使っているのと、
このread文一個では、ファイルからのデータの読み出しがまず失敗している。

てか間違いが多すぎてアドバイスしにくいんだなそもそも。


>>446
まずデータを配列に格納することをちゃんと成功させてから、
ひとつひとつ問題をクリアしていくことをお勧めする。

458デフォルトの名無しさん:2007/05/09(水) 23:41:30
間違い多すぎるわけではないか。
1か所修正して2行追加するだけでとりあえず答えは出るところまで来てるんだな。
459デフォルトの名無しさん:2007/05/09(水) 23:45:49
>>467
あれ?
>>442では、ループ回してる中にread文あったけど....

ループ不足は分かってたけど書くと、致命的なことが安直に分かるので
-1.0を入れろってしたんだ。

この人致命的に、理解してないね。
今の文でread(10,*) a(i)の後ろでループ回すの教えると、もっと根本的にミス
するだろうし。
460デフォルトの名無しさん:2007/05/09(水) 23:50:27
あ、上の
>>467
>>457です。
orz
461デフォルトの名無しさん:2007/05/09(水) 23:51:33
fortranでwebの結果を得ることできますか?

get http://www.hoge.com
を行い
結果をファイルに残す

あるいは、戻り値 304( not found )
かどうかの判定とか。
Linux *g77
です
462デフォルトの名無しさん:2007/05/09(水) 23:54:08

>>451
sortのスイッチは-rを追加しないといけないんじゃね?
なんか大きい順って言ってるし.

でもこの3行で「できました〜」って言ったらどう思われるかね.
463デフォルトの名無しさん:2007/05/09(水) 23:57:25
固有値解析もサブルーチン呼ぶだけだから良いんじゃね?
なわけねーだろ。
464デフォルトの名無しさん:2007/05/10(木) 00:00:14
>>461
system 関数で wget を呼べば
465デフォルトの名無しさん:2007/05/10(木) 00:05:46
>>464
なるほど、getは出来ますね。純粋なfortranでは無いですが贅沢は言えません。

戻り値が200(存在する)場合はファイルに書き
304であれば、書かないようにすれば良さそうですが
戻り値を得る方法ありますか?
466デフォルトの名無しさん:2007/05/10(木) 00:19:08
>>465
wget の出力をファイルにリダイレクトしておいて、それを解析するとか。
467デフォルトの名無しさん:2007/05/10(木) 00:19:51
>>465
ああ、あと、当然成功すれば 0 が、失敗すれば非 0 が返ってくるはずだから、
それで成功か失敗かは分かる。
エラーの種類は出力を解析する必要あり。
468デフォルトの名無しさん:2007/05/10(木) 00:22:57
>>466
ああ、そうか。
wcなりで、有るときにファイル作業すれば良いね。
でも、permission や loginの時にどう対処すれば良いのか?
ともかく、一応の道筋は付いた。

ありがとう。

戻り値を得る方法をご存知の方、いらっしゃったら、よろしくです。
469デフォルトの名無しさん:2007/05/10(木) 00:24:48
問題は fortran で実装する必要性だな。
何らかのスクリプトでいい気がする。
470デフォルトの名無しさん:2007/05/10(木) 00:28:00
fortranかVBい外のbasicでなら、思うことが自在にできます。
文字列や数値をくっ付けたりとか、あと解析に便利なんです。

つーのが、fortranでする理由です。
471デフォルトの名無しさん:2007/05/10(木) 00:31:09
そこら辺は perl とか ruby とかの方が得意な気が。
まあ、言語を覚える手間がかかるというのなら仕方がないけど、
bash あたりでもいいという気はする。
ま、いいけどね。
4721/3:2007/05/10(木) 12:20:10
>>461
Windows+VisualFortranの場合だが、参考例。

オプション:Linker->Input->additinal dependency   WinInet.lib

PROGRAM tashiro
USE ifwina
IMPLICIT NONE
INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PRECONFIG = 0 ! // use registry configuration
INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_DIRECT = 1 ! // direct to net
INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PROXY = 3 ! // via named proxy
INTEGER, PARAMETER :: INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY = 4 ! // prevent using java/script/INS
!
4732/3:2007/05/10(木) 12:21:00
INTERFACE
INTEGER (HANDLE) FUNCTION InternetOpen(arg1, arg2, arg3, arg4, arg5)
USE ifwinty
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetOpenA' :: InternetOpen
INTEGER (LPLONG) :: arg1
INTEGER (DWORD) :: arg2
INTEGER (LPLONG) :: arg3
INTEGER (LPLONG) :: arg4
INTEGER (DWORD) :: arg5
END FUNCTION
!
INTEGER (HANDLE) FUNCTION InternetOpenUrl(arg1, arg2, arg3, arg4, arg5, arg6)
USE ifwinty
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetOpenUrlA' :: InternetOpenUrl
INTEGER (HANDLE) :: arg1
INTEGER (LPLONG) :: arg2
INTEGER (LPLONG) :: arg3
INTEGER (DWORD) :: arg4
INTEGER (DWORD) :: arg5
INTEGER (DWORD) :: arg6
END FUNCTION
!
INTEGER (BOOL) FUNCTION InternetReadFile(arg1, arg2, arg3, arg4)
USE ifwinty
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetReadFile' :: InternetReadFile
INTEGER (HANDLE) :: arg1
INTEGER (LPVOID) :: arg2
INTEGER (DWORD) :: arg3
INTEGER (LPDWORD) :: arg4
END FUNCTION
4743/4 ごめwwwはみだしたw:2007/05/10(木) 12:22:09
!
INTEGER (BOOL) FUNCTION InternetCloseHandle(arg1)
USE ifwinty
!DEC$ ATTRIBUTES DEFAULT, STDCALL, DECORATE, ALIAS:'InternetCloseHandle' :: InternetCloseHandle
INTEGER (HANDLE) :: arg1
END FUNCTION
END INTERFACE

INTEGER (HANDLE) :: hInt, hUrl
INTEGER (BOOL) :: iret
INTEGER (DWORD) :: dwret, dwtot
CHARACTER (LEN = 80) :: agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'//CHAR(0)
CHARACTER (LEN = 256) :: strurl, buff
CHARACTER (LEN = 256), ALLOCATABLE :: srctext(:)
INTEGER :: i
hInt = InternetOpen(LOC(agent), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0)
IF (hInt == 0) PRINT *, 'Open error'
strurl = 'http://www.yahoo.co.jp'C
hUrl = InternetOpenUrl(hInt, LOC(strurl), NULL, -1, 0, 0)
dwtot = 0
ALLOCATE(srctext(1000))
OPEN(9, FORM ='binary')
DO i = 1, 1000
iret = InternetReadFile(hUrl, LOC(buff), LEN(buff), LOC(dwret))
IF (dwret == 0) EXIT
dwtot = dwtot + dwret
WRITE(9) buff(1:dwret)
srctext(i) = buff(1:dwret)
IF (i == 1000) STOP 'buffer overflow '
END DO
4754/4 ごめwwwはみだしたw:2007/05/10(木) 12:24:10
print *, srctext(1:i - 1), srctext(i)(1:dwret)
print *, dwtot, 'bytes'
iret = InternetCloseHandle(hUrl)
iret = InternetCloseHandle(hInt)
STOP
END PROGRAM tashiro


面倒なのはWinInet用のインターフェースが用意されていないので、自分でC用のヘッダーファイルを見て、
作ってやらないといけないことか。 
476デフォルトの名無しさん:2007/05/11(金) 02:48:37
若者を呼び寄せるために
Fortranでエロゲでも作らないか?
477461:2007/05/11(金) 23:51:07
>>472
おお、出来るんですね。f77では、ないけど読めます。
ありがとう。
数値解析程度にC/C++やるので、なんとかできると思います。
478デフォルトの名無しさん:2007/05/12(土) 00:23:20
このプログラム…Nを11以上にすると動かなくなってしまいます…
どうしてでしょうか?
ちなみに、コンパイラはsalfordのPlato3を使っています。

program main
integer:: N,k
integer, allocatable:: F(:,:),A(:,:)
real:: eps,epsp1
real, allocatable:: x(:),y(:),b(:,:),r(:,:)
real, parameter:: rad=3.1415926/180
print*, "please entry the N."
read*, N
allocate(F(1,1:N**2),A(1:N**4,1:N**4),x(1:N),y(1:N),b(1:N,1:N),r(1,N**2))
A=0
print*, " "
do i=1,N**2
  A(i,i)=4
  A(i+3,i)=-1
  A(i,i+3)=-1
end do
do i=2,N**2,3
  A(i-1,i)=-1
  A(i,i-1)=-1
  A(i+1,i)=-1
  A(i,i+1)=-1
end do
do i=1,N**2
  print "(10I5)",(A(i,j),j=1,N**2)
end do

!A
479デフォルトの名無しさん:2007/05/12(土) 00:24:23
do i=1,N
  x(i)=i*(N+1)
  y(i)=i*(N+1)
end do
do i=1,N
  do j=1,N
    b(i,j)=13*(rad**2)*sin(3*rad*x(i))*sin(2*rad*y(j))*((1/N+1)**2)
  end do
end do
print*, " "
!b
do k=1,N
  do i=k+1,N
    do j=k+1,N
      A(i,j)=A(i,j)-A(k,j)*A(k,j)/A(k,k)
    end do
    b(i,i)=b(i,i)-b(k,k)*A(i,k)/A(k,k)
  end do
end do
do k=N, 1, -1
  do j=k+1, N
    b(k,k)=b(k,k)-A(k,j)*b(j,j)
  end do
  b(k,k)=b(k,k)/A(k,k)
end do
print*, b
print*, " "
!gauss
480478-479:2007/05/12(土) 00:40:34
エラーメッセージは

Access Violation
the instruction at address 036238f0 attempted to write to location 00000000

 036238b4 __ALLOCATE_U [+003c]
 036ef495 get_non_checked_memory(int)#8F [+001a]
 036ef4db get_heap_block(int)#8F [+0056]
 036ef6ea __PALLOCATE2 [+008b]
 main -  in file freeformat1.f95 at line 11 [+0299]

です。
481デフォルトの名無しさん:2007/05/12(土) 01:00:50
>>478
メモリーがアロケートできなかったんじゃないかな?

11**4〜10^4
A(1:N**4,1:N**4)だから、必要とされるメモリーは、4*10^4*10^4<10^9Byte〜1Gbyte
482478:2007/05/12(土) 01:28:11
メモリが足りないと言うことは、私のPCが原因なんですね・・・
なんとか改善策はありませんでしょうか?
483デフォルトの名無しさん:2007/05/12(土) 02:24:01
>>476
正直もう Fortran は消えて欲しいのでやめてください。
484478:2007/05/12(土) 02:42:35
N=2において、
b(1)=x(1)y(1)
b(2)=x(2)y(1)
b(3)=x(1)y(2)
b(4)=x(2)y(2)

N=3において、
b(1)=x(1)y(1)
b(2)=x(2)y(1)
b(3)=x(3)y(1)
b(4)=x(1)y(2)
b(5)=x(2)y(2)
b(6)=x(3)y(2)
b(7)=x(1)y(3)
b(8)=x(2)y(3)
b(9)=x(3)y(3)

ってな感じに配列を格納したいのですが、下のプログラムでは
例えばN=2の場合、
b(1)、b(2)、b(3)、b(4)全ての配列にx(2)y(2)のときの値が格納されてしまいました…。
どうしてでしょうか?

do k=1,N**2
 do i=1,N
  do j=1,N
    b(k)=13*rad**2*sin(3*rad*x(i))*sin(2*rad*y(j))*(1/N+1)**2
  end do
 end do
end do

485デフォルトの名無しさん:2007/05/12(土) 03:39:01
>>482
よく見てないので、配列ミスないならメモリを節約するアルゴリズムの
本でも見なさい。

コンパイルオプションで配列ミスチェックできるなら付けてみる。

unix系でunlimitedしてみたら?

>>484
「どうしてでしょうか?」なので原因だけ書く
君がそう書いてるから、そうなる。
上の442か?

k=1の時、iもjも2まで回るから、そうなる。k=2の時も同様。
以下同じ
486デフォルトの名無しさん:2007/05/12(土) 10:53:44
>>476
まずはヌける絵を描くんだ。
話はそれからだ。
487デフォルトの名無しさん:2007/05/12(土) 11:04:10
>>476
DO「ああんっ……CONTINUE君っ……」
細い腰を震わせ、DOは歓喜の牝声をあげた。
奥深く突き刺さった行番号を、DOとIが招き入れるように吸い付いている。
「いいんっ……もっと……もっと下さい……」
好きなCONTINUEの行番号をDOとIの間に入れられることがこんなにも気持ちいいなんて。
CONTINUEの熱い肉体をもっと感じたくて、ついいやらしく激しい突きをせがんでしまう。

こういう感じ?
488デフォルトの名無しさん:2007/05/12(土) 11:24:32
だがEND DOに寝取られる
489デフォルトの名無しさん:2007/05/12(土) 12:46:16
FORTRANのイメージならホモゲーだよな
490デフォルトの名無しさん:2007/05/12(土) 14:28:06
アッー!
491デフォルトの名無しさん:2007/05/12(土) 18:46:17
>>478
A をアロケートしようとしているところが 4GB を超えてしまっているのが原因。
4GB以下になるように分割して扱う必要がある。
492478:2007/05/12(土) 23:04:36
>>485>>491
アドバイスありがとうございます!
なんとか、N=11以上のとき動かなくなるエラーは亡くすことができたのですが、
>>484が未だに解決できないので、こちらの方のアドバイスも
大変恐縮ですが、アドバイスをよろしくお願いします。
493デフォルトの名無しさん:2007/05/12(土) 23:41:22
>>492
紙と鉛筆を用意して、N=2の時 >>484のプログラムがどんな動きをするのか
1ステップずつ k, i, j, b の値を紙の上に書き出して確認してみましょう。
494デフォルトの名無しさん:2007/05/13(日) 13:46:47
>>492
i と j を k から作り出すように書き換えるのがたぶん簡単。
495デフォルトの名無しさん:2007/05/13(日) 15:36:15
FORTRANを盛り上げていこうぜ!
496デフォルトの名無しさん:2007/05/13(日) 15:54:24
お断りします
497デフォルトの名無しさん:2007/05/13(日) 21:33:57
そう言われると、かえって>>496の菊穴にCOMMON文を無理やり押し込んでやりたいw うふふ

498デフォルトの名無しさん:2007/05/15(火) 03:32:54
最近フリーのGfortranを使い始めたんですが
サブルーチンの使い方がわかりません・・・.
LAPACKを使いたいんですけど,プログラムの始めに何か書くのでしょうか?
いきなりcall文で呼び出せないでしょうし.

ちなみに,windowsのコマンドプロンプトでコンパイルしています.
fortran初心者なものですいません・・・
499デフォルトの名無しさん:2007/05/15(火) 06:27:29
>>498
本を読まずに1から全部聞いて済ませようとしているのか?
500デフォルトの名無しさん:2007/05/15(火) 09:36:20
>>498
ヘッダファイル(インクルードファイル)がないのかというようなことを聞いているのでしょうが
ないんじゃないかな。
リンクするのを忘れなければいきなりcall できると思う。
f90(f95)なら use lapack_f95 みたいなモジュールの読み込みだけはいると思う。
501デフォルトの名無しさん:2007/05/15(火) 10:08:38
Fortran IVの方でも聞いていたのですが、返事がなかったのでこちらでも
質問させてください。

C(Not C++ / MSVC)で作られたライブラリの関数が使用したいのです。
そいつは STDCALL で作られていて、大文字小文字が混在しているものもあります。

それをg95またはgFortran もしくは g77 で呼び出したいと思っています。
_cdecl で 小文字なら呼び出せるのですが 呼び出し規約と関数名の両方について
対処方があるならば知りたいと思っています。
502デフォルトの名無しさん:2007/05/15(火) 10:10:22
ラッパ関数を C で作るとか。
503デフォルトの名無しさん:2007/05/15(火) 10:34:59
素早いお返事ありがとうございます。
やはりそれが普通でしょうか。
関数がわりかし多めな+ IVF から呼べるインターフェース類はあるので
再利用ができるとうれしいなという感じなのですが。
504デフォルトの名無しさん:2007/05/15(火) 10:44:55
ラッパ関数生成スクリプトでも書くとか。
505デフォルトの名無しさん:2007/05/15(火) 10:50:49
>>504
ですね。
あきらめて、書き始めておりました。
506デフォルトの名無しさん:2007/05/15(火) 23:16:00
すいません。学校でFORTRANを習っているのですが、
解けない問題があるのでよろしくお願いします。


問:三角形の底辺A、高さHを入力し、
面積を求めて印刷するプログラムを作りなさい。
と、いう問題なのですが、TeraPadで
C toi
read(5,*)A
read(5,*)H
S=A*H/2
write(6,*)'TATE=',A
write(6,*)'YOKO=',H
write(6,*)'MENSEKI=',S
STOP
END

と、入力しコマンドプロンプトで
cd fortran
g77 -o ファイル名 ファイル名.forとして、
エンターを押すと、エラーメッセージは発生せず、
その後、ファイル名→エンターをすると、
いつも出ている FORTRAN〜が消えます。
計算は出来ませんでした。アドバイスお願いします。
507デフォルトの名無しさん:2007/05/15(火) 23:24:54
>>506
g77 云々 以降の画面に出ている文字を全部コピペして書け。
これだけでは判断のしようも無い。
プログラム自体は間違ってないように見える。
508デフォルトの名無しさん:2007/05/16(水) 02:42:00
DO文を用いて整数NからM(N<M)までに存在する3の倍数の和を求める
プログラムを作成したいのですが、うまい方法がわかりません。よければ実行例を教えてください。

自分なりに考えたのですが、この数列の初項と個数が分かれば解けそうなのですが、
Nに最も近くてN以上の3の倍数が初項というのを、
IF(MOD(N+1,3).eq.0)THEN
初項=N+1
のようにするとNとN+2の時の場合分けをしなければならないし、個数に至っては、
末項/3-初項/3+1で出そうとすると、かなりの数のIFを使わなければならないので
頭がこんがらがってうまく作れませんでした。
509デフォルトの名無しさん:2007/05/16(水) 09:47:21
>>506
実行するとコマンドプロンプトが修了してしまうという意味でしょうか?
だとすると、たぶんマシンが変だと思う。
違うマシンで試せるなら試してみて。
510デフォルトの名無しさん:2007/05/16(水) 09:51:44
SUM=0
DO I=N,M
IF (MOD(I,3) .EQ. 0) THEN
SUM=SUM+I
END IF
END DO
じゃだめ?
511デフォルトの名無しさん:2007/05/16(水) 11:25:21
>>510
上手くいきました。
DO文の中にIF文入れて簡単に表せるんですね。とても勉強になりました。
ご教授ありがとうございました。
512デフォルトの名無しさん:2007/05/19(土) 23:08:05
FORTRAN77です。
一様乱数を10個ずつ発生させ、その平均を計算する。
これをn回繰り返す。
計算した平均値をnが1千回、1万回、10万回、100万回についてそれぞれ分布を求めよ。
という問題が分かりません。
乱数の発生は調べたら[0,1)区間の一様乱数が
   real function unifrd(i)
   integer l,c,t30
   real mu
   parameter (l=843314861,c=453816693,t30=2**30,mu=2.0**31)
   i=l*i+c
   if(i.lt.0) i=(i+t30)+t30
   unifrd=real(i)/mu
   end
で出るらしく、これを応用すれば出せそうですが、10個ずつ発生させ、その平均を計算する
プログラムの書き方がよく分かりません。
幼稚な質問ですが、どなたか教えて下さい。
お願いします。
513デフォルトの名無しさん:2007/05/20(日) 01:16:58
C S仮
C SUM合計

S=0
SUM=0
N=10
DO I=1,N
 乱数発生ルーチン(ここで乱数はRとする)
 S=S+R
CONTINUE

SUM=S/N

でNを返れ
514513:2007/05/20(日) 03:36:17
用すませて思い出したけど
変数は
REAL*8
とした方が良いんじゃね?
515513:2007/05/20(日) 03:51:40
あ、これで動くは動くが、変数名とか恥ずかしい

C A平均
C SM合計
REAL*8 A,SUM,R
A=0
SUM=0
N=10
DO I=1,N
 乱数発生ルーチン(ここで乱数はRとする)
 SUM=SUM+R
CONTINUE

A=SUM/N
516デフォルトの名無しさん:2007/05/20(日) 18:22:48
わからないので助けてください;;

整変数I,J,Kをキーボードより与え、下記を実行するプログラムを実行せよ。
x=i^2/4 + j^3/27
y=x/(1+k^2)
z=(yの3乗根)klogk

条件 kあるいはyの値が0以下の場合はzを求める計算ができない、その場合z=(絶対値yの3乗根)(絶対値k)log(絶対値k)
を計算するように条件わけをすること。


IMPLICIT REAL(A-H,O-Z)
DATA I,J,K,X,Y,Z/5,6,1,2,1,6/

x=i**2/4+j**3/27
y=x/(1+k**2)
z=y**(1/3)*k*LOG(k)

WRITE(6,'(4I10)')I,J,K
WRITE(6,'(4F10)')X,Y,Z
WRITE(6,'(2I10,2F10)7)M,L,E,D
STOP
END

この辺までは組んでみたのですがこの後どうすればいいのでしょうか?
すみません、よろしくおねがいします><
517デフォルトの名無しさん:2007/05/20(日) 20:44:18
>>516
>整変数I,J,Kをキーボードより与え、
READ文

>kあるいはyの値が0以下の場合はzを求める計算ができない、その場合z=(絶対値yの3乗根)(絶対値k)log(絶対値k)
>を計算するように条件わけをすること。
IF文
518デフォルトの名無しさん:2007/05/21(月) 14:01:26
>>516
IF文でy=0 または z=0 のところを別にして
それ以外は yとkをabs でくくる。
という風にやるのが期待されているんだろうけど、

y<=0 でも計算できる気がするぞ。問題間違ってない?
519>>506:2007/05/21(月) 16:22:39
>>507さん レスありがとうございます。遅くなって申し訳ないですが、
もう一度やってみました。
>>506
W:\fortran>g77 -o ファイル名 ファイル名.for

W:\fortran>ファイル名、と打ちエンターを押すと、
何も書かれてない下の行にカーソルが移動し、
エンターを押しても同じことで、もう一度ファイル名→エンターでは、
ファイル名
invalid number: Incomprehensible list input
apparent state: unit 5 (unnamed)
last format: list io
lately reading direct formatted external IO

abnormal program termination

とエラー?が出ます。
すいませんがよろしくお願いします。
520デフォルトの名無しさん:2007/05/21(月) 20:22:18
>>519
2回数値を入力してEnterを押すと答えが表示される。
READ文の復習をしましょう。

あと、細かいことだが 'TATE', 'YOKO' と底辺A, 高さHの対応はそれでいいのか?
521デフォルトの名無しさん:2007/05/22(火) 02:13:29
>>520さん、レスありがとうございます。
しかし、>>「2回数値を入力して」と、書かれていますが、
数値とはどこの数値をどこに入力すればよいのでしょうか?
何度もすいません…。

522デフォルトの名無しさん:2007/05/22(火) 02:46:29
>>521
君はいったい何をするプログラムを作っているのかね?
もう一回問題をよく読みなさい。
523デフォルトの名無しさん:2007/05/22(火) 13:12:53
>>522さん
すいません。ようやく分かりました。ありがとうございます。

恥ずかしながら、出力結果が S=AH/2 になるのかと思ってました。

迷惑おかけしました。すいませんでした。
524デフォルトの名無しさん:2007/05/23(水) 16:56:51
すみません、使いたいソフトのソースコードがFortran90で書かれていますが、
コンパイラがありません。
しかもUNIXじゃなくてWindowsXPなんです。Cygwinはあるんですが。
というわけで、Fortran90のWindows用フリーコンパイラなどをご存じでしたら
教えてください。
525デフォルトの名無しさん:2007/05/23(水) 18:01:06
g95 -minGW で決まり。
526sage:2007/05/24(木) 14:59:59
3×3の行列の積を解くプログラムがわかりません><
ちなみにTextファイルから行列を読み込むプログラムです。
どなたかご教授願います。
527デフォルトの名無しさん:2007/05/24(木) 15:11:59
宿題頑張ってね
528デフォルトの名無しさん :2007/05/24(木) 19:38:37
fortranでフィボナッチ数列A0 = 0 , A1 = 1 , Ai+1 = Ai + Ai-1 (i =2,3...)を計算するプログラムを作っています。
得られた値が奇数の時には、数値の右横に*をつけ、奇数かつ3の倍数なら**をつけます。以下のようにプログラムしましたが、*印が偶数時にもついてしまい、また**の付け方にも困っています。どこが、間違っているのか、アドバイス手本よろしくお願いします。
   IMPLICIT REAL (A-H,O-Z)
A0 = 0
A1 = 1
A2 = 1
WRITE(6,*)'A 0 = 0'
WRITE(6,*)'A 1 = 1'
DO 20 L = 2,20,1
A2 = A1 + A0
I = A2-INT(A2/2)*2
J = A2-INT(A2/3)*3
IF(J.NE.O.AND.I.NE.O) THEN
WRITE(6,*) 'A',L,'=',A2,'*'
ELSE IF(J.NE.O.AND.I.EQ.O) THEN
WRITE(6,*) 'A',L,'=',A2,'*'
ELSE
WRITE(6,*) 'A',L,'=',A2
END IF
A0 = A1
A1 = A2
20 CONTINUE
STOP
END
  結果
A 0 = 0   A 1 = 1  A 2= 1.*   A 3= 2.*
A 4= 3.*   A 5= 5.* A 6= 8.*   A 7= 13.*
A 8= 21.*   A 9= 34.* A 10= 55.*   A 11= 89.*
A 12= 144.*   A 13= 233.* A 14= 377.*   A 15= 610.*
A 16= 987.*   A 17= 1597.* A 18= 2584.*   A 19= 4181.*
A 20= 6765.*
529デフォルトの名無しさん:2007/05/24(木) 21:10:22
>>528
・FORTRANにはMODという便利な関数がある。
・「奇数」、「奇数かつ3の倍数」の判定条件が変。
・せっかくIF/ELSE IFで条件分けしているのにWRITE文がまったく同じ。
・プログラムの頭に「IMPLICIT NONE」をつけてみよう。
530デフォルトの名無しさん:2007/05/24(木) 21:13:41
>>528
実数で計算する必要があるのか?
531デフォルトの名無しさん:2007/05/25(金) 07:16:18
>>528
Ai+1 = Ai + Ai-1
を計算するなら、次のように配列を使う方が簡単だと思います。
A(i+1) = A(i) + A(i-1)
532デフォルトの名無しさん:2007/05/25(金) 10:37:01
>>530
絶対にない


>>526
絶対に3x3なら式を9個並べろ
規則性が分かったらループ回せ
さすればkxn ・nxjでも簡単に計算できる
533デフォルトの名無しさん:2007/05/25(金) 10:59:00
>>526
行列の積の定義を線形代数の本で見よ.
定義式をそのまま計算すればよろしい.

3x3が保障されてるなら532の言うように,式を9本かけばよい.
534デフォルトの名無しさん:2007/05/25(金) 13:52:19
テキストファイルから行列を読み込む方法が分らないんじゃないかな。
535532:2007/05/26(土) 00:25:52
open(2) "mat.txt"

C ループ回すなら工夫して回せ

read(2,*) A(I,J)
read(2,*) B(K,L)

C calc statment

どーのこーの

close(2)
stop
end


I,JとK,Lで変えたけど分かってるならB(I,J)でも良い
open文でstatus=oldかunknownが必要なら書け。

つーか、そしたら質問者は何も理解してないな。
536デフォルトの名無しさん:2007/05/26(土) 10:47:59
>>526
c = matmul(a, b)
じゃだめなの?
537デフォルトの名無しさん:2007/05/26(土) 17:02:20
>>536
多分77の課題なんでね?それでいいとすると、あまりにあまり(正笑
538気まぐれアナスイ:2007/05/26(土) 17:41:55
!(Φ_Φ+){???}

Ai+1 = Ai + Ai-1
  ↓↓↓
「全てに一致する」 i『option』 + 1 ≫『代入する』≪ 「全てに一致する」 i『option』 + 「全てに一致する」 i『option』 -1

A(i+1) = A(i) + A(i-1)
  ↓↓↓
「全てに一致する」 (i『option』 + 1) ≫『代入する』≪ 「全てに一致する」 (i『option』) + 「全てに一致する」 (i『option』- 1)
539気まぐれアナスイ:2007/05/26(土) 17:50:49
!(Φ_Φ+){???}

『「全てに一致する」(command) i{option}』 == 『文字列、配列順に一致を優先する + i{option}』
540気まぐれアナスイ:2007/05/26(土) 17:55:32
     〆{この様に?}

   Ж  √ζ
        {Ж}
541デフォルトの名無しさん:2007/06/02(土) 13:14:21
do i=1,10
end do
の場合、このループを抜けた後iの値は11になるのですか?
542デフォルトの名無しさん:2007/06/02(土) 13:50:47
yes
543デフォルトの名無しさん:2007/06/02(土) 20:30:31
大変初歩的なこととは思いますが質問です

x : 1  2  3  4  5 ...
y : -0.1 -0.02 0.03 0.1 0.7 ...

のように,無数のxに対応するyの値を記録させるアルゴリズムがすでにあります.

ここで,yの符号が変わったときの,対応するxを記録する(ここでいうx=3)
命令を組みたいのですが・・・

どうもわかりません.
わかる方いれば教えていただけないでしょうか?
544デフォルトの名無しさん:2007/06/03(日) 00:27:01
>>543
データ量が少ないなら、頭から1こづつ見ていっても対して変わらん。

それが嫌なら、単純なのは二分法。ぐぐればよろし。
545デフォルトの名無しさん:2007/06/03(日) 12:03:57
×づつ
○ずつ
546デフォルトの名無しさん:2007/06/03(日) 17:50:33
>>545
歴史的仮名遣いでは『づつ』の方が正しい。
Fortran使いは、古いほうを好むべし。
547デフォルトの名無しさん:2007/06/03(日) 19:04:51
x-1とxのyを掛けて負ならば記憶させたら良いだけじゃ?
548デフォルトの名無しさん:2007/06/03(日) 23:27:29
グローバル変数みたいなことしたいなら、commonじゃなくモジュール使えって言われますが
commonだとどの変がまずいんですか?正確に複写しないとダメ、という他に
速度などの面でデメリットとかあるんでしょうか?
549デフォルトの名無しさん:2007/06/04(月) 00:41:21
>>548
COMMONは色々厄介なのよ。
メモリーの先頭番地を合わせるだけなので、まったく別の名前で別の並びでも成立する。
サイズが合わなくてもいい。(処理系に依存するが最初に出た大きさになることが多いと思う)

昔はメモリー節約のために、今で言う動的割付のようにプログラマーがCOMMONを
自己責任で様々に再利用した。プログラムの前半と後半で、同じCOMMONブロックを
まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。

そういうプログラムは非常にデバッグが難しい。読まされるほうは地獄。

そういう過去の怨念が溜まっているので、COMMONはとても忌み嫌われているのだ。

単なるGlobal変数として使う分には、その恐ろしさが分からないだろうが、COOMONは
ほとんど無制限のメモリー領域の共有だと理解したほうが適切。

速度的にはむしろ早いんではないかと思ったりもする。
550548:2007/06/04(月) 01:29:46
>>549
>プログラムの前半と後半で、同じCOMMONブロックを
>まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。
昔はそんなことをしてたんですか・・・壮絶ですね

でも逆に考えると、割と単純な科学技術計算とかで、複雑なことはしないが
速度はひたすらに要求されるような場合は、あえてcommonを使ったりするんでしょうか?

今は普通に引数で渡してますが、これ変えたら速くなるかなぁ
551デフォルトの名無しさん:2007/06/04(月) 04:27:52
あらゆるところで変更されうるから、
common に起因するバグがあった場合、
バグのあるとろを探すのが大変、
というのはよく言われるところ。

ただ、common を避ける事で引数がもの凄く多くなるとなると、
それはそれで問題になる事もあったり。
552デフォルトの名無しさん:2007/06/04(月) 11:42:58
>>550
最適化の問題などもあるので、今となってはCOMMONにする利益は無いのではないかと思う。
MODULEで渡しても変わらないのではないかと推測する。

FORTRANは参照渡し、すなわち変数のアドレスしか渡さないので、
変数のコピーを渡す値渡しと違って、それほど引数渡しのオーバーヘッドの問題は少ないと思う。

ただFortran90になってから、配列を受け渡すときに、サイズや次元の情報まで渡すようになったが・・
(FORTRAN77までは配列の先頭要素の番地しか渡さない)。




Fortran90の配列引渡しのとき、x(:)とかx(5:10)などと : 指定子を使って部分配列を渡そうとすると
いまのFortranの実装では、呼び出し前に暗黙のダミー配列にコピーをつくり、それを渡して
戻ってきた結果を再び元の配列にコピーしている。したがってオーバーヘッドが大きくなる。

意味的には同じだが、xを渡す場合とx(:)を渡す場合だと、後者のほうが少し遅くなる。

巨大な配列は部分配列で受け渡さないほうがいい。

553548:2007/06/04(月) 16:11:30
詳しい解説ありがとうございます。勉強になります。

いつまでもFORTRAN77ではさすがに時代遅れになるかも・・・という漠然とした不安から、
上のバージョンへの移行を考えていたのですが、よく検討したほうが良さそうですね。
Fortran95とか新しいやつはオブジェクト指向とかも取り入れてるんでしたっけ。
速度を求めてる人にとっては論外なんでしょうね。。
554デフォルトの名無しさん:2007/06/04(月) 23:15:07
>>553
Fortran95はFORTRAN77を含んでいるので、中途半端に移行してもいいんで内科医。
部分配列の引数受け渡しが遅くなるといっても、よほどのことが無い限り差はでないだろう。

オブジェクト指向はFortran2000からで、Fortran95ならPASCALが半分混じったような感じなので、
80年代とかに教育を受けた人には親しみやすいところがあると思う。

FORTRAN77を長く使った後で、Fortran90/95を使うと、痒いところに手が届くというか、
こんな機能があったらな、と思っていたような機能が色々入っているので、学んで損は無いと思う。
555デフォルトの名無しさん:2007/06/06(水) 00:25:16
IntelのコンパイラがVer10になった?
556デフォルトの名無しさん:2007/06/06(水) 00:55:42
全日空の旧システムはFORTRANで書かれていた!
ttp://itpro.nikkeibp.co.jp/article/JIREI/20070530/273051/

557デフォルトの名無しさん:2007/06/06(水) 00:58:07
うn
レジストレーション・センターに置いてあった。

IntelやXLsoftからはまだアナウンスがないけど、Windows版はなにやら
Microsoft Visual Studio 2005 Premier Partner Edition Included
だそうで。
558デフォルトの名無しさん:2007/06/06(水) 02:57:06
>>557
>Microsoft Visual Studio 2005 Premier Partner Edition Included

kwsk
559デフォルトの名無しさん:2007/06/06(水) 03:41:57
>>558
ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/fwin/278834.htm
VSの簡易版(?)が付いて単体で使えるようになった。

あとPro版にMKLが付くようになった。
560デフォルトの名無しさん:2007/06/06(水) 11:51:28
Product name Full product Support renewal
IntelR Visual Fortran Compiler, Standard Edition, for Windows* $599 $2801
IntelR Visual Fortran Compiler, Professional Edition, for Windows*
Includes IntelR Math Kernel Library $699 $280
IntelR Visual Fortran Compiler, Professional Edition, for Windows* with IMSL*
Includes IntelR Math Kernel Library and IMSL Fortran Library $1,599 $749

1Support renewal qualifies you for upgrade to the Professional Edition

ttp://www.intel.com/cd/software/products/asmo-na/eng/compilers/279613.htm

よく分からんが、いままでのスタンダード版の更新料が$280に値上げになるが、
MKLも付くようになるという事でいいのかな?

561デフォルトの名無しさん:2007/06/06(水) 14:07:06
fortran90って外部コマンド実行できますか?
perlで言うsystem()みたいな

ちなみにlinux環境です
562デフォルトの名無しさん:2007/06/06(水) 14:08:42
何でとりあえずやってみようとしないの?
563デフォルトの名無しさん:2007/06/06(水) 14:22:40
fortranで外部コマンドなんて使えるの?いったいどういう仕組みで・・・
perlとかなら分かるけど
564デフォルトの名無しさん:2007/06/06(水) 15:07:33
なんで使えないと思うのかが理解できない。
565デフォルトの名無しさん:2007/06/06(水) 19:21:03
Fortran77の宿題なんですが・・、下のような行列を絶対値の小さいものから1行目に順に
並べるプログラムをつくれというものなんですが、分かりません。どなたかよろしくお願いします。

‖2.0 1.0 -4.5‖
‖0.0 -0.5 1.1‖
   ↓
‖0.0 -0.5 1.0‖
‖1.1 2.0 -4.5‖
566デフォルトの名無しさん:2007/06/06(水) 19:36:53
>>560
スタンダード版は新規のみでサポート更新がなくなったからプロ版(のサポート更新)にアップグレードしろ
ということかと。
567デフォルトの名無しさん:2007/06/06(水) 23:26:44
アップグレードで得られる権利:

各 プロフェッショナル・エディション に含まれる製品に対する使用権を所有します。

サポート期間が所有製品の現在の終了日より 1 年間更新されます。

例 ) インテル C++ コンパイラー 9.1 Windows 版 を 2006 年 10 月に購入した場合
( この場合、サポートサービスが 2007 年 10 月まで有効 ) 、インテル C++ コンパイラー
Windows 版プロフェッショナル・エディション SSR を購入することで、インテル C++
コンパイラー Windows 版プロフェッショナル・エディション に含まれるインテル C++
コンパイラーおよびすべてのライブラリー (IPP 、 MKL 、 TBB) のサポートサービスが
2008 年 10 月まで有効になります。

ttp://www.xlsoft.com/jp/products/intel/compilers/comp10_faq.html

よく和歌欄が、今すぐ更新すれば従来の更新期間1年延長で、MKL付きの版に変わるという事か?
568デフォルトの名無しさん:2007/06/07(木) 03:04:51
>>565
2行3列に見えるのは、俺の目の錯覚?

「ソート」で調べて絶対値を被せたら良いだけじゃ?
569デフォルトの名無しさん:2007/06/08(金) 15:36:43
古いコンパイラで -Nl50 というオプションの効果がわかる方がいれば教えてください。
570デフォルトの名無しさん:2007/06/08(金) 17:06:33
>>569
コンパイラの種類は?バージョンは?
571デフォルトの名無しさん:2007/06/08(金) 20:25:46
バージョンは分かりません。種類はFortranのコンパイラです。
572デフォルトの名無しさん:2007/06/08(金) 23:55:35
>>571
お前はアホか! エスパーだって答えられないぞ!
しょんべんで顔洗って出直せ!


コンパイラのヘルプを見れなり、バナーを出すなりして、それをこのスレにコピペしろ。
それも出来ないなら、せめてコンピュータ名やOSくらいは書け。

脳みそがたりないようだから、何も考えるな、言われたままやれ。

573デフォルトの名無しさん:2007/06/09(土) 10:52:57
>571
まあ、とりあえず、そのコンパイラでコンパイルするときに打つコマンドは何?
frt とか g77 とか、そんなんでわかるばあいもあるし。
574デフォルトの名無しさん:2007/06/09(土) 21:47:03
windows xp のコマンドプロンプトで
f90のコンパイルして実行するとstack overflowしちゃいます.
visual studio だとスタックサイズ増やせたんですが,
コマンドプロンプト上でやりたいんです.
どうしたらスタックサイズ増やせますか.
575デフォルトの名無しさん:2007/06/09(土) 21:52:27
576574:2007/06/09(土) 22:03:48
>>575
俺の頭が悪いのか理解できません
噛み砕くと?
577574:2007/06/09(土) 22:28:12
事故解決しました.おさわがせしました.
578デフォルトの名無しさん:2007/06/09(土) 23:01:17
>>574
解決結果を書いておくと、備忘録になり、他の人の助けにもなる。

まぁ一般的に言えば、大概のコンパイラでは /help とか /? で、オプション一覧が出るので
それを見れば解決するのだが・・・
579574:2007/06/10(日) 00:25:33
じゃぁ。
自分ができた方法を・・・

普通にコンパイル
    ↓
editbin /stack:十分な値(デフォルトは1Mだから、それ以上の数字) program.exe
    ↓
program.exe

で、できました。もっと効率のよい方法もあるのかも、、、
580デフォルトの名無しさん:2007/06/11(月) 03:01:07
>>579
コンパイラは何?
Visual Studio上で動くFortranコンパイラにしても色々あるわけだが
581デフォルトの名無しさん:2007/06/11(月) 05:35:56
              ry、
             / / }
           _/ノ.. /、
           /  <   }
      ry、     {k_ _/`;,  ノノ パンパン
    / / }      ;'     `i、 
   _/ノ../、   _/ 入/ /   `ヽ, ノノ
  / r;ァ  }''i" ̄.   ̄r'_ノ"'ヽ.i   ) ―☆
 {k_ _/,,.'  ;.  :.      l、  ノ  
    \ `  、  ,i.    .:, :, ' / / \
     ,;ゝr;,;_二∠r;,_ェ=-ー'" r,_,/   ☆


【ラッキーレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
582574:2007/06/11(月) 09:59:23
>>580
まぁ、前に書いたんですが・・・・
f90です
583デフォルトの名無しさん:2007/06/11(月) 10:02:32
( ゚д゚)
584デフォルトの名無しさん:2007/06/11(月) 10:48:04
>582
俺が不勉強なのかもしれんがf90というコンパイラは聞いたことがない。
そのソフト買ったとき、箱に f90 って書いてあった?
なんていうメーカーの製品?
585デフォルトの名無しさん:2007/06/11(月) 12:55:24
その製品を知ってれば答えられるが知らないなら答えられないというなら、
その製品が何かを聞き返すこと自体、意味がない気がしないでもない。
586デフォルトの名無しさん:2007/06/11(月) 14:13:24
f90 は汎用コマンド名であって、コンパイラ名ではないな。
587デフォルトの名無しさん:2007/06/11(月) 15:13:13
任意の文字列C、整数Nを入力して、これらを連結してファイル名に使いたいのですが、
どうやればできるでしょうか?
588デフォルトの名無しさん:2007/06/11(月) 15:57:22
>>587
WRITE文を使えば簡単ですよ

PROGRAM test
  IMPLICIT NONE
  CHARACTER(20) :: str1 = "test", str2
  INTEGER :: i
  DO i=1,10
    WRITE(str2,'(A,I3.3,".dat")') trim(str1), i
    WRITE(*,'(A)') trim(str2)
  END DO
END PROGRAM test

出力結果

test001.dat
test002.dat
test003.dat
test004.dat
test005.dat
test006.dat
test007.dat
test008.dat
test009.dat
test010.dat
589587:2007/06/11(月) 18:02:38
ありがとうございます。trim関数ですか
ただFORTRAN77なんですよね・・・
590デフォルトの名無しさん:2007/06/11(月) 19:57:45
>>589
PROGRAM HOGE
IMPLICIT NONE
CHARACTER*10 C
CHARACTER*20 STR
INTEGER N, I
READ(*,*) C
READ(*,*) N
I = INDEX(C,' ') - 1
IF (I .LE. 0) I = LEN(C)
WRITE(STR, '(A, I3.3, ''.dat'')') C(1:I), N
WRITE(*,*) STR
STOP
END
591デフォルトの名無しさん:2007/06/11(月) 22:39:22
>>587
またこの質問かwwww
次からテンプレに入れておけ!(正笑
592587:2007/06/11(月) 22:57:31
>>590
知りませんでした・・・>INDEX
ありがとうございました
593デフォルトの名無しさん:2007/06/12(火) 03:04:08
//でくっ付けろよ。

594デフォルトの名無しさん:2007/06/12(火) 09:11:28
>>593
まぁ、内部ファイルでやると1行で出来るからな。
595デフォルトの名無しさん:2007/06/15(金) 00:06:45
N行N列の逆行列を求めるプログラムの作り方を教えてください・・・
ちなみにfortran90です
LAPACK使えって言うのは無しで・・・
596デフォルトの名無しさん:2007/06/15(金) 00:26:26
>>595
線形代数の行列の所で、掃き出し法によって逆行列を求める方法をやったでしょ。
それをそのままプログラムにすればOK、習って無くても、どの線形代数の本にもに載ってる
と思うからから、調べてみて。数値計算だとガウス・ジョルダン法と呼ばれてる方法かな?
597デフォルトの名無しさん:2007/06/15(金) 10:15:01
LU分解
掃き出し法
スカイライン

色々あるよ。つーか数値計算の本読め。
598595:2007/06/15(金) 11:11:08
返事が遅くなって申し訳ない
助言ありがとうございます
とりあえず、自力でまずはプログラム化してみます
599デフォルトの名無しさん:2007/06/15(金) 14:20:39
教えて下さい。
H(l)を以下のように計算したいのですが、走らせても答えが「NaN」と表示されます。
どこがおかしいか教えて下さい。お願いします。

program FILTER
c
implicit real*8(a-h,o-z)
dimension H(100000)
open(115,file='H.dat')
c
do 10 l=1,n/2+1
f=df*(l-1)
e=f/10.0
H(l)=((1.0/f)**0.5)*((1.0+(0.694*(e**2))+(0.241*(e**4))
&+(0.0557*(e**6))+(0.009664*(e**8))+(0.00134*(e**10))
&+(0.000155*(e**12)))**(-0.5))*((1.0-(dexp(-(f/0.5)**3)))**0.5)
write(115,*) H(l)
10 continue
c
pause
stop
end

(注)&は数式が長くなったため、改行している事を意味しているようです。
600デフォルトの名無しさん:2007/06/15(金) 14:29:00
>>599
n の値が不定
df の値も不定
601デフォルトの名無しさん:2007/06/15(金) 15:58:37
>>600
ありがとうございました。
602デフォルトの名無しさん:2007/06/17(日) 21:24:23
>>599
暇なんで書き換えてみた。
i=1 のときは、f がゼロだから 1/f が計算できないからパス。

      program filter
      implicit integer(i-n)
      implicit real*8(a-h,o-z)
      real*8 ek(1:6)
      ek = (/ 0.69400d0, 0.24100d0, 0.055700d0,
     &        0.09664d0, 0.00134d0, 0.000155d0 /)
      df = 0.01d0
      n  = 20
      do 1 i = 2, n / 2 + 1
        f = df * (i-1)
        ee = f * f * 0.01d0
        ex = 1.d0
        ss = 1.d0
        do 2 j = 1, 6
          ex = ex * ee
          ss = ss + ex * ek(j)
2       continue
        sx = 1.d0 - dexp(-(f+f)**3)
        H = dsqrt( sx / (f*ss) )
        write(*,*) i, H
1     continue
      stop
      end
603デフォルトの名無しさん:2007/06/18(月) 00:54:21
たぶんファイルからNを読み。
H.datの中のN個分のデータからH(I)を作りたいじゃ?

もとのプログラムではHを配列にする必要ないけど。

dexp(-(f/0.5)**3)のf/0.5は 2*fの方が見やすいと思うけど。
元の定義式がこうなってるのかな?
604デフォルトの名無しさん:2007/06/19(火) 01:02:38
複素数
C=(1.d0/3.d0,0.d0)のように分数などを打つとエラーが出るのはなんでですか?
ちなみにC=(dlog(2.d0),0.d0)もエラーがでました。
605デフォルトの名無しさん:2007/06/19(火) 01:26:40
>>604
cmplx()にしたらコンパイルできる。
次に質問するときはエラーメッセージくらいは
書いたほうが良いぞ。
606デフォルトの名無しさん:2007/06/19(火) 01:28:40
倍精度にしたそうだから dcmplx じゃないかな。
それともどっちでも自動的に補正してくれたっけ?
607デフォルトの名無しさん:2007/06/19(火) 01:30:16
>>604
ダメな理由はしらんが、

C = cmplx(1.d0/3.d0, 0.d0)
でOK。
608デフォルトの名無しさん:2007/06/19(火) 02:09:37
>>605
>>606
>>607
ありがとうございました。
はじめにcomplex*16::c(100,100)と宣言しているので、そのままいけると思ってました。
609デフォルトの名無しさん:2007/06/19(火) 02:10:49
要するに (***, ***) で1つのリテラルだから、
その中に演算子とか(符号以外)入れれないんだろう。
610デフォルトの名無しさん:2007/06/20(水) 11:28:28
質問させていただきます。
以下のプログラムで、y1とy3は答えとともにオープンしてくれるのですが、y2のオープンしたファイルが何も表示されません。
サブルーチン文はy1y2y3ともに引数は表示してくれてます。何か問題がありましたら教えて下さい。
お願いします。
program IFFT
implicit real*8(a-h,o-z)
dimension y1(1000000),y2(1000000),y3(1000000)
complex*8 w1(1000000),w2(1000000),w3(1000000)
dimension H(1000000),f(1000000)
c
open(114,file='d.dat')
open(115,file='e.dat')
open(116,file='f.dat')
c
m=15.d0
dt=0.01
n=2.0**m
tp=n*dt
df=1.0/tp
c
call SPECFILT(w1,w2,w3)
do 21 j=n/2+2,n
w1(j)=conjg(w1(n-j+2))
w2(j)=conjg(w2(n-j+2))
w3(j)=conjg(w3(n-j+2))
21 continue
c
611デフォルトの名無しさん:2007/06/20(水) 11:30:38
call nlogn(m,w1,1.0)
do 24 k=1,n
y1(k)=real(w1(k))/dt
t=dt*(k-1)
write(114,*) y1(k)
24 continue
call nlogn(m,w2,1.0)
do 25 k=1,n
y2(k)=real(w2(k))/dt
t=dt*(k-1)
write(115,*) y2(k)
25 continue
call nlogn(m,w3,1.0)
do 26 k=1,n
y3(k)=real(w3(k))/dt
t=dt*(k-1)
write(116,*) y3(k)
26 continue
c
stop
end
612デフォルトの名無しさん:2007/06/20(水) 12:01:49
>>610-611
入力ファイルが空なんだろう。

だいたい3つのファイルが同じ処理をしているなら、一つ用のサブルーチンを作って
それを3回呼ぶようにすれば、このような疑問は生じない。

どうせ同じことだと横着して、同じ処理を3回書くから、どこかで間違ったかもと余計な時間を食う。

反省しろ! Fortranの神様に謝罪と賠償しろ!
613デフォルトの名無しさん:2007/06/20(水) 12:31:11
612>
それが入力ファイルもオープンしたらちゃんと値が表示されていたんですよ。
614デフォルトの名無しさん:2007/06/20(水) 12:54:58
>>610
質問と関係ないけど、

m=15.d0
dt=0.01
n=2.0**m
tp=n*dt
df=1.0/tp

これ気持ち悪い。整数と倍精度実数はっきり区別して書く。

      m  = 15
      n  = 2**m
      dt = 1.0d-2
      tp = dble(n) * dt
      df = 1.0d0 / tp

f77も複素数型も使うことないので、あやふやだけど、
complex*8 は、実部と虚部の合計で8バイトで、実部と虚部それぞれは4バイト(単精度実数)、
complex*16は、実部と虚部の合計で16バイトで、実部と虚部それぞれは8バイト(倍精度実数)じゃなかったっけ?
y1-y3 は real*8 なんだから、complex*16 のが良い気がする。

ちなみに、F90 以降の complex(8) みたいな宣言の方法だと、
実部・虚部それぞれが8バイトだったような気がする。
615デフォルトの名無しさん:2007/06/20(水) 20:11:02
Microsoft PowerstationをWindowsXpにインストールしてFortranを使おう
と思ったのですが、コンパイル時に
Error executing fl32.exe.
Text1.obj - 1 error(s), 0 warning(s)
とエラーが出て先に進めません。
どうすれば解決するのでしょうか
よろしくお願いします
616デフォルトの名無しさん:2007/06/21(木) 00:04:58
>>615
どの文でエラーが起こったか分からないと
答えようがないんで…
文法間違いでないならサンプルで試してみたら
良いのでは?
617デフォルトの名無しさん:2007/06/21(木) 03:44:49
>>611

do 25 k=1,n
の直前にnの値が何か書くように汁。
618デフォルトの名無しさん:2007/06/21(木) 12:12:35
>>615
PowerStationはバグがあるから、新しいコンパイラ買え。
619デフォルトの名無しさん:2007/06/21(木) 21:06:33
DO 100 L = 1 , 5
READ(IOT)
& (((FTR(I,J,K,L),I=1,A),J=1,B),K=1,C)
100 CONTINUE

というプログラムで、値は全てファイルから読み込ませます。
予めAとBとCは読み込みをさせています。
それでこのプログラムを実行させようとすると

input statement requires too much data, unit200, file "ファイル名"

と表示されて実行出来ません。どうやらデータの読みすぎのようなのですが、
心当たりがありません。
考えられる原因は何があるのでしょうか。

A,B,Cは200×100×50くらいの値です。
620デフォルトの名無しさん:2007/06/21(木) 22:43:44
>>619

ttp://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/em/em01_03.htm

>evere (67): Input statement requires too much data
>FOR$IOS_INPSTAREQ。書式なし READ 文または PAD='NO' で開かれたファイルからの書式付き順番 READ 文で既存の記録以上のデータを読み取ろうとしました。
621デフォルトの名無しさん:2007/06/21(木) 23:23:17
>>619
A*B*C〜1,000,000〜1M
単精度なら4倍して4M

データファイルの大きさがこれくらいあるか?

まぁファイルの読み取りが、ここだけとしての話だがw
622デフォルトの名無しさん:2007/06/22(金) 10:04:04
ありがとうございました
623デフォルトの名無しさん:2007/06/22(金) 13:50:59
ハードウェアで4倍精度演算をサポートしてないと劇遅だよな
624デフォルトの名無しさん:2007/06/22(金) 15:10:51
end file premeture
で終わるタイプと違う?ただのエラー表示の違い?
625デフォルトの名無しさん:2007/06/22(金) 23:55:05
>>623
当然だろw
コプロが無かった時代のパソコンでの計算を思い出せw
626デフォルトの名無しさん:2007/06/24(日) 22:37:16
初歩的な質問でしたら申し訳ないのですが、調べてもわからないので質問させて下さい。
fortranで作ったプログラムを実行ファイル(EXE形式)にするにはどうすればいいのでしょうか。
(プログラムを実行するたびにfortranを起動して[コンパイル]→[ビルド]→[実行]するのは面倒なので、
 .exeをダブルクリックするだけにしたいのです)
627デフォルトの名無しさん:2007/06/24(日) 22:46:43
>>626
一度、ビルドしてたら、実行ファイルできてないですか?
フォルダが作成されてたらその中とかに。
628626:2007/06/24(日) 23:03:43
>>627
「Debug」フォルダの中に実行ファイルできてました。
どうやらアホな質問をしてしまったようで申し訳ないです。
どうもありがとうございました。
629デフォルトの名無しさん:2007/06/25(月) 01:36:53
>>628
練習用の短いプログラムならいいけど、本番用や他のマシンに持って行くプログラムは
ちゃんと「Release」でビルドして使え。
630デフォルトの名無しさん:2007/06/26(火) 16:32:17
質問させてください。
OPEN文の中にDO文を適用するのは可能でしょうか?
例えば、
OPEN(10,FILE='TEST1.TXT',STATUS='UNKNOWN')という文章の中の
↑ ↑
矢印で指した数値にDO文を適用して、たくさんのデータを
開きたいと考えています。
例えば
DO 1 I=1,N
OPEN(I,FILE='TESTI.TXT',STATUS='UNKNOWN')
1 CONTINUE
というような感じです。エロい人、宜しくお願いします。
631デフォルトの名無しさん:2007/06/26(火) 17:20:17
632デフォルトの名無しさん:2007/06/26(火) 23:31:31
>>630
もう千回くらい既出。
633デフォルトの名無しさん:2007/06/27(水) 01:04:35
エクセルから数値を読み込んで処理させようとしたのですが、
うまく読み込んでくれません。ちなみに2次元ベクトルです。
ファイル形式は.csvでいいのでしょうか?

open(10,file='〜.csv')
do i=1,10
read(10,*) (A(i,j),j=1,10)
end do
close(10)

という感じでしました。
よろしくお願いします。
634デフォルトの名無しさん:2007/06/27(水) 01:24:01
>>633
どう「うまく読み込んでくれ」ないのか詳しく。
全く読めないのか、特定のデータが来ると読めないのか、ランタイムエラーで止まるのか・・・
635デフォルトの名無しさん:2007/06/27(水) 01:47:00
>>634
write文のように数字が表示され、止まってしまうんです。
同じ形式であと3つほど書いたので、たぶん1つ目と同じで止まると思います。
636デフォルトの名無しさん:2007/06/27(水) 02:43:22
おまえの頭では分かっていても他人に説明できてないのを理解しろ

A(i,j)は2次元ベクトルでないと言うのはOKか?

>>633では数値データは100個分だけだよな?
i,jの成分で200個有るとかじゃないよな?

エラーメッセージ書け
637633:2007/06/27(水) 09:12:30
今から学校に行ってまた送ります。
638デフォルトの名無しさん:2007/06/27(水) 12:06:30
>>635
EXCELのCVS形式の読み書きの話はここレスがあったから、まず探して鯉!
639デフォルトの名無しさん:2007/06/27(水) 13:05:13
>>635
EXCELのCVS形式の読み書きの話はここレスがあったから、まず探して鯉!
640635:2007/06/27(水) 16:55:17
was detected (unit=10).id decimal character
(the relative position causing an error in a record = 96 )
3,3,3,5,4,5,4,5,6,4,5,5,6,8,6,6,9,12,6,6,7,10,13,7,10,13,8,9,12,15,12,15,19,12,1
5,15,20,25,25,35

?
error occurs at MAIN__ line 10 loc 00010690 offset 0000004c
MAIN__ at loc 00010644 called from o.s.
taken to (standard) corrective action, execution continuing.
was detected (unit=10).id decimal character
(the relative position causing an error in a record = 230 )
 略
?
error occurs at MAIN__ line 16 loc 000106cc offset 00000088
MAIN__ at loc 00010644 called from o.s.
taken to (standard) corrective action, execution continuing.

という長大なエラー文が出てしまいました。
プログラムは
open(10,file='danmenseki.csv',status='old') !表1.1を読み込む
do ii=1,3
read(10,*) (A(ii,ij),ij=1,40)
end do
close(10)
で、line10はread文のところです。
ご教授お願いします。
641デフォルトの名無しさん:2007/06/27(水) 17:30:22
うーん。まず問題の切り分けをしていこう。

とりあえず、こいつは動くか?

      program test
      integer a(3,40)
      integer i, j

      open(10, file='danmenseki.csv', status='old')
      do i = 1, 3
        read(10, *) (a(i, j), j = 1, 40)
      end do
      close(10)

      do i = 1, 3
        write(*, *) (a(i, j), j = 1, 40)
      end do

      stop
      end
642デフォルトの名無しさん:2007/06/27(水) 17:31:36
む。nbsp はエディタがどう認識するんだろう?
ちょっと心配になったから、
先頭の空白は自分で入れて貰った方がいいかもしんない。
643デフォルトの名無しさん:2007/06/27(水) 17:48:46
>>640
手元で試したら、↓のような感じで csv カンマ区切りデータを読み込めたけど、
こんな感じではダメでしょうか。

OPEN(1,file="test.csv")
  DO i=1,imax
    READ(1,*) a(i, 1:jmax)
  END DO
CLOSE(1)
644635:2007/06/27(水) 17:56:47
was detected (unit=10).d decimal character
(the relative position causing an error in a record = 96 )
3,3,3,5,4,5,4,5,6,4,5,5,6,8,6,6,9,12,6,6,7,10,13,7,10,13,8,9,12,15,12,15,19,12,1
5,15,20,25,25,35

?
error occurs at MAIN__ line 7 loc 00010688 offset 00000044
MAIN__ at loc 00010644 called from o.s.
taken to (standard) corrective action, execution continuing.
jwe0173i-w line 7 Invalid decimal character . was detected (unit=10).
(the relative position causing an error in a record = 1 )
1.427,1.727,2.336,3.755,3.492,4.302,3.892,4.802,5.644,4.692,5.802,6.367,7.527,9.
761,8.127,8.727,12.69,16.56,9.327,10.55,12.22,17,21.71,13.62,19,24.31,18.76,22.7
4,29.76,36.75,34.77,42.74,53.38,40.52,50.21,57.75,76,93.75,119.4,162.6

という感じでエラーメッセージが出ます。
エクセルの保存元がいけないのでしょうか?
645デフォルトの名無しさん:2007/06/27(水) 18:00:23
danmenseki.csv の中身はどんな感じなの?
646635:2007/06/27(水) 18:02:51
>>643
ありがとうございます。
jwd2005i-w "keisan.f90", line 14: この変数'imax'は,値を設定せずに引用されてい
ます.
jwd2005i-w "keisan.f90", line 15: この変数'jmax'は,値を設定せずに引用されてい
ます.
となってしまいます。うまく読み込んでもらいたいのですが…
647635:2007/06/27(水) 18:05:26
>>645
3 3 3 5 4 5 4 5 6 4
1.427 1.727 2.336 3.755 3.492 4.302 3.892 4.802 5.644 4.692
0.747 0.908 1.23 1.2 1.36 1.36 1.53 1.52 1.5 1.85
です。(右側は略)
648デフォルトの名無しさん:2007/06/27(水) 18:07:03
csv になってないけど、本当にそうなってるの?
何かさっきから勝手に略しすぎてて、
どこに問題があるのか分からんよ。
649デフォルトの名無しさん:2007/06/27(水) 18:12:49
よし。こうなったら、これが動くかどうか確認してみて。
ttp://www.hsjp.net/upload/src/up1068.zip
650635:2007/06/27(水) 18:13:01
>>648
3 3 3 5 4 5 4 5 6 4 5 5 6 8 6 6 9 12 6 6 7 10 13 7 10 13 8 9 12 15 12 15 19 12 15 15 20 25 25 35
1.427 1.727 2.336 3.755 3.492 4.302 3.892 4.802 5.644 4.692 5.802 6.367 7.527 9.761 8.127 8.727 12.69 16.56 9.327 10.55 12.22 17 21.71 13.62 19 24.31 18.76 22.74 29.76 36.75 34.77 42.74 53.38 40.52 50.21 57.75 76 93.75 119.4 162.6
0.747 0.908 1.23 1.2 1.36 1.36 1.53 1.52 1.5 1.85 1.84 1.99 1.98 1.94 2.14 2.3 2.25 2.22 2.46 2.77 2.76 2.71 2.68 3.08 3.04 3 3.71 4.01 3.96 3.93 4.61 4.56 4.52 5.38 5.35 6.14 6.09 6.04 7.63 7.49
エクセルのセルにそのままデータを入力したのですが、だめでしょうか?
友達は.datで成功したらしいのですが…
651デフォルトの名無しさん:2007/06/27(水) 18:15:12
こっちだとそのデータでうまく行くね。
何が悪いんだろう?

OS とコンパイラは何?
652635:2007/06/27(水) 18:19:46
OSはWindowsXP
コンパイラはUNIXです。
コンパイラ、UNIXの意味がわからないので違うかもしれませんが
653デフォルトの名無しさん:2007/06/27(水) 18:21:13
Cygwin の gcc を使ってるの?
654デフォルトの名無しさん:2007/06/27(水) 18:22:19
あいや、g77 か。

コンパイラってのは、大雑把に言えばプログラムを実行ファイルなどに変換するもの。
655635:2007/06/27(水) 18:23:48
f90 〜.f90 -o 〜
というやりかたでコンパイルします。
たぶんCygwinではないとおもいます。先生は勧めていましたが、それを使えばうまくいくのでしょうか?
656635:2007/06/27(水) 18:32:48
わかりました。
Tera Term ah.〜
です。
657デフォルトの名無しさん:2007/06/27(水) 19:19:25
gfortranで、xx.fというファイルをコンパイルしてみたのですが、

> gfortran xx.f
で、文法上のエラーは無いものの、下のメッセージが出ます。
ググってはみたんですが、対処法が分からず困っています。
助けてください。


xx.f: In function 'MAIN__':
xx.f:342: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
658デフォルトの名無しさん:2007/06/27(水) 19:20:48
あ、OSはXP sp2です。
659デフォルトの名無しさん:2007/06/27(水) 20:53:56
>>655
む、Fortran90 か。
困ったな。こっちにゃコンパイラがないや。
660デフォルトの名無しさん:2007/06/27(水) 20:55:03
>>657
コンパイラのバグで落ちてるように見える。

同じことを実現する別のコードに書き換えると
回避できる可能性はある。
661デフォルトの名無しさん:2007/06/27(水) 21:34:07
>>660
俺は配列が間違ってる希ガス

ソースだせ。該当ラインの前後10行くらい
662643:2007/06/27(水) 22:26:26
>>646
それくらい、察してくださいよ。
663デフォルトの名無しさん:2007/06/27(水) 22:46:15
>>656
いやそれ、全然わかってないから。

>>644
>jwe0173i-w line 7 Invalid decimal character . was detected (unit=10).
富士通のコンパイラか?
ttp://ccinfo.ims.ac.jp/vpp/manhtml/html/japan/lang/Fort/html/japan/langFortMSG/fmej03/fmej0025.htm

入力ファイル中の"."が10進数値ではない不正な文字だ、と出ているが
配列Aを整数型で宣言しているとか、入力ファイル中に数値以外の文字が混ざっているとかしてないか?

いずれにせよ、いきなり本番用のでかいデータを読み込ませたりせずに
まずは>>643のプログラムの頭にimax, jmaxを適当な小さい値で追加して、
test.csv もそれに合わせて手入力で作ってテストしてみろ。
664633:2007/06/27(水) 23:00:27
>>663
ありがとうございます。
実のところ、入力ファイルを.datに変換してtestの方を実行すると、うまく(?)いきました。
また、write文で','を使って.csvを出力することはできました。
1×96行列になってしまいましたが…
多次元配列は扱えないのかもしれません。
665デフォルトの名無しさん:2007/06/27(水) 23:01:12
扱えないわけが無いと思うんだが。
666633:2007/06/27(水) 23:11:30
>>665
エクセルの隣の列に移す記号を教えてもらえませんか?
','はわかるんですけど、「改行」のようなものを意味する記号は何ですか?
667デフォルトの名無しさん:2007/06/27(水) 23:12:15
色んなことが、ごっちゃになって理解できてないな。

エクセルの、読みこむ側のファイルってタブ区切りか?
668633:2007/06/27(水) 23:36:08
読み込む側はエクセルのファイルをTera Termにコピペしたものを.datで保存したものです。
なので区切りとかはないと思います。
669667:2007/06/27(水) 23:48:18
エクセルのファイルは普通のエクセルか?と言っても668には何を言いたいか
わからないだろうな。
 エクセル開いてドラッグで範囲決めてコピペしてるのか?

vista側のエディタは何だ?秀丸とかか?

制御文字を表示させると区切り分かるけど。
670633:2007/06/28(木) 00:03:58
MicrosoftのOffice2003のエクセルです。
コピペはその通りです。

ちなみにXPです。
エディターはよくわかりませんが「emacs -nw 〜」コマンドでテキストウィンドウを開きます。
671643:2007/06/28(木) 00:25:07
>>633
OpenOffice.org Calc しかないから、Excel だと若干違うかもだけど、
csv 形式で保存するときに、区切り文字していできるでそ。
そこで、区切り文字カンマ(,)で保存すると、
----------ここから----------
1,2,4,8,16,32
-1,-3,-9,-27,-81,-243
10,100,10,100,10,100
0,0,1,0,0,1
----------ここまで----------
こんなファイルできる。
で、↓のような Fortran90 プログラムで読み込みと表示の確認ができると思う。
----------ここから----------
PROGRAM read_csv
IMPLICIT NONE
INTEGER,PARAMETER :: imax=4, jmax=6
REAL(8),DIMENSION(imax,jmax) :: a
INTEGER :: i

OPEN(1,file="test.csv")
  DO i=1,imax
    READ(1,*) a(i,:)
  END DO
CLOSE(1)

DO i=1,imax
  WRITE(*,*) a(i,:)
END DO

END PROGRAM read_csv
----------ここまで----------
672633:2007/06/28(木) 00:41:05
>>671
ありがとうございます。
うちではできないので、学校に行って実際にやってみようと思います。

一応エクセルでは.csv形式で保存できるのですが、保存する際に警告みたいなメッセージが出るので
原因はそれなのかな?と思いはします。
673デフォルトの名無しさん:2007/06/28(木) 00:56:22
>>672
それは
「csv(テキスト)で保存するとExcelの計算式やセルの装飾などの情報が失われるよ」
という警告だがら、関係ない。
674667:2007/06/28(木) 12:04:28
コピペするとタブ区切りで持っていくはずだけどね
675657:2007/06/28(木) 12:33:54
メッセージのxx.f:342は、342行目ということだったんですね。

342,343行目は、
STOP
END
なんですが。。
676661:2007/06/28(木) 14:39:50
だから前後て書いてるでしょ

サブルーチンあるのか?配列の引渡しは、うまくやってるか?
677672:2007/06/28(木) 14:56:13
>>671
やはり、
was detected (unit=10).id decimal character
(the relative position causing an error in a record = 13 )
3,1.427,0.747
?
error occurs at MAIN__ line 15 loc 000106ec offset 00000044
MAIN__ at loc 000106a8 called from o.s.
taken to (standard) corrective action, execution continuing.
というエラーになります。
プログラムは
implicit none
integer,parameter :: imax=24,jmax=4,iimax=3,ijmax=40
real(8),dimension(imax,jmax) :: N,L,M
real,dimension(24,4) :: X
integer,dimension(24,4) :: K
real,dimension(iimax,ijmax) :: A
real(8),dimension(3,40) :: B
real :: f
real(8) :: lambda,omega
integer :: i,j,ii,ij

open(10,file='danmenseki.csv',status='old') !表1.1を読み込む
do ii=1,iimax
read(10,*) (A(ii,ij),ij=1,ijmax)
end do
close(10)
です。
>>673
ソフトの問題ではないわけですね。ありがとうございます。

678657:2007/06/28(木) 19:45:34
>676
ありがとうございます。
全部で546行のソースで、342行目にSTOP、343行目にENDがあります。
その後ろに4つのSUBROUTINEがあります。
配列の引渡しについては、引数を確認しましたが、型・サイズは同じでした。
679661:2007/06/28(木) 20:25:40
>>678
デバッグモードで確認するかだね。gfortranはできるのかな?
gnuだからできると思うけど
680657:2007/06/28(木) 21:24:58
>>679
ありがとうございます。

コンパイラのデバッグモードって、このオプションのことですか?
わけのわからないメッセージが出まくったのですが。困りました。
-fdump-parse-tree
Output the internal parse tree before starting code generation. Only really
useful for debugging the GNU Fortran compiler itself.

これ以外の Options for Debugging Your Program or GNU Fortranは、
runtime用のもののようです。
681デフォルトの名無しさん:2007/06/28(木) 21:29:04
>>677
どうもこちらで再現できないから、
うまくいった友達とやらに見てもらった方がいいかもしれん。
682661:2007/06/28(木) 21:37:17
デバッグは「-g」のはず。
gdb使ってね。

一通りミリ
ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html

"-fbounds-check"でこけたりして
683デフォルトの名無しさん:2007/06/28(木) 23:21:15
まだCVSファイルの問題が解決してないのかw

たしか富士通のコンパイラはレコード長の絡みでうるさいので、それかも試練。
入力データの1行の長さはどれくらいだ?
すごく長いなら、OPEN文でレコード長を大きくしておけ。

富士通のコンパイラは10年くらい使ってないから、保障しないがw
684677:2007/06/30(土) 00:30:41
結局.datファイルで入力することにしました…
出力の方は24×4のはずが96×1で出てしまいますが手作業で直しました。
月曜にまた学校でいろいろ試してみますね。
685デフォルトの名無しさん:2007/06/30(土) 14:21:05
>>684
>出力の方は24×4のはずが96×1で出てしまいますが
つ 改行コード

Windows側で LFのみの改行に対応したエディタか変換ツールを使うヨロシ。
686デフォルトの名無しさん:2007/06/30(土) 16:58:07
>>685

ftpソフトでwin-unix
lf-cr+lf対応を使った方が早いと思う。
687デフォルトの名無しさん:2007/07/01(日) 22:28:27
フォートラン初心者です.
BLASを使っていろいろ計算しようとしたんですが,内積で何故か良く分からない数値がでます.

PARAMETER ( N = 4)
REAL*8 e(N)/N*1.0/
inc = 1
WRITE(6,*) DDOT(N,e,inc,e,inc)
END

実行結果が 2.25000000
1,1,1,1と1,1,1,1の内積だから4になってほしいんですが・・・

C言語なら少しは分かります.
だれかぼすけて
688デフォルトの名無しさん:2007/07/02(月) 01:09:45
>>687
適当なので気休めまでに。

REAL*8 e(N)/N*1.0/
これを
REAL*8 e(N)/N*1.0d0/
にしてみそ。
コンパイラによっては、単精度4バイト4つ分を頭から詰めているのかもしれない。

別に考えられるのは、関数を直接WRITE文で書き出しているが、一旦変数に入れるのもよろし。
Cと違ってValueでは返さないので、関数をサブルーチンの引数にしたりすると
コンパイラによって受け付けたり、受け付けなかったり、暴走したりすることがある。
ただ、Write文だから大丈夫だと思うが。あとf90になってからは、おkのことが多い気が駿河。

689デフォルトの名無しさん:2007/07/02(月) 01:55:33
>>687
Intel Fortran Ver.10.026 + MKL 9,1 では、ちゃんと4が出たwww

おぬしのコンパイラ環境等は何ぞや。
690687:2007/07/02(月) 06:56:16
>>688
>REAL*8 e(N)/N*1.0d0/
変化無しOrz
初期化は上手く行ってるみたいです.
それといったん変数に入れても同じ.
ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・

>>689
よくわからないんですが適当にHPを漁ってみると
本体:FUJITSU PRIMEPOWER HPC2500
OS:Solaris 8
コンパイラFortran JIS X3001-1:1998 (Fortran95)
マニュアルとかのリンクが富士通なので,コンパイラも富士通だと思います
コンパイル時は,
%frt test.f90 -SSL2 -O0
でやってます

スパコンでベクトルの内積一本とか,なにやってんだ俺\(^o^)/
691デフォルトの名無しさん:2007/07/02(月) 11:29:11
>>690
%frt -SSL2 -O0 test.f90

こうとかwwwww

>ここでさらに気になるのは,DDOTの戻りが単精度っぽいところ・・・
これが気になるな。症状的にはサブルーチンの単精度倍精度の割り当て違いっぽいので。
 
DDOTにもDOUBLE指定が必要な仕様かw
IMPLICIT REAL*8 (a-h,o-z)
もつけてみるかw
692デフォルトの名無しさん:2007/07/02(月) 14:26:52
pgf90のコンパイルで困っています。
makeを実行すると

PGF90-W-0119-Redundant specification for name_size (Size_Class.f90: 101)

のようなエラーがでてきます。
これはコンパイルオプションでなんとかできるものなのでしょうか?
教えてください。
693デフォルトの名無しさん:2007/07/02(月) 16:34:13
>IMPLICIT REAL*8 (a-h,o-z)
かもね。

ただ、最適化するな。それで答えはどうなる?
最適化の問題か
694デフォルトの名無しさん:2007/07/02(月) 23:12:58
>>693
オプション -O0 使ってるから、最適化はして無いだろう。
多分DDOTもdble宣言しておかないと駄目なんだろ。EXTERNALと合わせて。
前にも似たような症状がスレに出ていた希ガス。

この辺は、NEC<<<Fujitsu<Hitachi の順でコンパイラのケツの穴が狭いという
昔の言い伝えにあるように、Fujitsuはコンパイラが宣言にうるさいんだろ。

NECはゆるすぎて、ホモの尻穴のごとく何でもホイホイ容れてしまうのだがwww



ところで、おまいら 京速コンピュータがNEC、日立、富士通の三社合同になったことをどう思う?
完全に破滅コースに入ったと思うんだがwwwwwwww
695デフォルトの名無しさん:2007/07/03(火) 00:16:01
>>694
最適化しないというオプションは効いてない場合もある。-Oは書かない。

京速?北海、九州コンピュータに頑張ってもらおう。
696デフォルトの名無しさん:2007/07/03(火) 23:44:22
>>695
>北海、九州コンピュータに頑張ってもらおう。
意味分からん。解説よろ。
697デフォルトの名無しさん:2007/07/04(水) 04:54:07
linpackのMPI版はありませんか?
698デフォルトの名無しさん:2007/07/04(水) 23:07:37
>>697
あるべ。
699デフォルトの名無しさん:2007/07/05(木) 02:02:05
最近WINDOWS版g95をインストールし問題なく動いていたのですが、
突然エラーが出るようになってしまいました。

g95: installation problem, cannot exec 'as': No such file or directry

とでて、コンパイルができなくなっている状態です。
pathは通っていますし、インストールもうまくいったはずなのですが・・・
なにより最近まできちんど動いていたので、全く原因がつかめません。
700デフォルトの名無しさん:2007/07/05(木) 12:03:12
>>699
動いていたときと動かなくなった間に、何をしたのかを書かなければ誰にも分からん。
何もしていないというのは無し。

XPだったら復帰ポイントで戻れw
701デフォルトの名無しさん:2007/07/06(金) 16:24:12
自宅でfortran77を使うために、CPad for FTN77をダウンロードしたんですが
コンパイルして実行すると

コンパイルに失敗しました。
ファイル"〜〜test.exe”は存在しません。

と言われるのですがどうすれば解決できますか?
702デフォルトの名無しさん:2007/07/06(金) 20:25:56
>>701
バグ取りすれば解決できます。
703701:2007/07/06(金) 21:35:33
>>702
度々すみません
具体的にどういうことをすればいいんでしょうか?
704デフォルトの名無しさん:2007/07/06(金) 22:38:10
>>703
自分の入力したプログラムをじっくり眺めて間違ってるところを直せばいいだけだよ。
705701:2007/07/06(金) 23:49:35
>>704
学校ではコンパイルも実行もできたやつなんですが…
といっても間違いがないとは限らないということでしょうか

簡単なもので試したんですが
write(*,*)'test'
end
でもできませんでした。


下のメッセージに

■C:\〜〜〜〜〜〜〜〜〜\data> ftn77 /link test.f
Cannot open authorisation file c:\〜〜〜\ftn77.ser:   (文字化けしてる)
System error (3): 指定されたパスが見つかりません。

と出てました。
ftn77.exeにつなげてるんですが…。
706デフォルトの名無しさん:2007/07/07(土) 00:03:08
>>705
FTN77は日本語の入っていないパスにインストールしろ。
707デフォルトの名無しさん:2007/07/07(土) 03:10:21
>>701
同じ質問がこのスレだけですでに2,3回出ているw
>>65あたりみろ
708701:2007/07/07(土) 12:56:23
できましたー!
一番の原因は>>706さんが言ってることでした
答えてくれた方々、本当にありがとうございました
709デフォルトの名無しさん:2007/07/07(土) 13:45:18
今度質問することがあったら、最初からエラーメッセージをコピペしような。
710デフォルトの名無しさん:2007/07/08(日) 13:09:06
粘IN/1-T
の式をTを0から3まで0.5刻みでとって
さらにN=1、2、3、4、5について別々に求めたいのですが、わかりませんどなたかよろしくお願いします
711デフォルトの名無しさん:2007/07/08(日) 13:16:07
すいません↑の式は
粘IN30/1-T-n
狽ヘn=1からNまでです
712デフォルトの名無しさん:2007/07/08(日) 21:33:21
DO 10 T=0,3,0.5
S=0
WRITE(*,100) T
DO 10 N=1,5
S=S+SIN(30*3.14159/180)/1-T-N
10 WRITE(*,101) N, S
STOP
100 FORMAT(1H , 'T=', F6.2)
101 FORMAT(1H ,'N=',I2,F12.3)
END
713デフォルトの名無しさん:2007/07/09(月) 01:34:10
神です!ありがとう
714デフォルトの名無しさん:2007/07/09(月) 08:16:24
まー>>711の式が悪いので、本当に計算したいモノと違うだろうな
と思うが、ある程度書いて貰ってるから後は自分で変えろ。

おれは712では、ないけど。>>711を指摘しようと思ったけどヤメタ
715デフォルトの名無しさん:2007/07/10(火) 01:30:43
何時も気になるんだけど、このスレの住人はFORTRAN77とかFORTRAN95とか
明示せずに質問したり、解答したりしてるけど問題に成らないのか?
716デフォルトの名無しさん:2007/07/10(火) 02:28:56
回答する分には答えやすい方(主にF95)に勝手に脳内補完するから無問題。
問題になるなら>>1をよく読んでから質問しろと言いたい。
717デフォルトの名無しさん:2007/07/10(火) 11:49:19
>>715
宿題はを聞く奴は違いが分からないw 結局は77になるようだが。

そうでない場合は90で答えて大丈夫だろう。さすがに90処理系はたいがいどこにでもある。
718デフォルトの名無しさん:2007/07/10(火) 11:52:16
77で答えておけばそれより上位でもだいたい問題ない。
719デフォルトの名無しさん:2007/07/11(水) 23:08:26
>>694
すごく・・・買vロジェクトです。
720デフォルトの名無しさん:2007/07/12(木) 01:20:37
GNUのfortranって何であんなに遅いの?
721デフォルトの名無しさん:2007/07/12(木) 09:40:57
>>720
素人が作ってるからでないの?

GNU-Cだって倒産した商用コンパイラを引き継ぐまではf2c+gccで、小さなサンプル以外は
まともに走ったことが無かったような記憶が。
722デフォルトの名無しさん:2007/07/13(金) 18:39:06
↓この問題が全くわかりません。
教えてください。
よろしくお願いします。   

   ......
call rndm0 ( )
......
a = rndm ( )
......
b = rndm ( )

このルーチンを使って、乱数を 100 回発生させて それをファイルに書き込む
プログラムを作成せよ。それを実行し、ファイルに正しく書き込まれたことを
確認せよ。なお、メインプログラムと独立したファイルにサブプログラムが
書かれている場合は、メインプログラムを違う名前のファイルで作成した後に、
コンパイルすればよい。
723デフォルトの名無しさん:2007/07/14(土) 10:48:45
自分で調べるのを前提に書く

サブルーチンを使ったプログラム書けってことじゃ?

PROGRAM HOGE
 ファイルを開く(OPEN文)
ループスタート 100回
  CALL RNDM()
  Aを書く
 エンドループ
 ファイルを閉じる(CLOSE文)
 STOP
END

 SUBROUTINE RNDM
乱数発生するぞするぞ!
RETURN
 END

「メインプログラムと独立したファイルにサブプログラムが書かれている場合」
てのは、ライブラリが有るって事

調べて分からない場合は又書き名。調べた痕跡が分かれば俺は答える。
724722:2007/07/14(土) 14:32:45
>>723
ありがとうございます。
調べてみます!
725デフォルトの名無しさん:2007/07/16(月) 03:39:15
ボコボコにしてやんお 
.∧_∧ 
(  ^ω^)=つ≡つ 
(っ  ≡つ=つ 
/   ) ババババ 
( ノ ̄∪ 
726デフォルトの名無しさん:2007/07/19(木) 11:52:59
たとえば、
WRITE(*,'(E10.4)') 0.0001234
とすると、出力結果は0.1234E-03となります。
この出力結果を、1.234E-04とするにはどうしたらいいのでしょうか?
727デフォルトの名無しさん:2007/07/19(木) 14:40:44
そうするメリットは何?

文字として扱うかですね。
728デフォルトの名無しさん:2007/07/19(木) 17:24:04
E形編集を使ったこと無いから、気付かなかったけど
E形編集ってメイドコスプレしたオッサン並に気持ち悪い。
729デフォルトの名無しさん:2007/07/20(金) 00:09:39
>>727
おい! クソ豚! わかりもしないことに口出しするな!
しょんべん飲んで、とっとと死にやがれ!

>>726
その要望は多くの人が持っていたので、Fortran90で対応がなされた。
ただしFORTRAN77でも出来ることは出来る。

Fortran90なら、ESフォーマットを使えばよい。SはScientificのSだ。
工学と科学では表記の伝統が違うようだ。詳しくはマニュアル嫁。

Fortran77の場合は、1P, E10.4, 0P を使えばよい。Pフォーマットは思わぬ副作用があるので、
使用後はすぐに 0P で元に戻しておいたほうが間違いが無い。
詳しくはマニュアル嫁。
730デフォルトの名無しさん:2007/07/20(金) 01:19:02
>>727
そりゃ少ない文字数で多くの桁を表現できるからだろ。
731デフォルトの名無しさん:2007/07/20(金) 14:49:51
>>729

0.123......
1.234......
と小数点以下を同じ桁数でして、桁数も大きくすると
仮数分の限界を越すと思うが
732デフォルトの名無しさん:2007/07/20(金) 16:49:58
何が言いたいのか分からない
733デフォルトの名無しさん:2007/07/20(金) 21:14:08
無視でおk
734デフォルトの名無しさん:2007/07/20(金) 23:45:57
>>731
WRITE(*,'(E10.4)') 0.0001234
      〜〜〜

ちゃんと>>726を読んだらどうだ?
2chなんか見てないで、精神病院でも逝って来い!


735デフォルトの名無しさん:2007/07/22(日) 03:13:48
r(i)をreal(8)の配列として、
sin(r(i))の値を求めたいのですが、出力が0になります。
どなたかどうすればちゃんとした値が帰ってくるのか教えてください。
736デフォルトの名無しさん:2007/07/22(日) 03:55:29
r(i) がゼロなんじゃね?
737デフォルトの名無しさん:2007/07/22(日) 03:57:02
整数に代入した後に出力してるとか。
738デフォルトの名無しさん:2007/07/22(日) 13:18:36
>>735
ソース見せろ
739デフォルトの名無しさん:2007/07/25(水) 20:50:00
配列の宣言で、REAL A(10,5)とすべところをA(5,10)と間違って宣言したままコンパイルし、
しかもboundのチェックしないオプションでコンパイルしてエラー等は起きずに動いた場合、
たとえば、A(7,7)にアクセスした結果は、
どちらの宣言でも同じなのでしょうか?
C言語の場合は同じというような話をきいたことがあるのですが、FORTRANの場合
いかがでしょうか?
処理系に依存して結果が不定なのでしょうか?
740デフォルトの名無しさん:2007/07/25(水) 20:52:54
同じなわけがない。C でも。
741デフォルトの名無しさん:2007/07/25(水) 21:53:51
C言語なら5×10=50のエリアに連続的に並んでいるだけだから、
A(7,7)は49番目というつもりなら境界を越えない限りは
アプリの実行結果は同じになるんじゃないか。
742デフォルトの名無しさん:2007/07/25(水) 21:55:50
A(10,5) で A(7,7) はおもっくそ境界越えとるがな。
743デフォルトの名無しさん:2007/07/26(木) 00:22:18
>>742
従来のFORTRANでは、境界はあまり気にしなくていい。
というか、サブルーチンに渡したりするときは次元すら気にしない。
どうせ先頭番地しか渡してないので。自己責任でGo!

>>740 >>741が正しい。
どうせメモリー上では1次元に展開されているので、どう展開されるか分かっていれば
本来不正な添え字でも、目的の配列要素をアクセスすることが可能。

ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。
FORTRANは縦書き。A(1,1),A(2,1),A(3, 1),.....,A(1,2), A(2,2), A(3, 2),.....という風にメモリー上に
並んでいる。
.




744デフォルトの名無しさん:2007/07/26(木) 07:24:32
FORTRANの他に数値解析に向いてる言語って何がありますかね?
745デフォルトの名無しさん:2007/07/26(木) 08:43:53
>>743
いや、配列のために確保されているメモリ領域を越えちゃってるという意味で・・・
746デフォルトの名無しさん:2007/07/26(木) 10:30:25
>>745
今回に限って言えば、50>7*7=49でぎりぎりセーフでね?
747デフォルトの名無しさん:2007/07/26(木) 12:17:43
>>746
Cは0から始まるから A(7,7) は (7+1)*(7+1)=64番目なのよ。
まあ、>>739のは Cの場合はA(6,6)と読み替えてやるのがよろし。
748デフォルトの名無しさん:2007/07/26(木) 12:23:45
>>746
A(10,5) で A(7,7) にアクセスするってのは、
10 * (7 - 1) + 7 = 66 番目のメモリ領域にアクセスするってことで、
50 要素しかない A(10,5) のメモリ領域は余裕で越える。
749747:2007/07/26(木) 12:32:02
>>748
確かにそうだ。何で1行7要素だと思ったのか。
馬鹿だった。
750デフォルトの名無しさん:2007/07/26(木) 14:56:16
じゃA(5,10)なら良いのか?
violationになりそうだけど
751デフォルトの名無しさん:2007/07/26(木) 19:32:06
5 * (7 - 1) + 7 = 37 だから、
確保したメモリ領域を越えないという点に関してのみは問題は無い。
752739:2007/07/26(木) 19:38:10
>740-751
皆さんありがとうございました。
考え方がよくわかりました。
変な質問になってしまい申し訳有りません。
A(7,7)は例が悪かったと反省しています。
753デフォルトの名無しさん:2007/07/26(木) 19:58:59
>>744
お金があったらMATLAB
貧乏人ならOctave
754デフォルトの名無しさん:2007/07/26(木) 23:33:09
>>748
んだ。おまいが正しい。わしが間違ってた。すまんこw
755デフォルトの名無しさん:2007/07/27(金) 12:32:54
>>743
>どうせメモリー上では1次元に展開されているので、
そうなんすか・・・知らんかった
つまり、A(7,7)は単に先頭から7*7=49番目を見るってことですか?

>ただ、FORTRANとCでは、1次元に展開される時の列と行の順序が逆になっている。
つまりFORTRANは左から、Cは右から1,2,3,・・・と展開していくってことですか
756デフォルトの名無しさん:2007/07/27(金) 12:37:39
>>755
ちょっと前のレスくらい読めよ・・・
757755:2007/07/27(金) 12:39:52
>>756
すいません新着し忘れてましたすいません
758747:2007/07/27(金) 12:51:34
まだ混乱しているようだから、整理すると

SUBROUTINE A(X)
INTEGER X(10,5)
WRITE(*,*) X(7,3)
END SUBROUTINE
PROGRAM
INTEGER Y(5,10)
Y(2,6)=10
CALL A(Y)
  STOP
END

とかやると
ちゃんと 10って表示されるってことでしょ。
Y(2,6) は前から27番目。 X(7,3)も27番目だから。

メインルーチンの中で Y(7,7) とかやるとコンパイル時にエラーが出ると思う、さすがに

FORTRAN77の頃は結構利用されていたような気がする。
普通は1次元配列で作って2次元で受け取るとかその逆だと思うけど。
759デフォルトの名無しさん:2007/07/27(金) 13:42:25
すいません.Fortran90で複数行をまとめてコメントアウトすることはできないのでしょうか?
760755:2007/07/27(金) 13:55:30
>>758
ありがとうございます。もんすごい良く分かりました。

Y(7,7)でやってみたところ、g77だとやはり out of defined rangeとなりましたが、
ifort9ではコンパイルでき結果も一致しました。

SUBROUTINE A(X)
INTEGER X(10,5)
WRITE(*,*) X(7,4)
END SUBROUTINE
PROGRAM
INTEGER Y(5,10)
Y(7,7)=10
CALL A(Y)
  STOP
END

ifortって緩いんですかね?
761デフォルトの名無しさん:2007/07/27(金) 14:18:10
>>760
配列の範囲チェックに限らず、ifortは微妙にいろいろ緩いよ。少なくともg77よりは。
オプションで変わるのかも知れないが、デフォではそう。
最初のうちはg77で練習した方がいいかもね。
762デフォルトの名無しさん:2007/07/27(金) 17:14:05
Fortran77で、Do文を利用して配列に値(1or0)を代入して
ファイルにはいたら途中から?????とか巨大な数が
でてしまうのですが、
何か初期化などが必要なのでしょうか?
Do文の前にx(i,j,k)=0とか入れてるのですが、
これでは駄目なのでしょうか?
763デフォルトの名無しさん:2007/07/27(金) 17:51:26
>>762
1か0を代入した配列要素を参照すれば1か0を返すと思います。
予期せぬ値を吐いているのは、配列が宣言されてから、
その要素に一度も値が代入されていないからだと思います。

予期せぬ値が配列のどの要素にあたるのか考えてみれば
大抵あっさり解決すると思いますよ。
764デフォルトの名無しさん:2007/07/27(金) 20:02:58
Intel fortranだと初期化してない変数は自動で0になるんよね
765762:2007/07/27(金) 20:22:52
>>763,764
ありがとうございます。
使用しているのはSalfordのftn77peです。
配列要素は代入したものを参照しているはずなのですが。。。
以下の内容ですが間違いありますか?
integer h
parameter(ilimit=10)
parameter(jlimit=20)
parameter(klimit=2)
real Conc(ilimit+1,jlimit+1,klimit+1)
open(10,file='tests1.csv')
i=0
j=0
k=0
h=5
Do 300, i=0,ilimit
Do 200, j=0,jlimit
if(j.lt.h) then
Conc(i,j,k)=0.0
else
Conc(i,j,k)=1.0
endif
write(*,*)i,j,k,Conc(i,j,k)
write(10,*)i,j,k,Conc(i,j,0)
200 Continue
300 Continue
c
close(10)
stop
end
766デフォルトの名無しさん:2007/07/27(金) 22:09:46
>>765
FORTRANの配列は特に指定しない場合は 1から。

>使用しているのはSalfordのftn77peです。
>>765のプログラムを/CHECK オプションを付けてコンパイルすると実行時エラーが出る。
/FULLCHECK オプションを付けるとコンパイル時にエラーになる。

配列を0から始めたいのなら以下のようにする。
real Conc(0:ilimit,0:jlimit,0:klimit)
767762:2007/07/28(土) 13:05:47
>>766
アドバイスありがとうございます。
教えていただいたオプションつけると
実行時エラーが確かにでますね・・・
どこに間違いがあるのでしょう?
768762:2007/07/28(土) 13:09:51
>>766
初期化したら大丈夫でした。
何から何までありがとうございました。
769デフォルトの名無しさん:2007/07/31(火) 17:13:16
gfortran, ifort で NaN を検出したいのですが、
どうすればよいでしょうか。

program test
real(8) :: x,y
x=1.
y=0.
write(*,*) x/y,isnan(x/y)
end

$ gfortran test.f90
/tmp/ccABo1qT.o: In function `MAIN__':
test.f90:(.text+0xa3): undefined reference to `isnan_'
collect2: ld はステータス 1 で終了しました

$ i$ ifort test.f90
$ ./a.out
Infinity F

鳥は
Linux 2.6.20-gentoo-r8 SMP x86_64 Intel(R) Xeon(TM) CPU 3.80GHz GenuineIntel GNU/Linux
$ gfortran --version
GNU Fortran 95 (GCC) 4.1.2 (Gentoo 4.1.2)
$ ifort --version
ifort (IFORT) 9.1 20070215
です。
770デフォルトの名無しさん:2007/07/31(火) 20:48:12
>>769
Intel Fortran, g95 なら

program test
real(8) :: x,y
x=0.
y=0.
write(*,*) x/y,isnan(x/y)
end

gfortranの場合は知らん。
771デフォルトの名無しさん:2007/07/31(火) 21:18:08
>>770 thanks. infinity は NaN ではなかった。小手先の工夫で
program test
real(8) :: x,y
x=0.
y=0.
x=x/y
if(x-x.ne.0.) then
write(*,*) x
else
write(*,*) x-x
endif
end
を考えたのですが gfortran は NaN を返し、ifort は
0.000000000000000E+000
を, ifort -O0 は NaN を返しました。例外をトラップしようと思うと、
c のプログラムをリンクせざるとえないのかな。
772デフォルトの名無しさん:2007/07/31(火) 23:20:20
>>771
マニュアル味噌。

Module: USE IFPORT
Syntax
result = IEEE_FLAGS (action, mode, in, out)

gfortranの方は知らんが、F2003対応のIEEEモジュールを誰かが作ったとか書いてあったような。
記憶違いだったら、ごめんw
773デフォルトの名無しさん:2007/08/02(木) 03:31:02
わざわざNanを検出する理由は何か?
774デフォルトの名無しさん:2007/08/02(木) 09:17:03
>>773
なんもない
775726:2007/08/09(木) 12:58:16
>>729
ずいぶん遅くなってしまいました。
私のやりたいことはデータを並び替えるだけなのですが、もともとの出力データは役所が絡んでいるので、
出力形式がオリジナルのものと違うと何かと説明が面倒なのです。
ありがとうございました。

776デフォルトの名無しさん:2007/08/10(金) 10:45:29
標準入力でファイル名入れるときに、普通のシェルみたいに、タブによるインクリメントサーチ使えたらなぁ
やっぱり無理だよね?
777デフォルトの名無しさん:2007/08/10(金) 14:36:40
だれかこのプログラムの使い方教えてください
http://cera-www.dkrz.de/IPCC_DDC/info/Readme.gzip
ASCIIデータをなにかに変換するプログラムなのですが
自分無知でよくわかりません。
おねがいしますm(__)m
778デフォルトの名無しさん:2007/08/10(金) 16:19:46
ノットあナンバーはコンピューータサイエンスやるなら覚えとけボケ
779デフォルトの名無しさん:2007/08/10(金) 19:15:35
>>777
只のデータフォーマットの説明とサンプルプログラムのようだが。

よくわからないなら使うなよ。
780デフォルトの名無しさん:2007/08/11(土) 00:51:39
>>778
Fortran利用者はコンピュータ・サイエンスなんか知らない。 
計算機自体をサイエンスだなんて何言ってんの?あんた馬鹿?って認識だろw

IEEEフォーマットが普及したのはありがたい。

IBMとクレイのフォーマットが最後までがんばっていたようだが、
各社の糞数値フォーマットもようやく死滅したようで、まずはめでたい。


Infのおかげで、ゼロ割エラーで止まらなくなったのはうれしい。
IF文で避けているはずなのに、投機的実行して0割エラーでアボンとか、ウンコ漏れそうになるw

正直NaNはあんまり助けにならん。


>>777
その質問じゃ答えようが無い。
もう少し具体的に質問すれば誰か答えてくれるだろう。

書いてあることは、>>779の言うとおりだ。
1.gzipで圧縮してあるからばらすが良い。解凍するとASCIIファイルが出る。
2.そのASCIIファイルのデータの書式。および読み込みサンプル。
の2点だ。

781デフォルトの名無しさん:2007/08/11(土) 07:47:23
中二病?
782デフォルトの名無しさん:2007/08/11(土) 18:38:47
夏休みで暇だから、宿題を持ってきたまえ。
783デフォルトの名無しさん:2007/08/13(月) 12:27:55
>>777
中身もちゃんと見ていないが、たぶん、IPCC(国際的な専門家でつくる気候変動に関する政府間パネル)
が、シミュレーションした結果をGRIB形式とかいうので保存してあるというやつの
中身の説明と、サンプルプログラムじゃないかな。
784デフォルトの名無しさん:2007/08/21(火) 11:56:55
   OPEN(5,FILE='C:\\test-data.txt')
   DO 20 K=1,200
   READ(5,25)X(K),Y(K)
 25 FORMAT(2F20.0)
 20 CONTINUE 
のとき、test-data.txtはどんなデータを与えればいいのだ?
2F20.0がよくわからん。
785デフォルトの名無しさん:2007/08/21(火) 23:10:05
>>784
勝手に装置番号 5番を使うなよ。とか、
不用意に入力に書式仕様を使うなよ。というのは置いといて。

2F20.0
「20文字読み込んでその値を実数と見なす。小数点も指数も含まない場合は小数部のない実数と見なす。」
を 2回繰り返す。
786デフォルトの名無しさん:2007/08/22(水) 00:32:58
>>785
まぁ F20.0 を使ったのは筋のいいほうでないかいw
787デフォルトの名無しさん:2007/09/01(土) 03:44:42
>>785
unit 番号は置いといて
読みこむ場合は、カラムの20,21カラムがしっかりしてたら
123.456
とかを入れても、123.456できちんと格納されてるよ。
788デフォルトの名無しさん:2007/09/01(土) 10:11:05
データの桁位置が絶対にズレないということなら大丈夫なんだけどね…
789デフォルトの名無しさん:2007/09/04(火) 16:07:04
Fortranで整数型 i = 1を文字型に変換するにはどうしたらよいでしょうか?
i = 1
hoge = char(i)
だとhogeに『のような文字が入りうまくいきません.
790デフォルトの名無しさん:2007/09/04(火) 20:54:09
>>789
二バイト文字を入れたいという質問か?
791デフォルトの名無しさん:2007/09/04(火) 21:02:48
792デフォルトの名無しさん:2007/09/04(火) 21:39:58
このスレは内部ファイルの質問の無限ループだなw
793デフォルトの名無しさん:2007/09/06(木) 08:01:37
超初心者用だからな。
それだけ初心者にとって理解しにくい部分ってことだろ。
794デフォルトの名無しさん:2007/09/07(金) 00:22:38
次からテンプレに内部ファイルの使い方を書いといてくれ。
795デフォルトの名無しさん:2007/09/09(日) 19:45:39
visual fortranだと動くのに、FTN95だとめちゃくちゃエラーがでて
コンパイルできません。金が無いんでフリーのFTNで動かしたいのですが
主な原因わかるかたいるでしょうか?
796デフォルトの名無しさん:2007/09/09(日) 21:04:57
>>789
Fortran まだあるのかよ
Format変換かけて内部にWriteすればよいと思う

SFTNとかUFTNとかあるのだろうか...

$Branchi $do とか...
797エスパー:2007/09/09(日) 21:51:03
>>795
Visual Fortran独自の機能を使っているからだよ。
798デフォルトの名無しさん:2007/09/10(月) 13:12:28
FORTRAN使いが許容できるのはFORTRAN77迄だべ。
もはやFORTRANは死んでいる。C言語のプリプロセッサに成り下がった。
799デフォルトの名無しさん:2007/09/10(月) 13:46:42
>>798
終わってるのはCのほうだろw
800デフォルトの名無しさん:2007/09/10(月) 18:49:41
すいません。
整数を格納する1次元配列と整数のデータがあります.
整数データを重複を許さないで(重複データを飛ばして)配列に格納するにはどうすればよろしいでしょうか?
801デフォルトの名無しさん:2007/09/10(月) 19:49:54
>>800
sort
uniq
802デフォルトの名無しさん:2007/09/11(火) 05:00:09
超初心者です。
format文の練習のために
学籍番号122番のアキラ君は  英語50点,国語80点、数学30点。この3科目の合計点は160点です。」
という文字を表示するプログラムを
   character*20 a
   integer b
   real c,d,e,f
   read(*,10)a,b,c,d,e,f
10 format(a6,i3,3i2,i3)
f=c+d+e
write(*,20)b,a,c,d,e,f
20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。')
stop
end

というように作ったんですけど

0007) write(*,20)b,a,c,d,e,f
0008) 20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。')
*** Non-blank label field in continuation line
0008) 20+format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。')
WARNING - Characters found after column 72 (use -NO_WARN73 to suppress)
*** Unterminated or empty character constant
2 ERRORS,1 WARNINGS [<MAIN@>FTN77 Ver 4.03]

*** Compilation failed

とでてコンパイルできません。どこがいけないのでしょうか?
803デフォルトの名無しさん:2007/09/11(火) 10:05:09
>>802
20+format
プラス記号が紛れ込んで、継続行扱いになっている。それで矛盾。

あと72カラムはみ出している。


一応エラーメッセージを読めば書いてある。
初心者はエラーメッセージを読んでも分からないといって読まないのが普通だが、教養人なら読めw

804デフォルトの名無しさん:2007/09/12(水) 02:28:32
>>803
返信ありがとうございます。
すいません。お聞きしたいのですが72欄をこえて書くにはどうしたらよいのでしょうか?
ネットで調べたら

6欄は72欄を超えてしまった場合、ここに何か文字を書けば(たいていは「+」を書く)、72欄を越す文であっても続けて書き続けることができるようになります。

と書いてあったのですけど自分の書き方ではいけないのでしょうか?
初心者名質問ですいません。ぜひ教えてください。
805デフォルトの名無しさん:2007/09/12(水) 11:37:24
>>804
72カラムを超えては書けないので、次の行に継続することになる。

20 format('学籍番号',i3,'番の',a6,'君は',4x,'英語',i2,'点、国語',
+ i2,'点、数学',i2,'点。この3科目の合計点は',i3,'点です。')

こんなかんじか。よく確かめていないが。
806デフォルトの名無しさん:2007/09/12(水) 14:59:44
>>804
ありがとうございます。コンパイルできました。

しかしまたあらたな問題が。
ネットでは>>802のプログラムをコンパイルして実行したら

「学籍番号122番のアキラ君は  英語50点,国語80点、数学30点。この3科目の合計点は160点です。」という文が表示されます。

とかいてあったのですが実際に実行したらコマンドプロンプトの画面に

C:\fortaran>format

とでてきて何かを入力するみたいなんですがどのように入力すればいいのでしょうか?

アキラ,122,50,80,30,160

と入力すればいいのでしょうか?でもコマンドプロンプト上では日本語入力できなくてこまってるんですけど。

すいません。また初歩的と思われる質問になってしまって。
お手数ですがよろしくお願いします。
807デフォルトの名無しさん:2007/09/12(水) 15:01:26
>>804
ありがとうございます。コンパイルできました。

しかしまたあらたな問題が。
ネットでは>>802のプログラムをコンパイルして実行したら

「学籍番号122番のアキラ君は  英語50点,国語80点、数学30点。この3科目の合計点は160点です。」という文が表示されます。

とかいてあったのですが実際に実行したらコマンドプロンプトの画面に

C:\fortaran>format

とでてきて何かを入力するみたいなんですがどのように入力すればいいのでしょうか?

アキラ,122,50,80,30,160

と入力すればいいのでしょうか?でもコマンドプロンプト上では日本語入力できなくてこまってるんですけど。

すいません。また初歩的と思われる質問になってしまって。
お手数ですがよろしくお願いします。
808デフォルトの名無しさん:2007/09/12(水) 15:02:19
すいません連続投稿となってしまいました。
809デフォルトの名無しさん:2007/09/12(水) 20:16:55
>>806
>何かを入力するみたいなんですが
つ READ文
使い方は(ry

>どのように入力すればいいのでしょうか?
アキラ122508030160

>コマンドプロンプト上では日本語入力できなくて
[Alt] + [半角/全角 漢字]

あと >>802 のプログラムは「変数の型」と「FORMAT文」について要復習だ。
810デフォルトの名無しさん:2007/09/14(金) 23:52:05
>>809
ありがとうございます。

もっとしっかり勉強します!
811デフォルトの名無しさん:2007/09/15(土) 23:10:26
http://www12.plala.or.jp/ksp/formula/mathFormula/html/node8.html

これらの式の右辺部を計算しようとした時に

式の通りに考えて

wa=(1/2)*(n*(n+1))
wa=(1/6)*(n*(n+1)*(2n+1))

のようにしたらうまく計算出来ずにnに何を入れても0が出てしまいます。


wa=(n*(n+1))/2
wa=(n*(n+1)*(2n+1))/6

みたいにしたら出来たのですが。。。
上と下の違いがよくわかりません。括弧などの付け方は間違ってないと思うのですが・・・

変数は
integer n
double precision wa
で設定しました。
812デフォルトの名無しさん:2007/09/15(土) 23:40:42
>>811
質問する時は一部だけ示すのではなく、コンパイル出来るソースを
最初から最後まで示すべき。

括弧の中の演算は先に実行されるから、先に(1/2)が計算される。
整数型同士の除算1/2は0となり、0と何が掛けられても0になる。
(1/2)でなく、(1./2.)と書いたら計算結果が変わるでしょ?
813811:2007/09/15(土) 23:58:14
質問の仕方が悪かったようで、申し訳ありませんでした。
今後はそのように質問させて頂きます。

問題は無事解決いたしました。どうも有り難うございました。
814デフォルトの名無しさん:2007/09/16(日) 23:00:33
素因数分解をするプログラムを組みました。
出力を99=1*3*3*11
みたいに1行に書きたいのですが
99=1
*3
*3
*11
のように複数行にわたってしまいます。これを改行せずに書きたいのですがどのようにしたらいいのでしょう。
文字列であれば
write(*,'(a\)')'hoge'
のように出来るのですが文字列と整数がごっちゃになった場合だとどうしてもうまくいかなくて・・・
アドバイスお願いします。
また、もしwrite文以外でもおかしな所があれば教えてください。

ソース(f90)は次の書き込みで書きます。
815814:2007/09/16(日) 23:01:56
  implicit none
  integer n,i,m,k

  write(*,'(a\)')'input n:'
  read(*,*)n

  write(*,*)n,'=1'
  k=n
  i=2
  do while (i<=k)
    m=mod(k,i)
    if(m==0)then
      write(*,*)'*',i
      k=k/i
      cycle
    else if(k==i)then
      exit
    else
      i=i+1
      cycle
    endif
  enddo
end
816デフォルトの名無しさん:2007/09/16(日) 23:21:51
write(*,'(A,I4,\)') '*', i
817デフォルトの名無しさん:2007/09/17(月) 00:45:50
>>814
program unko
implicit none
integer n,i,m,k
write(*,'(a)', ADVANCE='NO')'input n:'
read(*,*)n
write(*,'(i4, a)', ADVANCE='NO')n,'= 1'
k=n
i=2
do while (i<=k)
m=mod(k,i)
if(m==0)then
write(*, '(a, i3)', ADVANCE='NO') ' *', i
k=k/i
cycle
else if(k==i)then
exit
else
i=i+1
cycle
endif
enddo
WRITE(*, *)
end program unko

FORTRAN90の標準内でやろうとすると、ADVANCE='NO'を使うことになると思う。
818814:2007/09/17(月) 03:24:10
>>816
>>817
レス有り難うございます!
解決しました!なるほどそのように書けばよいのですか。

同じ改行しないようにするのでも
標準仕様とか拡張?仕様などによって変わるのですね。
819デフォルトの名無しさん:2007/09/19(水) 00:18:17
Visual Studio 2005 + Intel Fortran v10 で、ソース行のトレースバックってどうやって表示させるの?
CVFの時代は、簡単に出来たんだけど。
ソース行が分からないと、実行時エラーが出ても対処がめんどい。
820デフォルトの名無しさん:2007/09/20(木) 12:46:28
>>819
Version 9系ならソース行付きトレースバックでる。10と共存できるのでとりあえずそれで見たら?
821デフォルトの名無しさん:2007/09/20(木) 14:13:16
横に並んでいるデータをエクセルで1つのセルに表示させたいので、列ごとにファイルを出そうと思っているのですが
上手く読み込んでくれません。
わかるかたいたら教えていただきたいと思います。


program example
implicit real*8(a-h,o-z)
dimension x1(1000000),x2(1000000),x3(1000000),t(1000000)
open(200,file='iwayaguchi1023k.dat')
open(100,file='x1.dat')
open(110,file='x2.dat')
open(120,file='x3.dat')
m=16.d0
n=2.0**m
read(200,*)
read(200,*)
read(200,*)
read(200,600) (t(i),x1(i),x2(i),x3(i),i=1,n)
600 format(4f10.3)
do 10 k=1,n
read(300,*) x1(k)
read(300,*) x2(k)
read(300,*) x3(k)
write(100,*) x1(k)
write(110,*) x2(k)
write(120,*) x3(k)
10 continue
pause
stop
end
822デフォルトの名無しさん:2007/09/20(木) 14:14:33
ちなみにもとのデータは以下のようになっています


2004/10/23 17:56:00 37.2900 138.8000 13.0 6.8
NIG001 38.2584 138.4337 2004/10/23 17:56:21
172960.010 N-S E-W U-D
0.000 -0.023 -0.025 -0.001
0.010 -0.006 0.003 0.009
0.020 0.001 -0.023 0.016
0.030 -0.020 -0.044 0.002
0.040 -0.012 -0.021 -0.001
0.050 -0.005 0.002 0.006
0.060 0.021 -0.004 -0.006
0.070 0.012 -0.004 0.004
0.080 -0.022 -0.020 -0.007
0.090 -0.038 0.018 -0.031
(このようなのがずっと続く)
お願い致します。
823デフォルトの名無しさん:2007/09/20(木) 20:36:59
>>821
program hoge
implicit none
character*8 dmy
real*8 t, x1, x2, x3
integer i

open(200, file='iwayaguchi1023k.dat', status='OLD')
open(110, file='x1.txt', status='REPLACE')
open(120, file='x2.txt', status='REPLACE')
open(130, file='x3.txt', status='REPLACE')
do 10 i = 1, 3
read(200, *) dmy
10 continue
20 continue
read(200, fmt=*, end=99) t, x1, x2, x3
write(110, *) x1
write(120, *) x2
write(130, *) x3
goto 20
99 continue
close(200)
close(110)
close(120)
close(130)
stop
end

>横に並んでいるデータをエクセルで1つのセルに表示させたいので、
データファイルを開くときにテキストファイルウィザードで
「元のデータ形式」に「スペースによって右または…」を選択して[次へ]
フィールド区切りの矢印をダブルクリックですべて消して[完了]
824デフォルトの名無しさん:2007/09/21(金) 12:41:54
>>823
ありがとうございます。
おかげさまで問題解決いたしました。
825デフォルトの名無しさん:2007/09/21(金) 13:03:30
解決した、しなかっただけでなく、「どのようにして」のところを書いてほしい。
826デフォルトの名無しさん:2007/09/24(月) 15:01:57
多重積分で2次元から3次元に拡張しただけなのにunpaired right bracketsが
あることと、truncated lineがあるとエラーが出ました。こうしたエラーの
原因はなんでしょうか?
827デフォルトの名無しさん:2007/09/24(月) 16:36:38
>>826
超能力者になれるかな。
1行72文字オーバー
828デフォルトの名無しさん:2007/09/25(火) 13:34:14
825>
言われたとおりやったら解決いたしました
829デフォルトの名無しさん:2007/09/27(木) 01:52:57
質問させてください.
あるFortranの計算コード群をソースからビルドしライブラリを作成した後,
Cのコードから呼び出そうと考えています.
ここで
 (1) Fortranコンパイラでビルド
 (2) f2cされたコードをCコンパイラでビルド
の2つには有意な性能の差が生じるのでしょうか.
定説があれば教えて頂けると幸いです.
830デフォルトの名無しさん:2007/09/27(木) 03:29:22
定説はないので計ってみるしかない
自分の僅かな経験では
(1)Intel Fortran Compilerと(2) f2c + gccについて
自分の書いたソースで比べたところ(1)の方が速かった
831デフォルトの名無しさん:2007/09/27(木) 16:42:57
すいません。
計算終了時に何かしら音が出るようにしたいのですが、
何かBEEP音のようなものを出す命令はないのでしょうか。
832829:2007/09/28(金) 02:06:46
>>830
経験談ありがとうございます
時間のとれるときにじっくり計測してみたいと思います
833デフォルトの名無しさん:2007/09/30(日) 01:30:11
メモ帳でプログラムを組んでるんですが、インデントの感じが気に入りません。
Emacsみたいなフリーで手に入ってWindows XPで動くようなエディタはありませんか?
834デフォルトの名無しさん:2007/09/30(日) 01:45:58
>>833
気に入らないも何もメモ帳はインデントしてくれないだろ?
Emacsみたいなのが欲しいのなら、windowsで動くemacsクローンはMeadowとかいろいろある。
835833:2007/09/30(日) 09:48:23
notepadのインデントはtabをおしたら何行も進むという意味です。

meadowとxyzzyならどっちがいいでしょうか?
836デフォルトの名無しさん:2007/09/30(日) 14:49:56
>>835
手動インデントのことだったのか。てっきり自動インデントのことかと思った。
でも、タブで何行も進む?本当にそれはメモ帳?
835の「いい」の基準が分からないから実際にmeadowとxyzzyの両方を使ってみて気に入った方にすればいい。
慣れとかの点でemacs系を選択しようとしているんだと思うが、
emacsに拘らないのならメモ帳でソース書くよりは全然マシなフリーなエディタはwindowsにいくらでもあるぞ。
FORTRANに特化したものは無くてもFORTRANモード的なものを持ったものは何もemacsだけではない。
837デフォルトの名無しさん:2007/09/30(日) 18:37:01
メモ帳はTABキーを押しても「タブ文字」が挿入されるだけ。
838833:2007/09/30(日) 21:19:56
とりあえず、サクラエディタを入れてみました。
質問に答えていただいてありがとうございました。
839デフォルトの名無しさん:2007/10/02(火) 13:29:19
http://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran95/fortran77.htm

Fortranを始めようと思ってこのページにある方法でやろうとしているのですが
うまくいきません。

WRITE(*,*) 'TEST'
END
と入力してコンパイルしようとしても
「コンパイルに失敗しました
ファイルC:\.....\fotran.exeは存在しません」
と言われて実行することが出来ません。
これはどうすれば良いのでしょうか?
いますぐFortranを練習する必要があり、困っています。
どなたかお願い致します。
840デフォルトの名無しさん:2007/10/02(火) 14:00:49
>>839
fortran.exeがどこにあるか検索してみては?
そんなに急ぐなら、周りの友達に飯でも奢って助けてもらったら?
841デフォルトの名無しさん:2007/10/02(火) 14:12:49
>>840
fortran.exeの場所はちゃんと指定しています。
コンパイルして作成されるはずの実行ファイルがないと
言われているのですが。
それと
周りにfortranを扱える人はいません。

842デフォルトの名無しさん:2007/10/02(火) 14:37:30
コンパイルして作成されるはずの実行ファイルがC:\.....\fotran.exeなの?
それはコンパイラ自身じゃないの?
FORTRAN処理系が何で、どういうインストールの仕方をして、
どこに何というソースファイルを作って、どういうふうにコンパイルをしたか、
詳しく書かないと原因がよくわからない。
単にWindowsのコマンドプロンプトの使い方が分かってないだけの問題ということはない?
843デフォルトの名無しさん:2007/10/02(火) 14:44:14
WRITE(*,*) 'TEST'とENDの前に6つのスペース入れていないに1票
844デフォルトの名無しさん:2007/10/02(火) 15:01:19
>>843
ありがとうございます。
スペースを入れるとうまくいきました。

でも
http://ace.phys.h.kyoto-u.ac.jp/~tomita/education/fortran90/examples/ex1_1.f90

このページにあるプログラムをそのままコピペして使おうとしても
なぜか同じエラーが出てしまうのですが
これはなぜなのでしょうか?
スペースはちゃんと入っているはずなのですが
845デフォルトの名無しさん:2007/10/02(火) 15:10:19
なんでそれで
「コンパイルに失敗しました
ファイルC:\.....\fotran.exeは存在しません」
なんてエラーメッセージがでるんだよw
846デフォルトの名無しさん:2007/10/02(火) 15:30:46
>>844
Fortran77のコンパイラでFortran90のコードをコンパイルするのは無理だと思いますよ。
FTN95でもインストールして見てはいかがですか?

>>845
おまい、頭悪いな。>>839がコードのファイル名をfotran.for'として
保存したからに決まってるだろw
847デフォルトの名無しさん:2007/10/02(火) 15:47:00
Fortran90とFTN95って
どちらの方が新しいのでしょうか?
848844:2007/10/02(火) 16:01:30
そんなに特殊な記述を使わない限り90の記述でも
77で使えると聞いたのですが違うのでしょうか?
一体どこの部分を治せばコンパイル可能になりますか?

!----- Ex1_1: 3種類の平均値 -----
PROGRAM Example_1_1
REAL :: a, b, av1, av2, av3
READ *, a, b
av1 = (a + b)/2.0
av2 = (a*b)**0.5
av3 = 2.0/(1.0/a + 1.0/b)
PRINT*, av1, av2, av3
END

849デフォルトの名無しさん:2007/10/02(火) 16:19:57
>>848
REALから始まる行を削除すればいい。
850デフォルトの名無しさん:2007/10/02(火) 16:24:48
>>849
やってみました。
でもうまくいかないようなんですが・・・
851デフォルトの名無しさん:2007/10/02(火) 16:45:54
http://www.silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.asp
を使ってみましたが
それでもうまくいきません。
なんなんでしょうか?これは?
852デフォルトの名無しさん:2007/10/02(火) 16:51:26
>>846
「コンパイルに失敗しました」はコンパイラの吐くエラーだし
作られたはずの実行ファイルが無いというメッセージはコンパイラが吐くとは思えないんだが
853デフォルトの名無しさん:2007/10/02(火) 17:52:13
>>851
普通にそのコンパイラで>>844のコードも>>848のコードも動きました。
付属のPlato3起動して左上のマウスを乗せるとNewを表示される白いアイコンをクリック
出てきたウィンドウでFree format Fortran source fileが選択されてる事を確認してOKを押す
>>844をコピペしたら、左上のマウスを乗せるとStartと表示される青い三角アイコンをクリック
適当なファイル名で保存(拡張子は弄らない) 保存後にウィンドウが出るが気にせずOKをクリック
で動かなければ後は白根山

>>852
実行ファイルが無いというメッセージはCpadが吐いてる。
854デフォルトの名無しさん:2007/10/02(火) 19:24:31
>>853
丁寧な解説ありがとうございます。

しかし


それと同じことはすでに行っているのですが
http://sakuratan.ddo.jp/imgboard/img-box/img20071002191043.jpg
のようなコマンドプロンプト画面が出てくるだけでプログラムが始まりません。
OSはXPsp2なのですが、それと何か関係があるのでしょうか?
855854:2007/10/02(火) 19:31:26
すいません、解決しました。
数値を入力すれば良かったんですね。
ありがとうございます。


でも
>>848-849
のように>>839のコンパイラでうまくいかないのはなぜなのでしょうか?
実際に使用するのはFortran77なので
77に準拠したコンパイラを使いたいのですが。
856デフォルトの名無しさん:2007/10/02(火) 21:53:39
>>855
何をやったのか
どんな結果になってうまくいかなかったのか
エラーメッセージが出たらその内容

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

全部>>839に書いてあるのですが・・・
858デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/03(水) 11:51:10
>>859
1から6カラムまで開けろや!
861デフォルトの名無しさん:2007/10/03(水) 12:34:36
>>860

すいません、どういう意味ですか?
開けるというのは何を開けるのですか?
862デフォルトの名無しさん:2007/10/03(水) 18:12:30
言っちゃ何だが、FORTRANの文法をよく勉強したほうが
いいんじゃないか?

自分のしたいことをコード化できないようじゃ理論ギャップ
があるのかバグがあるのか判断できないじゃまいか。
863デフォルトの名無しさん:2007/10/03(水) 18:14:39
勉強はするつもりです。
だからとりあえずコンパイラがちゃんと動くしたいのです。
864デフォルトの名無しさん:2007/10/03(水) 18:42:19
じゃあ、エラーメッセージ読んで考えろよw
865デフォルトの名無しさん:2007/10/04(木) 03:45:16
>>861
>>843

どんな入門書でも最初の数ページ以内に書いてあるような基本的なことだぞ。
ちゃんとしたプログラムが書けなきゃコンパイラがちゃんと動くかどうかも確認できないぞ。
866デフォルトの名無しさん:2007/10/04(木) 11:29:36
>>865
Fortran90と混同しているから、教えるのはかなり大変だぞwwww

教育者としての真価が問われる。 神化しないと切れるだろうwwwwwwwwwww
867デフォルトの名無しさん:2007/10/05(金) 03:23:05
もやすみちゃん
868デフォルトの名無しさん:2007/10/06(土) 01:50:10
関数をサブルーチンの引数とすることはできるのでしょうか?
サブルーチンの引数として被積分関数や積分範囲等を設定できればと思っています。
どなたかわかる方がいらっしゃいましたら、ご教授いただければと思います。
869デフォルトの名無しさん:2007/10/06(土) 09:45:37
>>868
制限付きでできる。
external 指定をすればよろし。マニュアル味噌。
870デフォルトの名無しさん:2007/10/06(土) 13:13:54
>>869

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

途中コンパイルがなかなか通らずどうしたものかと頭を抱えましたが、
「EXTERNALの指定でうまくいく!」という道筋を示していただけたおかげで、エラーの原因を他のところに絞り込むことができました。
871デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/08(月) 12:58:33
>>871
代入文をよく見直せ。
873デフォルトの名無しさん:2007/10/08(月) 16:23:34
>>871
ct = transpose( c )
でもできる。
874871:2007/10/08(月) 18:01:42
>>872
c(i, j) = ct(j, i)
のところでしょうか?
875デフォルトの名無しさん:2007/10/08(月) 19:11:47
c が元の行列
ct が転置行列
だよな?
876871:2007/10/08(月) 20:18:58
>>875
そうです。
cは適当に乱数で決定されるようにしました。
877デフォルトの名無しさん:2007/10/08(月) 22:50:50
> c(i, j) = ct(j, i)
c(i, j) に ct(j, i) の内容を代入
878871: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デフォルトの名無しさん:2007/10/15(月) 17:23:19
マルチすんなハゲ
882デフォルトの名無しさん:2007/10/15(月) 18:36:36
>>879
前とは先頭のほうだw
883デフォルトの名無しさん:2007/10/16(火) 01:11:01
 googleg
G| o o |g
 | L  |
 \_e__/ <ぐぐれかす

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

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

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

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

解決方法分かる方よろしくお願いします。
886デフォルトの名無しさん:2007/10/16(火) 02:44:09
>>884
>>355

fcpadは自由形式のプログラム編集には使えない(向かない)けどな
887デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/18(木) 01:33:51
>>887
a,bをINTEGERで宣言しているので、その割り算は切り捨てになる。
889デフォルトの名無しさん:2007/10/18(木) 12:04:30
結果自体が表示されないんですが…。
realで宣言しても同じです

割り算以外の演算は問題なしです
890デフォルトの名無しさん:2007/10/18(木) 17:37:05
>>889
どのようにおかしいか、出力例も交えて、もっと情報を提供しなさい。
>>887の内容では誰も答えられない。
891デフォルトの名無しさん:2007/10/18(木) 17:51:28
>>887
やってみた。

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

代わりに
4 "/" 2
あるいは
4 '/' 2
と入力したら
= 2
を返した。
892デフォルトの名無しさん:2007/10/18(木) 19:00:27
ゲイツにきけwwwwwww
893デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/18(木) 20:46:18
誰か、Fortranで(いろんな意味で)生産性の高いコードを書くコツみたいの、挙げてくれ
Fortranユーザって他の言語に比べてそういうのあんまり意識しなさそうだけど
895デフォルトの名無しさん:2007/10/18(木) 21:59:39
896デフォルトの名無しさん:2007/10/18(木) 22:43:34
速度を犠牲にせずに生産性を上げるってのはなかなか難しいね
897デフォルトの名無しさん:2007/10/18(木) 23:12:52
>>891
>>893
ありがとうございました。
FORTRAN学びはじめなので細かいところが分からず
898デフォルトの名無しさん:2007/10/22(月) 14:31:50
FortranのIDEみたいな開発環境あるんでしょうか?
899デフォルトの名無しさん:2007/10/22(月) 19:35:15
>>898
色々あることはある。
どういうのが望みだ?

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

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

規模が大きくなるとサブルーチンの管理とか大変ですよね
皆さんどうやってるんでしょうか?
901デフォルトの名無しさん: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というのがある。
http://www.eclipse.org/photran/

他にもフリーの環境はある。
昔ロシア人が貧乏人向けにg77とフリー統合環境と廃版英語Textbookを束ねて配っていたのだが、
最近はもう時代遅れか・・・
902898:2007/10/23(火) 02:45:05
>>901
ありがとうございます。
Visual Studioに対応してるとは知りませんでした。ちょっとやってみます。

そういえばこれ、当然ながらWindowsでの開発だと思いますが、
Visual C++みたいな独自拡張とかはあるんでしょうか?
せっかく作ったのにLinuxで動かないとなったら困りますよね・・
903デフォルトの名無しさん:2007/10/23(火) 02:51:27
色分けやdo-enddoの自動インデントならvimでもやってくれますね。
904デフォルトの名無しさん:2007/10/23(火) 11:46:22
>>902
.NET対応版とか、Windows API 呼び出しとかしなければ、常識的な範囲でOK。
905デフォルトの名無しさん:2007/10/23(火) 15:25:50
vimのfotranの色づけはデフォルトだとイマイチなんすけど
ドキュメント読むの面倒なんで、お勧め設定晒してもらいませんか?
906905:2007/10/23(火) 15:26:50
×もらいませんか
○もらえませんか
907デフォルトの名無しさん:2007/10/23(火) 18:11:51
Fortran90ではコメント「c」やCOMMONは使えないんですか?
77の(ほぼ)スーパーセットと聞いたんですが、やってみたら駄目でした。

てことは、77のコードをポートするには一般に結構な書き換えを要する、ってことですかやっぱ
908デフォルトの名無しさん:2007/10/23(火) 18:17:28
>>907
先頭cコメントを使うためには、固定形式で記述する必要がある。
中途半端に自由形式を導入していないか?
回答者のために、コンパイラー名を書こう。
909907:2007/10/23(火) 18:36:30
>>908
レスありがとうございます。
>先頭cコメントを使うためには、固定形式で記述する必要がある。
そうなんですか。Intel Fortran 9.0なのですが、
固定形式か自由形式かはどうやって決まるんですか?
拡張子(というかsuffix)?

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


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

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

1つのソースに固定形式/自由形式を混ぜてはいけない。
ただし、別々のファイルにすれば混在させることも出来る。
911907:2007/10/23(火) 23:48:50
>>910
ありがとうございます。非常に勉強になりました。
912デフォルトの名無しさん:2007/10/24(水) 03:21:45
High Performance Fortranていう仕様があるようですが、どういうところで使われているんですか?
普通のユーザには縁のないものですか
913デフォルトの名無しさん:2007/10/24(水) 09:04:39
>>912
90年代に並列プログラミングを考慮した規格として提案された。
日本のスーパーコンピュータメーカはコンパイラをちゃんと作ったが、
アメリカがやる気を見せず崩壊した。

地球シミュレータでもHPFは動いている。というかHPFはESに要求された仕様の一つだったような。
914デフォルトの名無しさん:2007/10/24(水) 11:13:06
>>913
崩壊、ですか・・・

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

今はFortran90+MPIという組み合わせが一般的だと思いますが、これよりも良い性能が出るんですか?
915デフォルトの名無しさん:2007/10/24(水) 13:22:45
>>914
MPIはどちらかというと消極的な理由でデファクトスタンダードになった。

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


ここに過渡期に実務で使った人の比較意見が載ってる。
ttp://grape.mtk.nao.ac.jp/~makino/articles/future_sc/note031.html#rdocsect36
916デフォルトの名無しさん:2007/10/24(水) 16:03:35
>>915
消極的ですか。確かにそんな気もしますね
OOPの可能性にwktkするも、性能とのトレードオフに嘆き、手続き型も含めた現実的な方法に帰着する、という話と似てるかも

ところでそのサイト見ていつも思うんですが、マ○ノさんてすごい人ですよね
ここまでコアな人はなかなかいないと思う
917912=914=916:2007/10/24(水) 16:04:56
>>915
スイマセン、お礼言うの忘れてました。
どうも有難うございました。
918デフォルトの名無しさん: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デフォルトの名無しさん:2007/10/29(月) 23:32:38
COMMONブロックをモジュールに書き換える作業をしております。その際わからないことがあったので質問させてください。
http://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 というエラーが出てしまいます。
これはどのように解決したらよいのでしょうか。よろしくお願いします。
921918:2007/10/29(月) 23:48:47
>>919
欲しい結果が表示されました。ありがとうございます。
922デフォルトの名無しさん:2007/10/30(火) 00:56:45
>>920
それはエラーメッセージに書いてあるがごとく、複数のモジュールの中で同じシンボル名を
重複して使っているという事だろう。


コモンブロックに当たるモジュールは1個だけ作って、それをUSEで呼び出せばいい。
コモンのときは全副プログラムにコモンを置かねばならなかったが、もジュールは違う。
923デフォルトの名無しさん:2007/10/30(火) 14:05:25
CHARACTER*(*) HOGE のように、配列数が(*)となっているのはどういう意味なんでしょうか
動的に確保するということでしょうか?
924デフォルトの名無しさん:2007/10/31(水) 01:18:34
>>923
HOGEの長さは
HOGEが定数の場合、PARAMETER文で指定された文字列の長さ。
HOGEが副プログラムの仮引数の場合、対応する実引数と同じ長さ。
HOGEが関数副プログラムの場合、その関数を使用する側で予め決められた長さ。
925920:2007/10/31(水) 05:54:42
>>922
遅くなって申し訳ありません。レス有り難うございました。
なるほど、モジュールは一度読み込めばよいと言うことだったんですか。
そこで、サブルーチン中のuse文を消してみたところ
そのエラーは吐かなくなりました。
その代わり
x0(n)=2.d0*rn
 1
Unexpected array Reference at (1)
と言ったようなエラーが出るようになってしまいました。エラー文では配列の参照がおかしいみたいなことを書いてますがどのようなことなのでしょう。
内容が同じ物をcommon文としてかいた時は問題なく動作したので
配列の宣言がおかしいってこともないと思うのですが・・・
926デフォルトの名無しさん:2007/10/31(水) 10:58:31
>>923
FORTRAN90以前では、基本的に変数は参照渡しで、実際には先頭番地しか渡していない。
また呼び出し側と呼び出される側での引数の整合性もチェックしていない。
さらに実行時にも、デバッグオプションをつけない限り、はみだしチェックのようなことはやってない。

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

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

Fortran90以後は、色々コンパイル時のチェックが入るようになって、PASCALみたいでうぜぇという人達もいる。
最近のスクリプト言語は、型にゆるいのが多いが、昔のFORTRANに先祖がえりしているのである(嘘w
927デフォルトの名無しさん:2007/10/31(水) 11:01:20
>>925
モジュールの宣言は1個で、USEは使うルーチンごと毎回だ。
カスケード的にUSEしているなら、深いほうで1回読んでおけばいい。
928923:2007/10/31(水) 18:13:56
どうもありがとうございます。

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

>>926
ということは、サブルーチン仮引数の配列は全部*にすれば、配列サイズの違いに悩まされることもないのですよね?
例題などで、配列を10などと明示的に指定しているのを多く見かけるのですが・・・
929デフォルトの名無しさん: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
931930: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デフォルトの名無しさん: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デフォルトの名無しさん: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
)
934923:2007/11/01(木) 13:21:29
>>929
>どっちにしろ配列の先頭アドレスしか渡さないので、サイズの違いに悩まされることは無い。
そうなんですか。ちょっと混乱してきたのですが
ということは、仮引数の配列数は結局は関係ないということですか?

>いや、別に10のままでも、本質的には何も変わらない。
では仮引数の配列数を明示指定するのは、単なる慣習みたいなもの、ってことですか?
935デフォルトの名無しさん: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)
936923:2007/11/02(金) 14:17:22
>>935
なるほど・・・よくわかりました。そういうコアな話を聞ける人が周りにいないもので、とても勉強になります。
丁寧な解説ありがとうございました
937デフォルトの名無しさん:2007/11/04(日) 14:04:31
>ただテキストの場合は、本当に10個の要素だと思うがw
これどういう意味ですか?
文字列配列も普通の配列に変わりはないと思うんですが
938デフォルトの名無しさん:2007/11/04(日) 18:15:19
>>937
テキストは本当に10個に固定の要素を扱っているのではないかという事。
深い意味は無い。
939937: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デフォルトの名無しさん:2007/11/05(月) 03:17:08
>>939
たぶんサブルーチン側ではtext*2で宣言しているので、
sub1 では text(1:2) = 'b ' の扱いになったんだと思う。
参照渡しなのは変わんないと思う。

text = 'b' は、一文字目は'b'として2文字目以降宣言長まではスペースを補填するのだと思う。
941デフォルトの名無しさん:2007/11/07(水) 13:28:20
fortranの仕様ってどこが決めてるの?
少なくとも数値計算屋だよね?
942デフォルトの名無しさん:2007/11/08(木) 00:39:48
>>941
ttp://www.j3-fortran.org/

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

Fortran2008で、Crayのハードウェアに最適化されているCoArrayが規格に入ったのが気に食わない。
943デフォルトの名無しさん:2007/11/08(木) 01:06:31
コーエンちゃん早く2003の処理系つくって
944デフォルトの名無しさん:2007/11/08(木) 14:40:25
>>942
やっぱ向こうじゃNECよりCrayが優先されるんだろうね
945デフォルトの名無しさん:2007/11/08(木) 23:02:52
>>944
『向こう』ってなんだよw 欧米コンプレックスの40代の爺さんかよwwww

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

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

947デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/10(土) 23:44:30
そういやIntel Fortran もようやく ACCESS='STREAM' が使えるようになったな。
これで処理系毎に書き直さなくて済むようになる。
949デフォルトの名無しさん:2007/11/10(土) 23:58:25
>>947
ありがとうございます。

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

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

4byteの変数を出力する際、1byteずつ逆から出力する必要があるってことですよね・・
950デフォルトの名無しさん:2007/11/11(日) 01:12:25
>>949
文字列で読み出して、それをINTEGERやREALやREAL*8とEquivalenceをかけて置けばOK


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

951デフォルトの名無しさん:2007/11/11(日) 01:14:51
Fortran2003でOPEN( ... ACCESS='STREAM') が規格に入ったので、新しいコンパイラなら先取り導入
されている可能性大。
952949: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デフォルトの名無しさん: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
9541/2: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
!---------------------------------------------------------------------
9552/2: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デフォルトの名無しさん:2007/11/13(火) 01:50:22
readで配列の行数列数を指定せずにファイルを読み込むにはどうしたらいいんでしょうか?
「end-of-file during read, unit 5」と表示されてしまい、どうやらEND=100のように文番号を指定する必要があるみたいなのですが、
どのように記述すればいいのか分かりません。
どなたか教えてくれませんか?
958デフォルトの名無しさん:2007/11/13(火) 07:28:49
>>957
とりあえず切り抜けるには、
READ(nn, *, END =10) A
10 CONTINUE
959957:2007/11/13(火) 11:17:16
>>958
出来ました!
かなり助かりました。ありがとうございます。
960デフォルトの名無しさん:2007/11/13(火) 15:23:03
はじめまして、初めて書き込みするものです。
C言語のプログラムをfortran90で書き換えようとしてるんですが、
C言語の
do{
処理文
}while(条件)
に対応するfortranの命令文は何を使って書けばいいんでしょうか?

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

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

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

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

条件判定が後ろにないとダメな(最低1回は実行する)場合は
DO
処理文
IF (.NOT. 条件) EXIT
END DO
962デフォルトの名無しさん:2007/11/13(火) 22:27:56
>>960
Fortranでは引数は基本的にすべて参照渡しなので
普通に渡して仮引数を書き換えれば実引数の値も変わる。

サブルーチン側で勝手に書き換えられては困る場合は
仮引数に INTENT(IN) 属性を付けておけば書き換えられない
ようになる。というかコンパイル時にエラーにしてくれる(はず)
963デフォルトの名無しさん:2007/11/14(水) 00:07:58
>>961
FortranにREPEAT〜UNTIL型の構造が入らなかったのは何故なんだろうね?
FORTRA66時代のDO〜LOOPがREPEAT〜UNTIL型だった呪いかな?w

>>962
F2003で引数にVALUE属性が導入されるらしい。
コンパイラによっては今でも独自拡張で出来なくも無いが。
964デフォルトの名無しさん:2007/11/14(水) 13:38:29
>>961
>>962
ありがとうございます!とても参考になりました。
教えていただいたことを使ってもう一度やってみます。
また分からないことが出てきてしまうと思うので
そのときはまたよろしくお願いします。
965デフォルトの名無しさん:2007/11/19(月) 14:10:39
保守代わりに下らない質問
77にはDO WHILE文は無いよね?
77ではIF(〜) GO TO 〜ってやるしかないよね?
966デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/20(火) 23:02:03
>>965
DO WHILEはないが、GOTOの種類ならたくさんあるぞw

>>966
mはintegerだから
基本整数型が32bitの場合、2147483648以上の数は扱えない。
968デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/21(水) 19:50:57
972デフォルトの名無しさん:2007/11/22(木) 00:50:42
>>970
特にこだわる理由が無いならFTN95を入れるという選択肢もある。
973970:2007/11/22(木) 14:49:08
ありがとうございました。
これで家でも使えるようになりました。
974デフォルトの名無しさん:2007/11/23(金) 21:09:52
学生時代、情報科の先生にプログラミング言語は何教わった?と聞かれて
Fortran77ですと答えたら、それ古いぞ今はCだと言われた。
それからだいぶ経つのに、77を教わっている学生さんが居るとは、
教えてる奴はよっぽど77好きなんだろうな。
975デフォルトの名無しさん:2007/11/23(金) 21:19:46
計算科学あたりでは今でも F77 教えてたりする。
今はもう C すら古いというのに。
976デフォルトの名無しさん: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デフォルトの名無しさん:2007/11/23(金) 23:21:36
>>974-975
真理は時間や空間には依存しないもの。
流行り廃りがあるような内容は、学問ととして伝授するに値しない。
FOTRANは、普遍的不変なる価値を持つのだ。

50年前のコードが動いて、実際使われているんだから、
こんな再利用可能な習得価値のある言語は無い。
978デフォルトの名無しさん:2007/11/23(金) 23:32:26
バグを抑制するための仕様が貧弱だから
保守が大変なんだよ。
979デフォルトの名無しさん:2007/11/23(金) 23:57:45
C言語のことかーーーっ!!!
980デフォルトの名無しさん:2007/11/23(金) 23:58:50
ちょっと前はとりあえずF77でやっときゃおk、だったが今はさすがにF90だろ
いつまでも研究室レベルのコードでいいなら別に構わんけど
981デフォルトの名無しさん:2007/11/24(土) 00:31:30
F90からいきなり入った連中は、変数命名の伝統を守らなかったりするので、再教育が面倒。
規格を硬くして厳格に守るべき部分もあるが、自由度を大きくしたまま慣習法によって厳格に守る部分
があってもいい。いざというときだけ破格で逃げる。とにかくバランスを間違えてはいけない。

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

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

まぁ、FORTRAN全盛時代の代表的なテキストたる浦昭二のFORTRAN本も暗黙の型を
守っていないのでどうしようもないのだがw
982デフォルトの名無しさん:2007/11/24(土) 00:44:51
FORTRAN77 を使ってあまりの酷さに逃げたわ。
何、あの引数の数。構造体が無いから酷い。
それを避けようとしたら COMMON 変数まみれ。
最悪だ。
983デフォルトの名無しさん:2007/11/24(土) 01:22:57
>>982
FORTRANではバッチ処理で物理メモリーを限界まで使うことが多いが、
そうなると自由にメモリーを再利用できるCOMMONは非常に便利。
メモリーが貴重な時代には非常に合理的な仕組みだった。
今風に言うとガベージコレクションを自分でやれる。

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

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

984デフォルトの名無しさん:2007/11/24(土) 10:01:32
プログラマにはそんな無駄な根性なんて要らない。
985デフォルトの名無しさん:2007/11/24(土) 10:19:09
必要なのはデスマを生き抜く体力のみ。
986デフォルトの名無しさん:2007/11/24(土) 19:59:15
Fortran77 は、1977年以前に生まれた人間しか使ってはいけないそうな
987デフォルトの名無しさん:2007/11/25(日) 14:17:12
楽勝で使えるぞな
988デフォルトの名無しさん:2007/11/26(月) 00:39:37
そろそろ次スレ用のテンプレについて議論しよう。
989デフォルトの名無しさん:2007/11/26(月) 12:29:10
テンプレって無視されるのが普通だからどうでもいいような気もするけどね。
コンパイラのリンクとか宿題丸投げ用テンプレでも入れる?
F77やF90の簡単な説明もあると良いかな?自分が習ってるのがどっちか分からない子用に
990デフォルトの名無しさん:2007/11/26(月) 23:22:19
>>989
たしかにF77とF90以降の区別は重要だな。質問のときにはっきりさせろと。

あとは、文字列を数字に直すというFAQかな?
991デフォルトの名無しさん:2007/11/27(火) 11:33:52
テンプレ議論するには残り少なすぎ・・・
まぁ内部ファイルの質問は多いから入れとこうか
992デフォルトの名無しさん:2007/11/28(水) 11:46:42
>>995が次スレを立てるという事で
993デフォルトの名無しさん:2007/11/30(金) 07:37:24
F
994デフォルトの名無しさん:2007/11/30(金) 08:34:03
バイナリデータを書き込むと先頭に余分な6バイトがついてしまいます。
純粋なデータのみを書き込みたいのですが、どのコマンドを使えばよいのでしょうか?
995デフォルトの名無しさん: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バイトがつくというのは、こういう状況か?
996995:2007/11/30(金) 09:40:56
×statu="new"
○status="new"
997デフォルトの名無しさん:2007/11/30(金) 11:29:16
>>994
コンパイラ・処理系などは何だ?

998デフォルトの名無しさん:2007/11/30(金) 14:00:28
くだすれFORTRAN(超初心者用)その3
http://pc11.2ch.net/test/read.cgi/tech/1196384126/
999デフォルトの名無しさん:2007/12/01(土) 12:56:23
1000デフォルトの名無しさん:2007/12/01(土) 12:57:05
( ´ー`) 1000 !
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。