[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 06/21 19:50 / Filesize : 120 KB / Number-of Response : 304
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2006/11/22(水) 00:00:36 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
FORTRAN使いが優しくコメントを返しますが、
お礼はFORTRANの布教と初心者の救済と次期Fortran2008規格でのCOMEFROM文採用をお願いします。

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


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

●関連スレ
FORTRAN W
pc8.2ch.net/test/read.cgi/tech/1163319215/


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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 07:47:54 ]
>>178
十分初心者向け

180 名前:デフォルトの名無しさん mailto:sage [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!通り存在するが、これらを全て重複なくリストアップする
プログラムを作れ。

というものです。

182 名前:181 [2007/01/13(土) 13:08:34 ]
追加です。

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

ってのを忘れてました。
よろしくお願いします。

183 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 13:23:09 ]
順列 再帰 でググるといいかも



184 名前:デフォルトの名無しさん [2007/01/13(土) 13:43:50 ]
三つの数値データを与えてその三つの数値の最大値、最小値、中央値、
平均値、標準偏差、不偏分散を求められるプログラムを作成せよ。
という問題が出されてわからなくて大変です。
誰か教えてください。


185 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 13:57:58 ]
> 数字1.2.・・・.nを様々な順序に並べたものを置換という。
なぜ教育課程でも使われている順列という定義があるのに、独自の定義をするのだろう?

186 名前:172 [2007/01/13(土) 15:13:59 ]
どなたかお願いしますorz

187 名前:デフォルトの名無しさん [2007/01/13(土) 15:41:25 ]
184頼みます

188 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/13(土) 18:55:28 ]
>>185
有限群論とかでは置換群とか呼ぶから、そっち方面の方言だべ

190 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:12:32 ]
どなたか171お願いします

195 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:37:31 ]
>>171
>[4F12.7]は4回実数を繰り返し表示する、という意味であっているのでしょうか?
はい、幅12小数部7桁の実数を4回表示する、という意味です。

>あと、Tが何のためにあるのかがわかりません。
何ででしょうね。 時間も表示させたかったんじゃないですかね。

196 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:39:09 ]
>>194
4F12.7の4は反復数、Tは出力するREAL*8型の変数。

197 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 00:48:03 ]
>>192
配列構成子を使って配列に値を代入する。

198 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:43:43 ]
>>192
x(1)=10.0
x(2)=1.0
x(3)=5.0
と同じこと。

199 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 01:45:33 ]
>>193
解法とプログラムのどちらが解らないのかはっきりしたまえ。

200 名前:193 [2007/01/14(日) 08:13:45 ]
>>199
プログラムが分かりません。
よろしくお願いします。

201 名前:デフォルトの名無しさん mailto:sage [2007/01/14(日) 09:45:27 ]
>>200
我輩が知っている解法ではdo文と配列は使用するが、
if文は使用しないのだ。
その、解法を提示しろ。

202 名前:193 [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 名前:デフォルトの名無しさん mailto:sage [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

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

↑の形にこだわらなくてもいいので、
同じことができる方法があれば教えてください。

209 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:04:40 ]
>>207
fortran90は使ったことないが、
> real,intent(in) :: n, unit, file
realじゃいやーん
といってるんだろ。

210 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 10:37:07 ]
>>211
三角関数の振動の周期と積分のステップ幅の関係を考えねば。
たぶん2π/650〜Δ1/1000くらいなんだろ。
積分範囲が分からんので断言できないが・


213 名前:デフォルトの名無しさん [2007/01/17(水) 18:19:49 ]
>>209
ありがとうございます。
これ書いたときはだいぶ疲れてて気がつきませんでした。

そもそも文字列(ファイル名)を引数にしようとしていました。



214 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/20(土) 01:25:00 ]
f2cで変換したソースを読む気がしない

219 名前:デフォルトの名無しさん mailto:sage [2007/01/21(日) 02:04:51 ]
exe にしたファイルを元に戻したいのですが何か良いツールはないでしょうか?
20行くらいの簡単なファイルなのですが数がめちゃくちゃあって一から入力する気になれないです
どなたかそんなツール知っている方いましたらレスお願いします

220 名前:デフォルトの名無しさん [2007/01/21(日) 10:59:47 ]
>>219
つ 「逆アセンブラ」「逆コンパイラ」

まあ、こいつらの出力を見たら一から入力する気になると思うがな。

221 名前:215 [2007/01/21(日) 18:04:45 ]
>>216
>>217
なるほど...fortran奥が深いですね

222 名前:デフォルトの名無しさん mailto:sage [2007/01/22(月) 22:44:47 ]
>>220

