[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 12:09 / Filesize : 350 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

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



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

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


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

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


411 名前:410 [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 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 14:56:37 ]
>>410
Intel Visual Fortranの DTIME は引数が1つの関数だ。サブルーチンじゃない。
SUB の先頭に USE IFPORT をつければちゃんとコンパイル時にチェックしてエラーを出してくれる。

413 名前:410 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:40:12 ]
A-1ってA-I(もしくはE)のことか?

416 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 15:41:13 ]
ああ、逆行列のことか。スマン。

417 名前:1/2 mailto:sage [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)


418 名前:2/2 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 00:54:13 ]
>>417-418
正直なところ、たかがこれしきの行列演算をサブルーチンにする意味が分からん。

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

すべてがjokeなのかもしれないが



420 名前:デフォルトの名無しさん mailto:sage [2007/04/25(水) 02:18:40 ]
宿題か何かなんじゃないか?
っていうか超初心者用スレなんだから
サブルーチンにする意味なんか問うな。
Hello worldなんか意味がないとか言っているのと同じだ。

421 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 00:00:42 ]
>>421
たぶんFORTRAN77での宿題なんでね?
Fortran90では意味を成さない希ガス。

422 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 01:12:40 ]
>>421
何その再帰呼び出し的アンカー

423 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 11:11:20 ]
>>422
f90 へのあてつけ

424 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 16:35:22 ]
最新のgfortranをvistaにインストールし、コンパイルしようとしたら
ld: cannot find -lgfortranbegin
とエラーが出てコンパイルできません。
XPではインストールして問題なくコンパイルできました。
vistaでは使えないのでしょうか?

425 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 16:41:49 ]
>>423
f90 は再帰できるじゃん。
F77 へのあてつけなら分かるが。

426 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 21:09:24 ]
>>424
状況がよくわからんが Program Files 以外の日本語や半角スペースを含まないフォルダにインストールし直せばいいんじゃね?

427 名前:424 mailto:sage [2007/04/26(木) 22:15:59 ]
>426
それも考えてc直下にインストールし直しても結局同じでした。
vistaだからなのかな・・・誰かvistaで動いてる人は居ないんでしょうか。
g95も同じようにエラーが出て使えませんでした(今手元にvistaマシンが無いのでエラーメッセージ分かりません
FTN95はvistaでも動きました。

428 名前:デフォルトの名無しさん mailto:sage [2007/04/26(木) 22:39:47 ]
>>424
まったく分からんが、ローダーのエラーなのでコンパイルは行ってるんでない?
単にメインプログラムがないだけとか?


429 名前:424 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 14:54:07 ]
i と -i のどちらかでなければダメなのであれば
その問題において何らかの束縛条件があるはずだから、
それに照らし合わせて符号を決めればいい。

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

どっちかというと、FORTRAN の問題じゃなくて数学の問題かな。
x^2 = -1 の時 x = ±i なわけだけど、
条件によっては +i か -i のどちらかじゃないといけないが、
どちらでもいい、あるいは両方ないといけない場合もある。

432 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 14:20:30 ]
宿題は自分で(ry

435 名前:デフォルトの名無しさん mailto:sage [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 名前:斎木君 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 15:59:55 ]
パスカルの三角形ってまた重いものをw

438 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:16:03 ]
>>436
再帰は出来るだけ避けろ!w  情報工学科じゃあるまいしw


439 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 20:17:43 ]
再帰が問題じゃないだろー。



440 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 07:37:26 ]
gccをfedora core 5、athlon64環境で使っています。
CのfloatとFortranのrealは同じ精度なのでしょうか?

441 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 17:38:53 ]
>>442
院生にきけ

444 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 19:08:11 ]
ファイルの中身も貼らないようでは困る。
あと、プログラムは間違いすぎていてどう指摘していいのか分からん。

448 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:13:44 ]
書くわけないじゃん。

451 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 20:27:59 ]
program ex4
i = system('cat fl.dat | sort -n > ans.dat')
end

452 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:35:43 ]
>>456
いや・・・そもそも i に値が入る前にiを使っているのと、
このread文一個では、ファイルからのデータの読み出しがまず失敗している。

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


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



458 名前:デフォルトの名無しさん mailto:sage [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 www.hoge.com
を行い
結果をファイルに残す

あるいは、戻り値 304( not found )
かどうかの判定とか。
Linux *g77
です

462 名前:デフォルトの名無しさん mailto:sage [2007/05/09(水) 23:54:08 ]

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

でもこの3行で「できました〜」って言ったらどう思われるかね.


463 名前:デフォルトの名無しさん [2007/05/09(水) 23:57:25 ]
固有値解析もサブルーチン呼ぶだけだから良いんじゃね?
なわけねーだろ。

464 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:00:14 ]
>>461
system 関数で wget を呼べば

465 名前:デフォルトの名無しさん [2007/05/10(木) 00:05:46 ]
>>464
なるほど、getは出来ますね。純粋なfortranでは無いですが贅沢は言えません。

戻り値が200(存在する)場合はファイルに書き
304であれば、書かないようにすれば良さそうですが
戻り値を得る方法ありますか?

