[表示 : 全て 最新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/


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文入れて簡単に表せるんですね。とても勉強になりました。
ご教授ありがとうございました。


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を返れ

514 名前:513 [2007/05/20(日) 03:36:17 ]
用すませて思い出したけど
変数は
REAL*8
とした方が良いんじゃね?

515 名前:513 [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 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 20:22:18 ]
>>519
2回数値を入力してEnterを押すと答えが表示される。
READ文の復習をしましょう。

あと、細かいことだが 'TATE', 'YOKO' と底辺A, 高さHの対応はそれでいいのか?

521 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:13:29 ]
>>520さん、レスありがとうございます。
しかし、>>「2回数値を入力して」と、書かれていますが、
数値とはどこの数値をどこに入力すればよいのでしょうか?
何度もすいません…。



522 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 02:46:29 ]
>>521
君はいったい何をするプログラムを作っているのかね?
もう一回問題をよく読みなさい。

523 名前:デフォルトの名無しさん mailto:sage [2007/05/22(火) 13:12:53 ]
>>522さん
すいません。ようやく分かりました。ありがとうございます。

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

迷惑おかけしました。すいませんでした。


524 名前:デフォルトの名無しさん mailto:age [2007/05/23(水) 16:56:51 ]
すみません、使いたいソフトのソースコードがFortran90で書かれていますが、
コンパイラがありません。
しかもUNIXじゃなくてWindowsXPなんです。Cygwinはあるんですが。
というわけで、Fortran90のWindows用フリーコンパイラなどをご存じでしたら
教えてください。

525 名前:デフォルトの名無しさん [2007/05/23(水) 18:01:06 ]
g95 -minGW で決まり。

526 名前:sage [2007/05/24(木) 14:59:59 ]
3×3の行列の積を解くプログラムがわかりません><
ちなみにTextファイルから行列を読み込むプログラムです。
どなたかご教授願います。


527 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:10:22 ]
>>528
・FORTRANにはMODという便利な関数がある。
・「奇数」、「奇数かつ3の倍数」の判定条件が変。
・せっかくIF/ELSE IFで条件分けしているのにWRITE文がまったく同じ。
・プログラムの頭に「IMPLICIT NONE」をつけてみよう。

530 名前:デフォルトの名無しさん mailto:sage [2007/05/24(木) 21:13:41 ]
>>528
実数で計算する必要があるのか?

531 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 10:59:00 ]
>>526
行列の積の定義を線形代数の本で見よ.
定義式をそのまま計算すればよろしい.

3x3が保障されてるなら532の言うように,式を9本かけばよい.

534 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 13:52:19 ]
テキストファイルから行列を読み込む方法が分らないんじゃないかな。

535 名前:532 [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 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [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 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:50:49 ]
!(Φ_Φ+){???}

『「全てに一致する」(command) i{option}』 == 『文字列、配列順に一致を優先する + i{option}』

540 名前:気まぐれアナスイ mailto:お腹いっぱい@気まぐれアナスイ [2007/05/26(土) 17:55:32 ]
     〆{この様に?}

   Ж  √ζ
        {Ж}


541 名前:デフォルトの名無しさん mailto:sage [2007/06/02(土) 13:14:21 ]
do i=1,10
end do
の場合、このループを抜けた後iの値は11になるのですか?

542 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 00:27:01 ]
>>543
データ量が少ないなら、頭から1こづつ見ていっても対して変わらん。

それが嫌なら、単純なのは二分法。ぐぐればよろし。


545 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 12:03:57 ]
×づつ
○ずつ

546 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 17:50:33 ]
>>545
歴史的仮名遣いでは『づつ』の方が正しい。
Fortran使いは、古いほうを好むべし。


547 名前:デフォルトの名無しさん [2007/06/03(日) 19:04:51 ]
x-1とxのyを掛けて負ならば記憶させたら良いだけじゃ?



548 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:27:29 ]
グローバル変数みたいなことしたいなら、commonじゃなくモジュール使えって言われますが
commonだとどの変がまずいんですか?正確に複写しないとダメ、という他に
速度などの面でデメリットとかあるんでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:41:21 ]
>>548
COMMONは色々厄介なのよ。
メモリーの先頭番地を合わせるだけなので、まったく別の名前で別の並びでも成立する。
サイズが合わなくてもいい。(処理系に依存するが最初に出た大きさになることが多いと思う)

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

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

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

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

速度的にはむしろ早いんではないかと思ったりもする。

550 名前:548 mailto:sage [2007/06/04(月) 01:29:46 ]
>>549
>プログラムの前半と後半で、同じCOMMONブロックを
>まったく別の割付で用いるとか。COMMONの前半分は共通で、後ろ半分が次々変化するとか。
昔はそんなことをしてたんですか・・・壮絶ですね

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

今は普通に引数で渡してますが、これ変えたら速くなるかなぁ

551 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:27:52 ]
あらゆるところで変更されうるから、
common に起因するバグがあった場合、
バグのあるとろを探すのが大変、
というのはよく言われるところ。

ただ、common を避ける事で引数がもの凄く多くなるとなると、
それはそれで問題になる事もあったり。

552 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:42:58 ]
>>550
最適化の問題などもあるので、今となってはCOMMONにする利益は無いのではないかと思う。
MODULEで渡しても変わらないのではないかと推測する。

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

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




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

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

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



553 名前:548 mailto:sage [2007/06/04(月) 16:11:30 ]
詳しい解説ありがとうございます。勉強になります。

いつまでもFORTRAN77ではさすがに時代遅れになるかも・・・という漠然とした不安から、
上のバージョンへの移行を考えていたのですが、よく検討したほうが良さそうですね。
Fortran95とか新しいやつはオブジェクト指向とかも取り入れてるんでしたっけ。
速度を求めてる人にとっては論外なんでしょうね。。

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

あとPro版にMKLが付くようになった。






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

前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