それをやってくれるツールみたいなのはないのでしょうか?
フリー・シェアのどちらでも構わないのですが・・・


223 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 00:32:55 ]
>>222
Googleで「逆アセンブラ」とか「逆コンパイラ」で検索すれば色々見つかるよ。
Fortranの逆コンパイラは知らんが。

但し、実行ファイルから完全に元のソースにもどしてくれるようなものを期待しているのなら
そんなのもは無い。



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


225 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 15:09:45 ]
>>223

ない

228 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 21:22:12 ]
ん? なにが?

229 名前:デフォルトの名無しさん mailto:sage [2007/01/26(金) 09:44:10 ]
文脈から判断すると、fortran逆コンパイラ。

230 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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


233 名前:age [2007/01/31(水) 00:11:58 ]
ご指導ください.
関数副プログラムをF1,F2として,
A=F1*F2
としたとき,
write(*,*) A,F1*F2
の結果が

NaN,[実数値]

となるのはなぜですか?????
謎です・・・



234 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 02:15:26 ]
>>233
ソースがないとなんとも言えないが、
変数の型は大丈夫かな?

235 名前:デフォルトの名無しさん [2007/01/31(水) 03:00:46 ]
>>233
NaNとはNot A Numberの略で、実数として違法な表現が入っている場合などに起きる。

コードをもう少し広く見ないと分からない。
>234の言うように型を間違えている可能性が高い。


236 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 04:39:27 ]
>234,235
ご回答ありがとうございます.
そうですか・・・
関数も倍精度,代入している変数も倍精度で定義しています.
なぜ代入してから表示するのと,代入する前の状態で表示するのと
で変わるのでしょうか?

関数は内部関数にしているのですが,なにか関係があるのでしょうか?
コードを貼り付けると非常に長くなりますので,
考えうる可能性としてはどのようなものがあるのでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2007/01/31(水) 04:46:39 ]
A=F1*F2からwrite(*,*) A,F1*F2までの間で何かAに副作用を及ぼすようなことをしていない?

238 名前:230 mailto:sage [2007/01/31(水) 08:04:05 ]
>>232
ありがとうございます。できました。
DO WHILE 使わなくても出来ますね。全然気がつきませんでした。

239 名前:デフォルトの名無しさん mailto:sage [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あたりを使うがよろしい。
プログラム書法では推奨されていたが、もはや時代遅れ。

詳しくはマニャル嫁。

242 名前:240 [2007/02/02(金) 13:02:07 ]
>>241
はい!せんせい

243 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 19:54:46 ]
すいません自己解決しました
読み込むファイルのスペースの数が悪いようでした
書き換えます・・

247 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 14:19:09 ]
すみません;
× test.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので
○ main.f90がメインルーチンで,サブルーチンの入ったsub1.f90に依存しているので

あとコマンド行の前にはもちろんタブが入ってます.

250 名前:デフォルトの名無しさん mailto:sage [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”を指定する必要がある。

詳しくはマニャル嫁


252 名前:248 mailto:sage [2007/02/04(日) 00:39:15 ]
>>250
ありがとうございます!
NMAKEの仕様を調べなおします.

253 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:18:47 ]
>>254
>missになる仕事のとき、xを初期値に戻すためにどういう式を使ったらいいかがわかりません。
繰り返し処理に入る前に x の初期値を適当な変数に保存しておく。
missに +1するところで保存しておいた値を x に代入する。

256 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:45:13 ]
>>254
その日本語の解説どおりにFortranで書けばOKだ。
ほとんど完成している。


257 名前:デフォルトの名無しさん [2007/02/08(木) 18:22:36 ]
「miss」か「Z=今までの仕事回数+1」

の判断はif文で分岐させればいいんですよね?

258 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 18:42:46 ]
そのためにあるのがIF文です。

259 名前:デフォルトの名無しさん mailto:sage [2007/02/09(金) 23:45:42 ]
副作用のないLispで、変数の型に制約がつけられる、という理解でいいか?

参照透明性とはチューリング機械で言うと内部状態を持たないということか?

260 名前:254 [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の制限値までは増やせるだろう。


263 名前:261 [2007/02/11(日) 02:00:00 ]
>>262
アドヴァイスありがとうございます



264 名前:デフォルトの名無しさん [2007/02/11(日) 02:06:56 ]
>>260
文法のチェックだけでよければ
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 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 16:54:45 ]
>>265
x = x - y
向きが逆


267 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 21:08:29 ]
>>265
266で言われてますが、=は左の変数に
右の計算結果を代入するものです。