466 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:19:08 ]
>>465
wget の出力をファイルにリダイレクトしておいて、それを解析するとか。

467 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:19:51 ]
>>465
ああ、あと、当然成功すれば 0 が、失敗すれば非 0 が返ってくるはずだから、
それで成功か失敗かは分かる。
エラーの種類は出力を解析する必要あり。

468 名前:デフォルトの名無しさん [2007/05/10(木) 00:22:57 ]
>>466
ああ、そうか。
wcなりで、有るときにファイル作業すれば良いね。
でも、permission や loginの時にどう対処すれば良いのか?
ともかく、一応の道筋は付いた。

ありがとう。

戻り値を得る方法をご存知の方、いらっしゃったら、よろしくです。

469 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:24:48 ]
問題は fortran で実装する必要性だな。
何らかのスクリプトでいい気がする。



470 名前:デフォルトの名無しさん [2007/05/10(木) 00:28:00 ]
fortranかVBい外のbasicでなら、思うことが自在にできます。
文字列や数値をくっ付けたりとか、あと解析に便利なんです。

つーのが、fortranでする理由です。

471 名前:デフォルトの名無しさん mailto:sage [2007/05/10(木) 00:31:09 ]
そこら辺は perl とか ruby とかの方が得意な気が。
まあ、言語を覚える手間がかかるというのなら仕方がないけど、
bash あたりでもいいという気はする。
ま、いいけどね。

472 名前:1/3 mailto:sage [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
!


473 名前:2/3 mailto:sage [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


474 名前:3/4 ごめwwwはみだしたw mailto:sage [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 = '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


475 名前:4/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 名前:デフォルトの名無しさん mailto:sage [2007/05/11(金) 02:48:37 ]
若者を呼び寄せるために
Fortranでエロゲでも作らないか?

477 名前:461 [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



480 名前:478-479 mailto:sage [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


482 名前:478 mailto:sage [2007/05/12(土) 01:28:11 ]
メモリが足りないと言うことは、私のPCが原因なんですね・・・
なんとか改善策はありませんでしょうか?

483 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 02:24:01 ]
>>476
正直もう Fortran は消えて欲しいのでやめてください。

484 名前:478 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 10:53:44 ]
>>476
まずはヌける絵を描くんだ。
話はそれからだ。

487 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 11:04:10 ]
>>476
DO「ああんっ……CONTINUE君っ……」
細い腰を震わせ、DOは歓喜の牝声をあげた。
奥深く突き刺さった行番号を、DOとIが招き入れるように吸い付いている。
「いいんっ……もっと……もっと下さい……」
好きなCONTINUEの行番号をDOとIの間に入れられることがこんなにも気持ちいいなんて。
CONTINUEの熱い肉体をもっと感じたくて、ついいやらしく激しい突きをせがんでしまう。

こういう感じ?

488 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 11:24:32 ]
だがEND DOに寝取られる

489 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 12:46:16 ]
FORTRANのイメージならホモゲーだよな



490 名前:デフォルトの名無しさん mailto:sage [2007/05/12(土) 14:28:06 ]
アッー!

491 名前:デフォルトの名無しさん [2007/05/12(土) 18:46:17 ]
>>478
A をアロケートしようとしているところが 4GB を超えてしまっているのが原因。
4GB以下になるように分割して扱う必要がある。

492 名前:478 mailto:sage [2007/05/12(土) 23:04:36 ]
>>485>>491
アドバイスありがとうございます!
なんとか、N=11以上のとき動かなくなるエラーは亡くすことができたのですが、
>>484が未だに解決できないので、こちらの方のアドバイスも
大変恐縮ですが、アドバイスをよろしくお願いします。

493 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:36:15 ]
FORTRANを盛り上げていこうぜ!


496 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 15:54:24 ]
お断りします

497 名前:デフォルトの名無しさん mailto:sage [2007/05/13(日) 21:33:57 ]
そう言われると、かえって>>496の菊穴にCOMMON文を無理やり押し込んでやりたいw うふふ



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

ちなみに,windowsのコマンドプロンプトでコンパイルしています.
fortran初心者なものですいません・・・

499 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 10:10:22 ]
ラッパ関数を C で作るとか。

503 名前:デフォルトの名無しさん [2007/05/15(火) 10:34:59 ]
素早いお返事ありがとうございます。
やはりそれが普通でしょうか。
関数がわりかし多めな+ IVF から呼べるインターフェース類はあるので
再利用ができるとうれしいなという感じなのですが。

504 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 10:44:55 ]
ラッパ関数生成スクリプトでも書くとか。

505 名前:デフォルトの名無しさん [2007/05/15(火) 10:50:49 ]
>>504
ですね。
あきらめて、書き始めておりました。

506 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:24:54 ]
>>506
g77 云々 以降の画面に出ている文字を全部コピペして書け。
これだけでは判断のしようも無い。
プログラム自体は間違ってないように見える。


508 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 11:25:21 ]
>>510
上手くいきました。
DO文の中にIF文入れて簡単に表せるんですね。とても勉強になりました。
ご教授ありがとうございました。







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

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

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