268 名前:デフォルトの名無しさん mailto:sage [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
なんか一気に何ちゃらちゃらまでまわっちゃうんです><
うんこ→なんちゃら→うんこ→なんちゃらちゃら の順番になるはずですよね?
というかなんちゃらでエラーが出てます><これが原因でしょうか?
このエラーなおしたらちゃんとまわるようになるんでしょうか?まずはえらー直すことが先だと思うんですけど
構造的にはあってますよね??

270 名前:254 [2007/02/13(火) 02:04:09 ]
>>264であるサイトいったんですけど、errorってでてダウンロードできなかった…orz
構文はあってますかね?

271 名前:デフォルトの名無しさん mailto:sage [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の使われ方が少しおかしい。

272 名前:254 [2007/02/13(火) 15:36:17 ]
>>271

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

do 20 z=1,10
で、仕事回数zの表現をしたかったんですが…


273 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 15:51:51 ]
>>272
もしかして日本語を理解できない人?
> 16行目(z=z+1)でzの値を変えようとしているがzはDO変数なのでDOループ中で変更できない。
DOループの中でそのDOループのiteratorであるzをz=z+1という文で変更しようとしているが、
それはコンパイラとしては許せないことであると言われている。



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

276 名前:254 [2007/02/13(火) 18:40:47 ]
>>275

あ、すいません…

間違ったソースコードをコピペしてしまったんで…
いまエラーを一個ずつ直してますが、確かに直っていくと面白いですね。


277 名前:254 [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

278 名前:254 [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 名前:デフォルトの名無しさん mailto:sage [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)にはどんな値が入っているかわかるかな?

280 名前:254 [2007/02/13(火) 21:42:46 ]
>>279

仕事回数z、つまりそのときの仕事の結果を表示していくつもりで書いたんです。
zが3回目の仕事のときに、3回目の仕事の結果を出す、というようにしたんですが、
間違ってますかね?


281 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 21:45:08 ]
workに何も代入してないじゃん。

282 名前:254 [2007/02/13(火) 22:01:02 ]
>>281

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

この場合だと、x-yでいいのかな?

283 名前:デフォルトの名無しさん [2007/02/13(火) 22:15:46 ]
彼が何をしたいかわからない俺は馬鹿



284 名前:254 [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 名前:デフォルトの名無しさん mailto:sage [2007/02/13(火) 23:50:05 ]
>>284
卒業課題って今年度の?
今の状態で行き当たりばったりにプログラム書くより、教科書なり参考書なりをよく読んで
もう一度基本的な文法を覚えなおした方がいいよ。

それからパソコン持ってるなら家でも予習復習できるように処理系の1つも入れておけ。
Windowsで学校の課題程度ならこれくらいで十分
ttp://www.coastal-env.k.u-tokyo.ac.jp/koibuchi/fortran.htm
他は本スレ参照のこと
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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 14:19:54 ]
>>291
エラーメッセージから見ると、ソースファイルをプロジェクトに登録していないように見えるんだが。
New で作ったならそういう事は起きないが既存ソースなら登録がうまく言ってないのかも?

293 名前:デフォルトの名無しさん [2007/02/25(日) 14:25:10 ]
s = a**b

の計算が必要なときは

s = exp(b*log(a))

と書いた方が計算が速いと聞いたのですが,本当でしょうか?



294 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 17:37:12 ]
>>293
自分でベンチマーク作って確かめろw

どっちにしろ一般のべき乗はexp log で計算しているはずなので、
8087のようにハードウェア的に実装されたexpを利用したかしないかの違いだろう。


295 名前:293 mailto:sage [2007/02/27(火) 10:33:43 ]
>>294
うちのPCではどうやら後者の方が2割程度早いようです.
コンパイラはIntel Visual Fortran 9.1です.

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

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

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

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

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



296 名前:293:プログラムリスト mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 になる。

298 名前:293 mailto:sage [2007/02/27(火) 21:35:35 ]
>>297
おおー!確かにそうなります!

実にすっきりしました.
どうもありがとうございます.

299 名前:293 mailto:sage [2007/02/27(火) 21:39:28 ]
途中で書き込んでしまいました.

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

今まで最適化で問題が発生したことが無かったこともあって,
原因がコンパイラの最適化にあったとは全然気がつきませんでした.

300 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 23:39:40 ]
Xが0以下の実数の場合、LOG(X) の結果は処理系依存になるので
実行時エラーを出してプログラムを止める処理系もある。

301 名前:デフォルトの名無しさん mailto:sage [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にでも入れておけ。









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

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<120KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef