FORTRAN Ⅳat TECH
FORTRAN Ⅳ - 暇つぶし2ch486:デフォルトの名無しさん
08/12/13 02:11:30
C Pad for Salford FTN77
でCPU TIME を出力できるようにする方法はありますか?

487:デフォルトの名無しさん
08/12/13 18:02:53
>>486
HIGH_RES_CLOCK@

使い方は Library Reference に載ってる。

488:デフォルトの名無しさん
08/12/23 09:11:38
>>487
亀ですが
ありがとうございます。
出来ました!

489:デフォルトの名無しさん
09/01/24 19:01:34
関連スレが新しくなりました。

くだすれFORTRAN(超初心者用)その4
スレリンク(tech板)l50


490:デフォルトの名無しさん
09/02/12 00:23:26
うちの研究室の人たちがFortranでプログラミングしているけれど
お前らgoto使いすぎ・・・
というか自分の提出したプログラムがgoto文に書き換えられている・・・

subroutine、functionを使いすぎるのはスパコン計算に向かないと言っていたけれど
勉強してきた構造化プログラミングの手法自体がfortran向きでないということなの?

491:デフォルトの名無しさん
09/02/12 02:32:22
>>490
インラインされるようにしろw

コンパイラが安心してグローバル最適化できるように、付加的な情報を与えてやれ。
グローバルな構造が人間が見て分かりやすいならコンパイラも見て分かりやすい。

INTENT指定はつける。
FUNCTIONは、PURE (可能ならELEMENTAL)にする
とかすればDO..LOOP内で関数呼び出しとかしても並列化やベクトル化してくれるはず。
コンパイラによるが。

実際にベンチマークを取って、自分が勝利すれば、後は文句いわれないべw


492:デフォルトの名無しさん
09/02/12 12:52:18
>>491
intent属性つけると微妙に速くなるよね。
特にloop内で頻繁に呼ばれるやつだと全体で5から20%くらい違ってくる。
最近のコンパイラはF77で書いててもintentをわかってくれるから楽だ。

で・・・・pure,elementalの事はよくわからないので詳しく!

493:デフォルトの名無しさん
09/02/13 00:04:13
>>492
PUREもELEMENTALもFortran95で導入されたキーワードで、関数やサブルーチンの
副プログラムの性質をコンパイラに教える修飾語。

PURE FUNCTION unko(x) などのように宣言の頭につけて使う。

PUREというのは、大雑把には副作用がないこと。それゆえ、並列に動作させても
値が変わらないので、コンパイラは並列化など最適化をやれる。
(PUREを満たさねばならない条件はいくつかあるので、kwskはマニュアル見てくれ)

ELEMENTALはPUREの中でさらにいい性質を持ったもの。
本来は1変数で定義してあっても、配列を引数にとって、配列を返すように使ってもいいもの。

たとえば、
REAL :: a(10), b(10)
b = SIN(a)
こういう使い方が組み込み関数では出来るわけだが、自作の関数でもこうやって使っても
いい場合にELEMENTAL (要素毎の意味) をつける。 

これもコンパイラが利口なら、最適化をかけてくれるはず。

普通、DO..LOOP内に関数やサブルーチンの呼び出しがあると、呼び出し先で何が
あるかわからないので、最適化が抑止されるが、PUREやELEMENTALがあれば、
安心してコンパイラが最適化できる。(原理的にはw)



494:デフォルトの名無しさん
09/02/13 08:29:24
>>493
ありがとう。pure 属性は使い易そうだ。

495:494
09/02/13 11:01:13
loop内で頻繁に呼ばれる4個つくらいの function や subroutine に pure 属性つけただけで
並列(OpenMP)の時にちょびっと速くなった。わーい。
もともとdo-loopで一つずつ処理しているので elemental を使える状況は少ないけど、
もう少し理解してから使ってみよう。
inlineを少し深くするようになったからかコンパイル時間がすこし長くなったけどまあ気にしない。

496:デフォルトの名無しさん
09/02/17 22:12:50
>>491
なるほど、ためになったわ。サンキュー。PUREを付けるだけで簡単に速くなったわ。

担当のは基本的に古い人間だから、あまりコンパイラ任せにするなとか言うんよな…。
Fortran90っぽい77形式の文も、「完成した後で直します」とか言ってそのままだったり。
implicit realもcommon文もどうにかしたいけれど、きっと文句言うんだろうな。

497:デフォルトの名無しさん
09/02/18 02:22:54
>>496
PURE 属性はもともと HPF で導入されたものなので、それなりのメーカならコンパイラ
にも最適化のノウハウの蓄積があるはず?
ELEMENTAL も一変数用にサブルーチン書いて、配列を渡せばいいので、DO..LOOPを
あからさまに書かずにすむ。時々ソースがすごくすっきりして楽になることがある。

でも、ついでだから古い人間を擁護してみるかw

FORTRAN77 にも、むきだしの良さがあるw
Fortran90 以降だとソース上は簡潔になっても、影で動的にテンポラリ配列とか取るので
気持ち悪いところもある。長時間並んだJOB がStackOverflow とかで止まっていたり
すると殺してやりたくなる。古い時代の人はその辺が嫌なのかもしれないw

COMMON もグローバル変数だと思うとむかつくだろうが、 自分でガベージコレクション
しながら、変数領域を自由自在に再利用して操っていると思うと、結構気持ち良い。
メモリーが貴重だった時代には、利用価値が高かった。

IMPLICIT に関していえば IMPLICIT NONE をつけた上で、頭文字を守ればいい。
C と違ってローカルスコープの捨て変数が使えないから、頭文字を守らないと
いちいち宣言部に戻って型を確かめないといけないのでめんどい。
Fortran では数値の精度が致命的に重要で、倍精度計算中に1個単精度が混じるだけでも
すべての結果が単精度のゴミになるのだから、数値精度に無頓着の他のおしゃれ言語の
連中の言説を信じると痛い目に会わされるw



498:デフォルトの名無しさん
09/02/18 13:19:26
pure属性付けたサブルーチン内で
pure属性付けた他のサブルーチン呼ぶ時には
interfaceで引数部分の性質を教えて置かないといけないんだね。
f77書式で書いてるのに interface intent が
現れるのでムズムズするけどムズムズするだけなのでそのまま。

499:デフォルトの名無しさん
09/02/26 16:08:37
OpenMPを試してみてるんだけど、いまいちうまくいかないんだが・・・
ifort -QParallel でコンパイル+実行するとうまくいくんだけど、
同じソースをifort -Qopenmp でコンパイル+実行すると
Program Exception - stack overflow
っていうエラーが出る
ソース中にOpenMP構文は use omp_lib だけ
これってどうしたらいいのかな?

500:499
09/02/26 16:22:10
おk事故解決
-auto_scalar オプションでいけた

501:デフォルトの名無しさん
09/02/26 16:49:38
>>500
だたの
-auto

-static
でうまく行くこともあるよ。あとは実行時の環境変数の
setenv KMP_STACKSIZE 16M
とかデフォより大きめに取ると幸せなことが多い気がする。

502:デフォルトの名無しさん
09/02/26 16:50:50
>>500
ていうか、
-auto_scalar
ってデフォルトになってない?

503:デフォルトの名無しさん
09/02/26 17:23:54
-openmpだとデフォで動的(-auto)になるんだっけか
>>499は単にスタック不足なだけでは?

ところで、KMP_STACKSIZEってunlimitedに設定できないの?

504:デフォルトの名無しさん
09/02/26 17:58:56
動的っていってもヒープとスタックがあるよね。
Fotranの場合ってどういう風に割り当てられるんだろう・・・そういやあまり意識したことなかった。

505:デフォルトの名無しさん
09/02/27 02:43:33
>>504
元々はAUTOMATIC変数の類はスタックに、ALLOCATE命令のときはヒープだった気がする。

ただ歴史的経緯のせいでサブルーチン側で巨大な配列をとっているプログラムが多くて
それがSTACKOVERFLOWを引き起こすから、IntelFortranなんかはデフォールトでは
スカラー変数はスタックで、配列の類はヒープで確保するようになった気がする。

インテルの掲示板に、デフォールト・オプション切り替えの話が出ていた旗もするのだが
昔のことなので記憶がはっきりしない。

OpenMPを指定すると、オプションが切り替わってしまう話はこのスレに出ている。
URLリンク(software.intel.com)


FortranはFORTRAN66時代がSTATICに変数をとっていた関係で、
FORTRAN77で規格の上ではサブルーチン類の変数はAUTOMATICでありうるように
なったにもかかわらず、互換性の観点からデフォールトでSTATICに変数を
とっていることが多くて、それはFortran90でもしばらく続いていたという歴史的経緯がある。


506:デフォルトの名無しさん
09/02/27 11:54:19
>>505
そのスレのSteveさんが言ってるlocal scalar variablesって、配列じゃない(次元1の)フツーの変数のことだよね?
だとしたら、
If you say /Qopenmp (or /Qopenmp-stubs), this changes to /automatic - ALL local scalar variables are allocated on the stack.
のALL local scalar variablesはALL local variables(つまりローカルスカラ変数だけじゃなく、ローカル配列変数も含む)の間違いじゃないかな?


勘違いしてたらすいません

507:デフォルトの名無しさん
09/02/27 13:12:01
>>506
そうなんじゃないかな?
配列までスタックにとるからoverflowしていると考えるとつじつまが合う?


508:506
09/02/27 13:52:41
>>507
そうだよね。SteveさんIntelのスタッフなんだし書き間違わないでくれよぉ・・・

OpenMPの場合にデフォルトで全てのローカル変数(スカラも配列も)がスタックになるのは
スレッドセーフのためってあるけど、逆に言えばそれらをstaticに扱ったらスレッドセーフに
ならないってことだよね。それってやっちゃまずいことなんだろうか?

OpenMPまともに使った経験がないもんで・・・識者の方コメントおながいします

509:デフォルトの名無しさん
09/02/27 14:48:49
-openmp
つけてコンパイルすると、仮にautomaticは嫌いだっと
-noauto
つけても消されるはず。なのでopenMPを読んだ状態だと
有無をいわさずにぜんぶautomaticになる・・・と理解しているけど。
shared属性をつけてかつcommonブロックに貼り付けるとかして
やや無理なことをしないとstatic領域には配置されないと思ふ。
-staticはその名のイメージとは違って共有ライブラリを使わない
(というか実行ファイルに埋め込んじゃう)オプションだし。

spec.orgにあるOMP2001の情報のところに試した人たちが
実際に使ったオプションが載ってるので、自分のところのシステムに
近い(or 同じ)マシンがあったらそれと同じモノをだいたい使っているけど、
まあ大間違いではないと思う。お薦めできるのかは分らないけど・・・。

510:デフォルトの名無しさん
09/02/27 15:30:30
え、OpenMPだとサブルーチン内ではstatic配置ってできないわけ?
数値計算では馬鹿でかい配列は可能な限りstaticにするのが基本じゃない?
サブルーチン渡る度に配列をコピーとかやってられんでしょ?

その代わりメモリのアロケーションはコーディングする側がきちんと考えてあげないといけないけど。
この辺がリソースをある意味富豪的に使うことが前提とされるJavaやC#などのオブジェクト系言語との違いだね。

511:デフォルトの名無しさん
09/02/27 16:56:15
510はちょっと尋ね方が変だな。
副プログラムが並列のloop内にあるのか、
副プログラム内で並列のloopがあるのかで答は変わる。

512:510
09/02/27 19:38:52
的外れな質問してたのかな、ごめん・・・。
>>511の両方のケースとも知りたいので、よかったら教えてほしい。
流体とかの数値計算では行列の反復法とかはサブルーチン内でやるけど、
そういうケースでメモリのアロケーションはどうすべきなのか、という視点で興味があります。

513:デフォルトの名無しさん
09/02/28 00:58:18
>>512
引数に載ってれば、Fortranは参照呼出しなんだから配列のコピーが生じるはずもない。
CやPASCALとは違う。(まぁ最近はVALUE属性も出来るようになったが)

ここでは副プログラム内で新たに割り付けられる配列の話だろう。
それが動的に取られるとして、スタックに取られるか、ヒープに取られるかの違い。



514:510
09/02/28 01:28:49
>>513
>副プログラム内で新たに割り付けられる配列
あ、そういう話か・・・ありがとう。

自分は一時作業用の配列も全部メイン側で用意してやって引数渡ししてるんだけど、
そういうのはサブルーチン内でスタックやヒープで取ってやる方がいいのかな?
皆さんどうしてますか?

515:デフォルトの名無しさん
09/03/03 06:16:03
allocatableを副プログラム内で作ってそれ(先頭アドレスやらサイズその他)を
メイン階層や他の副プログラムに行き渡らせるのが割りと
面倒臭いのでメイン階層でやってる。
メイン階層が長くなるのは正直あまり好みではない、けど
まあ好みの問題なだけなので気にしないようにしている。

allocatable使うと場合によってはプログラム内で明示するサイズより大きいメモリを扱えたり
(コンパイラはハンドルできるメモリサイズ < OSがハンドル出来るメモリサイズ、なので)、
格子数(データ数)の違う処理を同じ実行イメージで出来る(コンパイルしなおさなくて良い)のが
いいけど、最近ではサイズをプログラム内で固定変数で明示していちいちコンパイルしている。
その方がミスは少ない気がする。気のせいかもしれないけど。

516:デフォルトの名無しさん
09/03/03 12:11:34
何がスタックやヒープに割り当てられるのか分からんかったのでググった。
ブログだけどw

URLリンク(monologuemidnight.blogspot.com)

module中の大域的な変数、save属性付きの変数→.bss
allocatable属性な配列→ヒープ
普通にサイズが宣言されている自動配列→スタック
手続き中の変数(mainでも同様)→スタック

ってことらしいが…。
この辺は規格ではないっぽいので、コンパイラの仕様をちゃんと確認したほうがいいな。

517:デフォルトの名無しさん
09/03/11 18:46:48
ifortで複数の数字を出力すると勝手に改行されるんだけど、改行を抑制するオプションってある?
gforntranでは改行されないんだけど。
real(8) a(5)
write(*,*) a(:)
とするとa(3)とa(4)の間で改行されちゃう。

518:デフォルトの名無しさん
09/03/12 04:57:59
>>517
気持ち悪いけど、下記のようにしてもだめかな?
クラシックな書き方だけど。

  write(*, '(100f10.5)') a(:)


519:デフォルトの名無しさん
09/03/12 09:37:42
>518
ありがとん。
write(*,'(100f)') a(:)
でいけた。

520:デフォルトの名無しさん
09/03/15 01:01:35
改行抑制なら、write文ならadvance='no'を付ければできるはず
出力するものが決まってるなら、改行してしまう書式の箇所に\(バックスラッシュ)を入れてもいい

521:デフォルトの名無しさん
09/03/15 11:34:42
>520
advanceはフォーマット文がいるから、結局519と同じでは?

522:デフォルトの名無しさん
09/03/17 03:12:33
>>521
'(100f)' なんて書くよりはスマートな気がするけど?
ま、どうでもいいことだな

523:デフォルトの名無しさん
09/03/18 04:24:12
do i = 1, 5
  write(*, '(f10.5,$)') a(i)
enddo
write(*,*) ''

はダメかな?
改行するなよ、の$は非標準だけどDEC以来ほぼ標準と思っていいのではないだろうか

524:デフォルトの名無しさん
09/03/18 21:51:40
ちょっとテストしてみた@Intel Fortran 10.1

integer::i
integer,parameter::imax=5
real(8)::f(imax)
do i=1,imax ; f(i)=i ; enddo

print *, "print *,f"
print *, f
print *, '---'

print *, "write(*,'(f)') f"
write(*, '(f)') f
print *, '---'

print *, "write(*,'(f)') (f(i),i=1,imax)"
write(*, '(f)') (f(i),i=1,imax)
print *, '---'

print *, "write(*,'(f\)') f"
write(*, '(f\)') f
print *, '---'

print *, "write(*,'(f)',advance='no') f"
write(*, '(f)',advance='no') f
print *, '---'

print *, "write(*,'(f)',advance='no') (f(i),i=1,imax)"
write(*, '(f)',advance='no') (f(i),i=1,imax)
print *, '---'

end

525:>>524の結果
09/03/18 21:52:34
print *,f
1.00000000000000 2.00000000000000 3.00000000000000
4.00000000000000 5.00000000000000
---
write(*,'(f)') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f)') (f(i),i=1,imax)
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f\)') f
1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 ---
write(*,'(f)',advance='no') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---
write(*,'(f)',advance='no') (f(i),i=1,imax)
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---

526:デフォルトの名無しさん
09/03/18 22:07:03
ごめん。
print文かwrite文か、また出力並びをfとするか(f(i),i=1,imax)とするかで、
出力結果が違うのかと思ってやってみたが、違いはないっぽい。
というわけで、>>524をもっとすっきりさせた。

integer::i
real(8)::f(3)
do i=1,3 ; f(i)=i ; enddo

print *, "write(*,*) f"
write(*,*) f
print *, '---'

print *, "write(*,'(f)') f"
write(*,'(f)') f
print *, '---'

print *, "write(*,'(f\)') f"
write(*,'(f\)') f
print *, '---'

print *, "write(*,'(f)',advance='no') f"
write(*,'(f)',advance='no') f
print *, '---'

end

527:デフォルトの名無しさん
09/03/18 22:19:08
↑の結果

write(*,*) f
1.00000000000000 2.00000000000000 3.00000000000000
4.00000000000000 5.00000000000000
---
write(*,'(f)') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000
---
write(*,'(f\)') f
1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 5.0000000000000000 ---
write(*,'(f)',advance='no') f
1.0000000000000000
2.0000000000000000
3.0000000000000000
4.0000000000000000
5.0000000000000000 ---


結論
①書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?)
②書式指定すると、書式の中身が終わる度に改行
③書式に\を付けると改行抑制
④書式にadvance='no'(デフォルトはyes)を付けるとwrite文が終了したときに行う改行を抑制(②との違いに注意)

って感じかな。
改行抑制の\と改行指定の/が混ざるとどんな出力になるんだろう。

528:デフォルトの名無しさん
09/03/18 22:20:24
ごめん、>>526
real(8)::f(3)
do i=1,3 ; f(i)=i ; enddo

は↓に修正。

real(8)::f(5)
do i=1,5 ; f(i)=i ; enddo

529:デフォルトの名無しさん
09/03/22 01:30:43
>①書式省略すると、適当な位置で改行してくれる(規格で決まってるんかな?)
コマンドプロンプトの右端で改行だと思う
違うかなー

530:デフォルトの名無しさん
09/03/22 10:23:20
>>529
他のコンパイラでは改行しないので、コンパイラのせいだと思います。
>>524-528
ありがとうございます。
参考になりました。
write(*,'(f\)') f
が良さそうですね。

531:デフォルトの名無しさん
09/03/23 15:14:13
>>529
Fortranに限らず、プロンプトのサイズは関係ないよ

532:デフォルトの名無しさん
09/03/27 05:59:41
亀だけど、Ifortなら<>がお勧め。
多次元配列の最初の数を入れることが多いです

program main
implicit none
integer,parameter :: num = 9
integer :: ii,jj
real :: arry(num,num)
do ii=1,num
do jj = 1,num
arry(ii,jj) = ii*jj
enddo
enddo

write(6,'(<num>F)') arry
end program

533:デフォルトの名無しさん
09/03/27 09:10:33
>532
勉強になった。
ありがとん

534:デフォルトの名無しさん
09/03/28 00:52:37
>>531
WindowsはDOS窓のサイズで改行位置が変わるぞ。



535:デフォルトの名無しさん
09/04/03 21:43:51
>>532
<>で整数くくるとその数が使えるんだね・・・知らなかった。昔からあった機能?

>>534
そうなんだ。>>531はLinuxの場合ルだけかな


536:デフォルトの名無しさん
09/04/03 22:09:05
>>535追加

<実数変数>でも勝手に整数にキャストしてくれるね。
あと他のところにも、例えば
num1=5
num2=1
write(6,'(<num>F<num1>.<num2>)') arry
みたいにして使えるね。


537:デフォルトの名無しさん
09/04/04 02:01:36
>>536
Fortran2008 では、 *( i3, '-' ) 見たいな感じで * が無限反復の指定子になるらしい。


538:デフォルトの名無しさん
09/04/08 09:50:52
*( i3, '-' )
を、スキー帽がぶったバカボンのパパっぽい大人と
すました子供に見えるようになると、やばいね。

539:デフォルトの名無しさん
09/04/08 12:40:58
やばいな

540:デフォルトの名無しさん
09/04/17 23:47:22
Fotranはじめようと思ってインストールして、
簡単なプログラムを実行しようとしたんだけど、

ld: crt2.o: No such file: No such file or directory

ってエラーが・・・。ググってもよくわからず・・・。
助けてください。

541:540
09/04/18 00:12:28
アンインストールして、はじめからやり直したらでけた。


542:デフォルトの名無しさん
09/04/18 20:15:44
>>542
おまえ、プログラムのセンスあるから、今後も缶ばれ!

543:デフォルトの名無しさん
09/04/19 12:16:56
>>542
自画自賛?

544:デフォルトの名無しさん
09/04/23 16:31:22
windowsXPでフォートラン90をフリーで使いたいのですけど、
cygwin以外でどうにか出来ますか?

545:デフォルトの名無しさん
09/04/23 22:10:01
free Fortran でぐぐれ

546:デフォルトの名無しさん
09/04/24 00:32:48
>>544
g95だな・・・

547:デフォルトの名無しさん
09/04/24 23:53:11
windowsでVMWareを立ち上げてUbuntuいれてgfortran

548:デフォルトの名無しさん
09/05/13 00:24:34
n次元配列をなめるルーチンを作成できる?
reshepe使って一次元に落とし込んで処理しようとしたら、segmentation faultになってしまった。
コードはこんな感じ。
-----------------------------
program main
integer :: arr(3,4,5)
integer :: i,j,k
do i=1,3
do j=1,4
do k=1,5
arr(i,j,k) = i+j+k
enddo
enddo
enddo
call check(arr)
end program main

subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
integer,allocatable :: tmp(:)
integer :: i,elem=1
do i=1,size(ubound(arr))
elem = elem * (ubound(arr,i)-lbound(arr,i)+1)
enddo
allocate(tmp(elem))
tmp = reshape(arr,shape(tmp))
do i=lbound(tmp,1),ubound(tmp,1)
print *,tmp(i)
enddo
end subroutine check
-----------------------------

549:デフォルトの名無しさん
09/05/13 01:22:27
>>548
PRINT *, arr
でだめなのか?

550:デフォルトの名無しさん
09/05/13 20:37:56
>>548
ほらよ。つーかこれテンプレにしてちょ


・形状引継ぎ配列を引数に使う
・割り付け配列を引数に使う
・ポインタを引数に使う
・引数キーワードやoptional属性を使う
・関数の返値を配列にする

↑をしたいなら、副プログラムは明示的引用仕様にしなきゃならない。

■明示的引用仕様
・副プログラムを内部副プログラムにする(呼び出し側でcontains)
・副プログラムをモジュール副プログラムにする(モジュールでcontains)
・副プログラムが外部副プログラムならば、それを呼び出す側でinterfaceを用意する
■暗黙的引用仕様(FORTRAN77的なやり方)
・副プログラムが外部副プログラムで、それを呼び出す側でinterfaceを用意しない

なお、副プログラムとは関数やサブルーチンを指す。

551:デフォルトの名無しさん
09/05/13 23:25:40
>>548
多次元配列を一次元にするには PACK UNPACK を使うのが一般的だと思う。
Fortran90 で導入されている。

例題はマニュアルをみてちょw

552:デフォルトの名無しさん
09/05/14 23:40:08
FORTRAN90で引数の整合性をチェックする方法ってないかな?
よくそこでバグがおきるんだ。

553:548
09/05/14 23:50:44
>>549
print の部分は、本番仕様ではガチャガチャ変更したいところなのでございます。

554:デフォルトの名無しさん
09/05/14 23:51:21
>>552
>>550

555:548
09/05/14 23:51:43
>>550>>551
って~ことは、呼び出し側でinterfaceを用意して、packで一次元化するということか。
------------------------------------------
program main
integer :: arr(3,4,5)
integer :: i,j,k
interface
subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
end subroutine check
end interface
省略
call check(arr)
end program main

subroutine check(arr)
integer,intent(in) :: arr(:,:,:)
integer,allocatable :: tmp(:)
integer :: i
tmp=pack(arr,mask=(arr .ne. 0))
do i=lbound(tmp,1),ubound(tmp,1)
print *,tmp(i)
enddo
end subroutine check
------------------------------------------
これでできました。ありがとうございます。
余談だけど、gfortranでは期待通りに処理されるのに、intel fortranだとダメみたい。
pack()の返り値が壊れてしまうっぽい。バグか?

556:デフォルトの名無しさん
09/05/15 00:45:08
>>555
tmpをALLOCATEしてないからかな?

ALLOCATE(tmp(SIZE([arr .ne. 0])))

これを入れておくと動く。
配列を返すものを、未割り当ての割りつけ配列に入れたときの挙動が、
F90の範囲ではプログラム側に問題があって悪いとおもうが、
新しい規格ではかなり自動で調整してくれるようになったので、
これがBugなのかどうか文法書を読み直さないと分からんw

[ ] はF2003で、f90なら(/ /) に対応。

557:556
09/05/15 00:49:27
ああ、Fortran95/2003 Explained 17.5.2 に そのものずばり、PACKの結果を
未割り当てALLOCATABLEに突っ込む例題が載っていた。

Fortran95までは出来なくて、F2003で出来るようになるものだそうだ。

あと、>>556で [ ] は無くても良かったw 

558:デフォルトの名無しさん
09/05/15 01:22:11
>>556.
>新しい規格ではかなり自動で調整してくれる
へーそうなんだ
いちいちallocateしなくてすむのは嬉しい

559:548
09/05/17 22:24:17
>>556>>557
フォロー、ありがとうございます。
allocateでintel fortranでも無事動くようになりました。
てか、2003いいね。期待大。

560:デフォルトの名無しさん
09/05/21 00:38:15
スレ違いだったら失礼します

FORTRANで他からデータを読み込むのに、そのデータの最初にデータ概要が書いてあるので
読み飛ばす方法があったら教えてください

初心者なので分かりにくくてすみません

561:デフォルトの名無しさん
09/05/21 01:30:02
>>560
適当な変数を定義して、読み込みだけさせて、その中身を
使わなければいいぢゃない。嘘データで良いから実例だし
てくれ。

# リアルなのを晒すとマズいかもしれんし。

562:デフォルトの名無しさん
09/05/21 01:54:07
>>561数字を読み込んで並べるだけなのですが


読み込むデータが

○月×日
気象データ
東京都日黒区

0.0001
0.0025
0.0025
0.0105
0.1568
1.5385
1.4657
12.368

こんな感じで数字の部分のみ読み込みをしたいです

563:デフォルトの名無しさん
09/05/21 02:05:29
データ構造が既知ならば読みたいところまで回していけばいいし、
レコード長が分かってれば指定のレコード部を直接読みに行ける、はず

もっと良い方法あったらフォローよろ

564:563
09/05/21 02:08:22
あ、sequentialで書いたファイルをdirectで読む(あるいはその逆)って、できないんだっけ?
自信なくなってきた><;

565:デフォルトの名無しさん
09/05/21 02:15:57
>>563すみません、もう少し詳しくお願いできますか?

566:デフォルトの名無しさん
09/05/21 09:45:54
>>562
いくつか方法はある。
最初のデータ概要の行数が決まっていて一定ならば簡単で、
CHARACTER TEXT*256
DO i = 1, 4
READ(7, *) TEXT
END DO
的に読み飛ばせばいい。

手抜きな方法としては、数値変数に文字列を読み込むとエラーが出ることを利用して、
10 CONTINUE
READ(7, *, ERR= 10) dat
で無理に読み飛ばすことも出来る。
本物のエラーのときや、データ概要が数値として読めてしまうと困るw

やや高度な方法としては、いったん文字列に読み込んで、その文字列の中身をしらべて
文字列を内部ファイルとして入力に使って数値を読むという方法もある。

データ開始地点まで適当にすすんで、BACKSPACEで適切なところまで戻る手もある。

567:デフォルトの名無しさん
09/05/21 12:20:07
>>566
2つ目の手抜き法はオイラもよく使う。
念のため、

icount = 1
20 continue
read(7,fmt=*) string
read(string,fmt=*,err=10,end=999) dat(icount)
icount = icount + 1
goto 20
10 write(*,*) string
goto 20
continue 999

みたいに文字列を一度かまして
読み込みは内部ファイルで処理して、
飛ばされたケースは表示させて目でチェックするとか。
あまりほめられないスパゲッチ~だけど。

568:デフォルトの名無しさん
09/05/23 20:59:00
>>562
本気でスピード求めるならdirectアクセスがベストだが
多分あなたの使い方じゃそうじゃなさそうだから、普通に次々読んでいって
使わないデータは破棄しちゃえばいいじゃん

>>562がASCIIデータだとすると、5行目からの数字が欲しいなら、
do i=1,5
read(unit) tmp
enddo
とやって捨てちゃえばいい

569:デフォルトの名無しさん
09/05/23 21:16:21
読み捨てるなら

DO I = 1, 5
READ(NUNIT, *)
END DO

でおk

570:デフォルトの名無しさん
09/05/23 23:01:20
そっか、捨てるんだから何もいらないか

571:デフォルトの名無しさん
09/06/09 12:40:21
FORTRANがCOLUMN-MAJORなことを調べてみたいのですが、
変数のポインタ値を知る方法はありますか?

572:デフォルトの名無しさん
09/06/09 12:49:09
>>571
無いが、サブルーチンに送ればわかる。
つまり、2次元配列を、サブルーチンの1次元形式引数の配列に渡せばよい。

573:デフォルトの名無しさん
09/06/09 13:18:41
ありがとうございます。確かにWRITEなんかにわたすことで
順番を知ることはできるのですが、メモリ上の位置を知ることは
できないのですね

574:デフォルトの名無しさん
09/06/09 13:32:54
>>573
標準文法ではないが、LOC 関数などがベンダー拡張として用意されていることが多い。

またリンカーでマップを出力させると静的な変数ならばアドレスが分からなくも無い。
配列のならびに関しては、そのままでは分からないが、さらに EQUIVALENCE でも
かければ分かるのかもしれない。

575:デフォルトの名無しさん
09/06/20 14:16:58
IFort10.1+マルチコア環境で使ってる人いるかな
OPENMPで並列化してるんだけど、
デュアルコア環境でトータルCPU使用率が50%から上がらない理由わかる?
1コアしか使ってなくて2コア目がアイドルになっちゃう

576:デフォルトの名無しさん
09/06/20 14:21:55
OSによるだろうけど、
setenv なんたら、
をちゃんとしてる?

577:575
09/06/21 16:49:20
setenvはよくわからないんだけど、OPENMP+自動並列化で5スレッド走ってる
環境はOSがXPProSP3で、Core2DuoE8500

578:デフォルトの名無しさん
09/06/21 18:23:29
OpenMPの場合は、環境変数でCPUの位置をbindしてやらないといけないんだっけ?
自動並列も同じだっけかな?

誰か詳しい人の降臨を待つしかないなw

579:デフォルトの名無しさん
09/06/22 09:45:02
>>577
なぜ最初からWinXPだとかけないのだろうか?
自分が使ってるlinux+ifort9.1では、
setenv OMP_NUM_THREADS 8 (最後の8は適当なCPU数に置き換え)
で環境変数で並列数を指定することになってるけどな。Linuxでもシェルごとに違うはずだが。
実機がないのでWinXPだとどの程度違うのかわからんが、Intel提供の例では
setenv を set に換えるだけのようだ。
全体の監視&同期とり用のあまり忙しくないスレッドが1個走るはずだけど、
全部で5つはなんか多い気もするがそんなものかもしれない気もする。
>>578
CPUの位置のバインドは自動並列やらOpenMPの場合、Linuxでは dplace や taskset を使うな。
指定しないとふらふら移動することがあるからややこしい。

まあ詳しいWin機でいじくりまくってる神の降臨を待とう。Winでの並列に興味あるし。

580:575
09/06/22 17:58:29
自己解決したので報告

ProcessExplorerでスレッドの状況を調べてたら、メインスレッド以外無負荷だた
並列化を見直して負荷をかけるようにしたら100%まで掛けられるようになった

迷惑掛けてスマソ

581:デフォルトの名無しさん
09/06/22 23:05:58
>>579
WinでのCPUバインドは環境変数でできた。
マニュアルに載っているはず。
イ7でハイパースレッディングの8コア運用していると、ちゃんとバインドしないと
性能が全く出ない。デフォで8スレッド運行してバッティングするし、4スレッドにしても
物理コアに割り当たるとは限らないようで放置プレイでは性能でない。

582:デフォルトの名無しさん
09/06/23 16:54:00
>>581
環境変数でCPUバインドっていうのは、別にWindowsに限らず他も同じだと思う。
Intel FortranだとKMP_AFFINITY、PGI FortranだとMP_BLISTかな。

というか、いい加減環境変数の設定とかをユーザにやらせるんじゃないくて、
コンパイラがシステム構成を見ながら勝手に使うCPUを指定してくれればいいのに…。
どういうスレッドの配置が効率がいいかなんて、予想できそうなもんなのに。

583:556
09/07/09 23:41:32
>>555
最近になって、Intel掲示板を見ていてようやく分かったが、オプションをつけないと
駄目らしい。

/assume:realloc_lhs

これをつけるとFortran2003解釈、つけないとFortran90/95解釈になるらしい。

584:デフォルトの名無しさん
09/09/07 13:50:42
age

585:デフォルトの名無しさん
09/09/08 07:43:50
>>583
お、参考にしよう。

おまけ・・・になるのか知らないけどw
メインがCでFortranコードをサブルーチンとして呼び出してリンクするときは
締めの実行ファイル生成時には icc でリンクして実行ファイルつくってもいいけど、ifort で
ifort -nofor_main -no-ipo
ってやると振る舞いが礼儀正しい事が多い、気がする。
-no-ipo はリンクするときだけね。これがないとifortは無茶をするようだw

586:デフォルトの名無しさん
09/09/27 01:29:32
>>nag の fortran 入門でおk

587:デフォルトの名無しさん
09/09/27 05:35:56
CERNLIBのmathlibのラッパをモジュールで作ろうと思っているのだけれど、
gfortranで例えば自己完結している共有オブジェクト(.soファイル)って
作れるもんなの?
一々$(cernlib -G Motif mathlib)をつけてコンパイルするの
面倒くさい。
ライブラリ作ったこと無いんでアレゲな文章だが、もし誰かわかるのなら。

ちなみに、OSはUbuntu8.04な。

588:デフォルトの名無しさん
09/09/27 07:43:50
追加で質問なんですが、
URLリンク(wwwasdoc.web.cern.ch)
のラッパーとして
URLリンク(gist.github.com)
というのを書いて
program main
use FunctionBinom
implicit none
integer::x,y
x=5
y=2
print *,binom(x,y)
end program
でコンパイルしてみると(もち、$(cernlib mathlib)はつけて)
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_integer':
binom.f95:(.text+0x14): undefined reference to `kbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_double':
binom.f95:(.text+0x34): undefined reference to `dbinom_'
/tmp/ccdsgC3z.o: In function `__functionbinom__binom_real':
binom.f95:(.text+0x54): undefined reference to `rbinom_'
collect2: ld returned 1 exit status
というエラー出る。何で参照先が無いのかさっぱりわからない。

589:デフォルトの名無しさん
09/09/29 00:00:44
>>588
よく知らんが、関数呼び出しの名前規約が食い違っているとか。
エラーメッセージを見る限り、小文字でアンダースコア末尾付与の形式で
オブジェクトを探しに行っているが、確かに存在しているのかね?

名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。

590:デフォルトの名無しさん
09/09/29 03:11:28
external binom
つけとく、とか
interface 文で前もって引数部を教えてあげるとか、
_binom みたく下付線つけとくとか、かなあ・・・違うな。う~ん。

591:デフォルトの名無しさん
09/09/29 22:56:52
>>589
>関数呼び出しの名前規約が食い違っているとか。
他の関数(例えば、票にもあるATGという関数)だとエラー無くできるし、
自分がマニュアル読む限り名前規約の話もないのよね。

>名前一覧とか出力させるとか、バイナリエディターで直接のぞいてい見るとか。
バイナリエディタは避けたい。名前一覧どうやって出力させればいい?

>>590
モジュラー性上げたいのでexternalを使いたくないのよ。
引用仕様記述は書いてあるよ。

592:デフォルトの名無しさん
09/09/29 23:04:23
スパコンの人じゃないのでわからないけれど、スパコンの人たちって
CERNLIBとかは使わず、何のライブラリ使っているの?NAG?
フリーであるならそのライブラリのラッパに鞍替えするわ。

593:デフォルトの名無しさん
09/09/30 10:40:07
自作に決まってるだろ
他人のライブラリなんか遅くて使えないし

594:デフォルトの名無しさん
09/09/30 12:41:03
>>593
なぬ。それスパコン業界の一般論?>>593が自作好きというわけじゃなく?
新しいアルゴリズムで作る、というのならわかるのだけれど、
それ以外の速度的にもう上げられないだろう、上げる必要も無いだろう的
関数も自作かい。

595:デフォルトの名無しさん
09/09/30 15:42:43
行列ソルバに関しては、やっぱまだまだ自作の余地があるんじゃないの?
スパコンのアーキテクチャによって最適なアルゴリズムは違うだろうし。
x86なスパコン(クラスタというべきか?w)なら適当な余所様のライブラリでいいかもしれないけど。

596:デフォルトの名無しさん
09/10/01 02:38:44
>>591
>バイナリエディタは避けたい。名前一覧どうやって出力させればいい?
ライブラリアン用のコマンドを使えば、一覧出せると思う。
メインフレームなら出来たw

>>594
ライブラリはその性質からどうしても汎用だから、自分の問題に合わせた
特殊条件を使って早くすることはあるな。


597:デフォルトの名無しさん
09/10/01 12:47:41
なるほど。個人的な話だけど、いろんなことが繋がったわ。
ライブラリは確かに汎用的じゃないといけないわな。

行列ソルバ、つーか固有値計算は興味深い。
アルゴリズム色々調べているけど、最新のアルゴリズムってなによ?
まぁ特許とられて普通に使えないんだろうけど。
よく知らないけれど、アルゴリズムに特許はかけられるよね?
アルゴリズムを実装したアプリケーションに対してのみ特許かけられるんだけっけ?

598:デフォルトの名無しさん
09/10/01 12:48:45
>>596
>ライブラリアン用のコマンドを使えば、一覧出せると思う。
お礼言うの忘れてた。トンクス!

599:デフォルトの名無しさん
09/10/01 13:13:45
アルゴリズムなんかで特許とんのは浅ましい・・・
そんなふうに考えていた時期が(ry

600:デフォルトの名無しさん
09/10/06 10:10:52
do 600 i = 1, 100
  write(*,*) '600 get'
600 continue

601:デフォルトの名無しさん
09/10/10 13:11:05
module mod
interface iface
integer function func(i, j)
integer :: i, j
end function func
end interface iface
end module mod

integer function func(i, j)
use mod
integer :: i, j
func = i * j
return
end function func

program main
use mod
print *, iface(10, 20)
end program main
-------------------------------------------------------
func = i * j
1
Error: Name 'func' at (1) is an ambiguous reference to 'func' from current program unit

上記のようなエラーがでてコンパイルできません
moduleを使わない、あるいはfunctionではなくsubroutineならコンパイルできました
ひょっとして総称名はfunctionには使えないんでしょうか?

602:デフォルトの名無しさん
09/10/10 14:29:25
>>601
integer function func(i, j)
の中の
use mod
が不要なのでは

603:デフォルトの名無しさん
09/10/10 15:44:58
>>602
できました。ありがとうございます
参考にしたサイトが間違っていたようですね

604:デフォルトの名無しさん
09/10/10 16:32:59
....その言い草はねぇだろうww

605:デフォルトの名無しさん
09/10/10 22:01:30
>>604
だったらそのサイトのURLを教えて欲しい

606:デフォルトの名無しさん
09/10/10 22:03:42
安価間違いました>>604じゃなく>>603です。すみません。

607:デフォルトの名無しさん
09/10/10 22:14:02
さらしていいものなのかな?
URLリンク(www.geocities.jp)
ここなんだけど副プログラムのほうにもuseしろって書いてありました

608:デフォルトの名無しさん
09/10/13 03:37:16
まずはgeocitiesごときにあるサンプルを鵜呑みにした自分を責めるところから始めるんだ

609:デフォルトの名無しさん
09/10/14 00:33:47
>>609 (インデント用)

module mod
contains
real function call_func(func, arg)
interface
real function func(arg)
real, intent(in) :: arg(2)
end function func
end interface
real, intent(in) :: arg(2)
call_func = func(arg)
return
end function call_func
end module mod

real function func(arg)
real, intent(in) :: arg(2)
func = arg(1) * arg(2)
return
end function func

program main
use mod
external func
real :: arg(2) = (/ 2.0, 3.0 /)
! dummy = func(arg)
print *, call_func(func, arg)
stop
end program main

610:デフォルトの名無しさん
09/10/14 00:36:31
>>609のコメントアウトした部分のコメントをはずすとコンパイルも通り、正常に動作するんですが
コメントアウトするとなぜかコンパイルすらできません
理由がさっぱりわからないんですが、なにが問題なんでしょうか?

コンパイラはgcc 4.2.4

エラーメッセージは↓です
print *, call_func(func, arg)
1
Error: Type/rank mismatch in argument 'func' at (1)

611:デフォルトの名無しさん
09/10/14 00:43:12
>>610
Intel VF 11.046 なら通る。


612:デフォルトの名無しさん
09/10/14 01:54:59
回答有難う御座います
gccコンパイラのバグということでしょうかね
汎関数を引数にもってる関数の総称名をつけようとするとコンパイルできなかったり(これは仕様?)

613:デフォルトの名無しさん
09/10/14 03:35:23
>>612
PRINT文のバグ臭いな。
FUNCTIONの返り値が、VALUEなのかADDRESSなのか今一不明なので
77時代からFUNCTIONの返り値を代入を経ずに使うと、機種依存の振る舞いを
することが良くあった。
最近は大丈夫なことが多いが。

関数引数の総称名は、IVFでは出来た。多分、仕様上では出来ておかしくないと思う。

MODULE m_unko

INTEGER, PARAMETER :: kd = SELECTED_REAL_KIND(14)

INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE

ABSTRACT INTERFACE
REAL FUNCTION x_f(a)
REAL, INTENT(IN) :: a
END FUNCTION x_f

REAL(kd) FUNCTION d_f(a)
IMPORT
REAL(kd), INTENT(IN) :: a
END FUNCTION d_f


END INTERFACE



614:556
09/10/14 03:36:04
CONTAINS

REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
PROCEDURE (x_f) :: f
sub1 = f(x)
RETURN
END FUNCTION sub1

REAL(kd) FUNCTION sub2(f, d)
REAL(kd), INTENT(IN) :: d
PROCEDURE(d_f) :: f
sub2 = f(d)
RETURN
END FUNCTION sub2

END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
REAL(kd) :: d
PROCEDURE (x_f), POINTER :: f
PROCEDURE (d_f), POINTER :: g
x = 4.0 * ATAN(1.0)
d = 4.0_kd * ATAN(1.0_kd)
f => SIN
g => DSIN
PRINT *, gen(f, x)
PRINT *, gen(g, d)
STOP
END PROGRAM unko

615:デフォルトの名無しさん
09/10/14 21:01:13
>>613,612
サンプルコードありがたいんですが、コンパイルできませんでした
abstract interfaceのところで最初のエラーがでるので原因を調べたんですが
hpとintelのマニュアルを検索してもabstract interfaceの項目が見つからりませんでした・・・

616:デフォルトの名無しさん
09/10/15 01:08:20
>>615
ABSTRACT INTERFACE はF2003の機能で、まだIntelのHelpに載ってないが、実装されている。
Crayとか(多分)IBMのマニュアルなら載っていると思う。まぁ素直にFortran95/2003 Explainedを
見るのがいいと思うが。GoogleBooksでもページが飛ばされてなければ見られる。
しかし、これは本質ではない。二度Interfaceを書くのが面倒だったから使ったまで。

これならどうだべ?
MODULE m_unko

INTERFACE gen
MODULE PROCEDURE sub1, sub2
END INTERFACE

CONTAINS

REAL FUNCTION sub1(f, x)
REAL, INTENT(IN) :: x
INTERFACE
REAL FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub1 = f(x)
RETURN
END FUNCTION sub1


617:デフォルトの名無しさん
09/10/15 01:09:15
INTEGER FUNCTION sub2(f, x)
REAL, INTENT(IN) :: x
INTERFACE
INTEGER FUNCTION f(x)
REAL, INTENT(IN) :: x
END FUNCTION f
END INTERFACE
sub2 = f(x)
RETURN
END FUNCTION sub2
!
REAL FUNCTION rmult2(x)
REAL, INTENT(IN) :: x
rmult2 = 2.0 * x
RETURN
END FUNCTION rmult2
!
INTEGER FUNCTION imult2(x)
REAL, INTENT(IN) :: x
imult2 = INT( 2.0 * x )
RETURN
END FUNCTION imult2
END MODULE m_unko
!
PROGRAM unko
USE m_unko
REAL :: x
x = 4.0
PRINT *, gen(rmult2, x)
PRINT *, gen(imult2, x)
STOP
END PROGRAM unko

618:デフォルトの名無しさん
09/10/15 18:46:55
>>616,617
有難うございます。コンパイルできました。完璧です
主プログラムにinterfaceを書く方法は見つけたんですが
moduleにくくってしまえばinterfaceを書かなくてもできるんですね

619:デフォルトの名無しさん
09/10/16 08:07:09
FORTRANやめますか?人間やめますか?

620:デフォルトの名無しさん
09/10/16 08:50:16
つ DarkBASIC

621:デフォルトの名無しさん
09/10/16 23:00:56
Windows版NetBeansの環境でgFortranを使いたいんだが、
実行ファイルの設定をg77.exeからgfortran.exeに変えるだけでok?

もし、そのほかに設定事項等あれば教えて欲しい


622:デフォルトの名無しさん
09/10/17 20:44:18
moduleでオブジェクト指向っぽいことができるのはわかったんですが
c++とかでいうインスタンスを作ることはできないんでしょうか?

623:デフォルトの名無しさん
09/10/17 22:43:57
>>622
F2003なら出来る。F95以前では出来ない。


624:デフォルトの名無しさん
09/10/17 23:13:19
こんな感じかな?
とりあえず、IVF 11.1 では通った
誰か Fortran 95/2003 Explained の日本語訳作って

module mod1
implicit none
type Circle
real :: d
contains
procedure :: area => func1
end type Circle

contains
real function func1(this)
class(Circle) :: this
func1 = (this%d ** 2) * 3.14 / 4.0
end function func1
end module mod1

program main
use mod1
implicit none
type(Circle) :: c
c%d = 10.0
print *, c%area()
end program main


625:デフォルトの名無しさん
09/10/18 16:52:26
>>624
ありがとうございます
残念ながらgfortranでは2003が使えないようなので試せませんが・・・

626:デフォルトの名無しさん
09/10/19 14:40:01
実際、FortranでOOPはどうなの?
イラネって意見も散見するが・・・

627:デフォルトの名無しさん
09/10/19 16:11:22
乱数とか行列?

628:デフォルトの名無しさん
09/10/19 17:25:58
>>626
それで速度が落ちるならイラネ。落ちそうな気しかしないけど。

中田育男『基礎FORTRAN』(岩波書店)のコラムに

FORTRANでもCOMMON文とENTRY文を使って、オブジェクト指向設計に
従ったプログラムを書くことができる。

とあったけど、具体的なことは何も書いていなかった。

629:デフォルトの名無しさん
09/10/19 17:54:29
FORTRANで無理矢理それっぽいことをやったらどうなるかという例が
「オブジェクト指向入門」34章にあるようだ
URLリンク(www.seshop.com)

俺は初版しか読んでないけど、今でも事情は変わらんでしょ

630:デフォルトの名無しさん
09/10/19 20:01:44
>>629
読んでみたいけど、ちょっとお値段が・・・
そういやまともなオブジェクト指向の本を読んだことは一度もないや
良い機会だから買ちゃおうかしら

631:デフォルトの名無しさん
09/10/19 20:18:28
>>628
> COMMON文とENTRY文を使って、オブジェクト指向設計に

なぜかはわかりませんが、イヤな予感しかしません・・・

632:デフォルトの名無しさん
09/10/19 20:42:47
というか、OOP用に作られてない言語で安全なOOPをするのって無理だし・・・
安全でないOOPなんてOOPのメリットないに等しいし・・・

素人は大人しくJavaやC#使うほうが幸せになれる

633:デフォルトの名無しさん
09/10/19 21:13:30
>>629
初版のはFORTRAN77でトリッキーなカプセル化をする話だけだったから
たぶん>>631>>632の言う通り

今実際どうなのか
俺は2003とか不勉強なんでわからん

634:デフォルトの名無しさん
09/10/20 00:37:24
>>633
そういわず、2003を勉強しようぜ!
ばりばりOOPでなくても
TYPE の拡張とかが、入れ子じゃなくて、同じ深さで構造体のメンバーを増やせるし。
OOPでない部分でも結構拡張があって便利。


日本語 パワポ
URLリンク(www.itscj.ipsj.or.jp)
英語
fURLリンク(ftp.nag.co.uk)


635:デフォルトの名無しさん
09/10/20 01:07:43
正直、OOPとそうでないものの違いがよくわかんない。
暴力的な書き方だけど、「因果関係が一意」という点では同じだし。
C++しか扱ったことないしあまり深く触らなかったからだけど、
OOPの深淵に辿り着かないと判らない機微もあるのだろうけどな。

636:デフォルトの名無しさん
09/10/20 02:20:34
>>629
どんな感じのことを言ってんすか?
簡単に教えてくだしあ

637:デフォルトの名無しさん
09/10/20 05:21:22
>>636
たいした話じゃなくて
ENTRY文をメソッドの代わりにしてカプセル化をまねるだけ。
継承とかそういう話はないし、動的にオブジェクトを作れるわけでもない。
本来の使い方でもないから危なっかしい。
ただ、それでも素のPascalよりは気がきいてるってことなんだなw

今じゃ2003もあるし
第二版はどうなってるか知らないよ。

638:デフォルトの名無しさん
09/10/20 05:43:47
>>635
自分で書く分にはOOPは邪魔なだけだよ
OOPが真価を発揮するのは他人のライブラリを使うとき。

639:デフォルトの名無しさん
09/10/20 12:58:28
ENTRY文はバグでやすいな。
COMMONの代わりに、共有変数を実現するのに、77でENTRY使ったが、かえってめんどかったw




640:デフォルトの名無しさん
09/10/21 10:41:26
>>637
thx
2003でOOPを謳ってるってことは、ある程度まともには作られてんだろうね多分。
アドレス指定で偶然にそのインスタンスを破壊しちゃう、なんてリスクはないように
出来てるんだろう・・・(どうやって実現してんのかさっぱり想像できないけど)

641:デフォルトの名無しさん
09/10/21 21:31:44
すいません。最近始めた超初心者です。
簡単なシミュレートで
open(10,file='testout.out',status='unknown',form='formatted')
do n=0,nmax
   計算略
write(10,30) t, a(1),a(2),a(3)
30 format(1H ,4(1pe12.4))
enddo
こんな感じで配列の値を表示しようと思うのですが
なぜか出力ファイルが改行されません><
g77でコンパイルしています。コンパイルはできるのですが・・・
どなたかファイルに出力するときの改行の仕方をご教授していただきたいのです
お願いします

642:デフォルトの名無しさん
09/10/22 18:39:19
>>641ですが
出力ファイルをdosに直してませんでした
自己解決しますた
フォートランはフォーマット文がわかりにくいなぁ

643:デフォルトの名無しさん
09/10/24 00:54:54
>>642
FORMATの書き方が古い。
まぁg77だから仕方ないのか。
f90で学びなおせばFORMATもそれほどつらくない。


644:デフォルトの名無しさん
09/10/24 03:17:58
Fortran77では動的メモリ割付け(allocate)は使えないの?

645:デフォルトの名無しさん
09/10/24 03:48:06
>>644
使えない。

646:デフォルトの名無しさん
09/10/25 00:06:12
>>644
大きくCOMMONを取って、必要に応じて自分で切り出して使うんだ。


647:デフォルトの名無しさん
09/10/25 00:56:39
>>644
大きくCOMMONがとれない環境なのです。
allocateしないと最大メモリまで使えない。

648:デフォルトの名無しさん
09/10/25 16:16:54
>>647
むかし過渡期の技術としてダイナミックコモンというのがあった。

ひょっとしたらコンパイラのオプションにあるかもしれない。
その場合、普通のスタティックなコモンより大きく領域が取れるかもしれない。




649:デフォルトの名無しさん
09/10/27 14:20:53
>>646
そんなこと教えちゃらめ~

650:デフォルトの名無しさん
09/10/28 20:57:22
allocateを使うとパフォーマンスが落ちるって本当ですか?
実際に使われるサイズに関わらず?

651:デフォルトの名無しさん
09/10/29 00:56:45
>>650
多分誤解。
静的配列と比べるならば、それは実行時にアロケート処理するのだから余計な時間はかかるだろう。
しかし、それは計算時間に比べれば瑣末なはず。

POINTERで配列をとった場合は、メモリーの割付が連続したメモリー領域になるとは限らないので
最適化がバリバリなされず、ALLLOCATEでとった場合(連続にメモリーを取る)とくらべて
パフォーマンスが落ちる可能性があるとは言われている。


652:651
09/10/29 02:15:09
書き方が悪かった。
POINTERにALLOCATEしたときは連続にメモリーを取るだろうが、
POINTERには、ストライド付きのとびとびメモリーを指示させることもできるので、
最適化には制限が係ることがあるようである。



653:デフォルトの名無しさん
09/10/29 10:15:13
>>651,652
なる~。Fortran77で

i=10000
call hairetu(i)

subroutine hairetu(i)
integer i
real    data(i)

みたいな使い方で任意の大きさの配列data()をサブルーチン内で扱えるけど、
これがメモリ上でキチンと並んでいるとは限らない(とんだ部分
の取り扱いはOSがするのか?)からね。
77より後のallocatable属性は、出来るだけ連続して確保してね、の
おなじないというか願掛けと思えばいいのだろうな。

654:デフォルトの名無しさん
09/10/29 10:49:44
URLリンク(codepad.org)

moduleが使う変数や関数、サブルーチンを外部から指定したいのですが可能でしょうか?上のコードは間違ってますが雰囲気を掴んでもらえたらいいかなと思い載せました


655:デフォルトの名無しさん
09/10/29 21:41:04
>>651
じゃあもうallocate使わない理由はないな
コードも綺麗になるしな

656:デフォルトの名無しさん
09/11/02 01:28:57
FORTRAN2008では、メモリー連続を保障する contiguous の属性が導入されるようだ。

まだ2003も碌にコンパイラが無い時点で言っても鬼も大笑いだが。


657:デフォルトの名無しさん
09/11/02 01:52:59
>>653
FORTRAN95/2003 Explained 20.2.1 p.331
"A non-pointer array occupies a sequence of contiguous storage sequences 云々"
とあるので、ALLOCATABLE 配列や AUTOMATIC 配列は、連続メモリーが保障されているんじゃないかな。



658:デフォルトの名無しさん
09/11/02 06:43:35
英語をみると、連続した”複数の”保存領域を数珠つなぎに占有する、だけど、
まあ、自動配列も連続したメモリに確保しようとAllocateの時と同じ程度の努力はするよん、ということか。

配列全部が”一つの”連続したメモリ空間に収まるかどうかは、その瞬間のメモリ使用状況によるんだろうな。
大きめの計算機だと、一つのマシンではOSやI/O以外の部分は排他的に使えるから問題は少ないのだろう
といってみるテスト。

659:デフォルトの名無しさん
09/11/02 11:58:03
>>658
いや、完全にひとつの連続したメモリー領域なんで内科医?
努力義務ではなくて、必須義務だと思う。


660:デフォルトの名無しさん
09/11/03 19:38:25
というか、contiguous と sequenceって意味的に似てるよなw
もう少し明確に書いて欲しいもんだ(書いてるのかもしれんが)

661:デフォルトの名無しさん
09/11/04 03:39:24
・・・べっ別にあんたのために連続したメモリ領域を確保してるわけじゃないんだからね、
といったところか。努力はするしアテにしてくれてもいいけど、絶対じゃないぞなもし。

662:デフォルトの名無しさん
09/11/04 04:25:42
フォートランってフォーミュラ・トランスフォーマーっていうくらいだから、
科学計算以外には向いていないのか?

663:デフォルトの名無しさん
09/11/04 07:40:31
大昔は、他に言語がなかったから、なんでもFortranで書いてた。

現在では、向いてる向いてない以前に、言語として古い。

664:デフォルトの名無しさん
09/11/04 12:39:17
そういえばなんでトランスフォーマーなんだろう

数式を変形せずになるべくそのままの書き方でコードにできるのが
Fortranのメリットだったはずなのに。
今では使っちゃいけないとされる文関数なんてモロその名残だよね。

665:デフォルトの名無しさん
09/11/04 12:56:16
>>663
古いゆえにコンパイラもライブラリも枯れていて、まずバグはない
最適化も一番今の所進んでいる

というわけで信頼性と速度が要求される局面で現在も使われているわけだ

666:デフォルトの名無しさん
09/11/04 13:02:36
トランスフォーマーじゃなくてトランスレータだぜ。
FORTRAN以前は演算式もアセンブリで書かなければならなかった、
数式そのものでプログラムを記述出来る事は画期的だったんだよ。

667:デフォルトの名無しさん
09/11/04 13:47:03
= で代入、という規則をプログラミングの世界に普及させてしまった
張本人でもあるな。

668:デフォルトの名無しさん
09/11/04 17:57:51
.eq.とか.and.とか使えるのはCよりも好き

669:デフォルトの名無しさん
09/11/04 20:30:22
C++も and や or 使えるわい

670:デフォルトの名無しさん
09/11/04 20:50:32
>>668
.eq.は==のほうが見やすくない?
.and.と.or.も早く&&と||が使えるようになって欲しいわ

671:デフォルトの名無しさん
09/11/05 00:25:28
.EQ. はともかく .AND. とか .OR. は変な記号より文字の方がわかりやすいと思うがなぁ

672:デフォルトの名無しさん
09/11/05 01:44:31
>>671
賛成。
等号不等号は数学記号のほうがいいが、.AND. .OR. はこっちのほうがいい。
&&、||は見てくれからしてイマイチ。
歴史的にもEBCDICに無い記号だから、FORTRANに入ろうはずも無かった。
APL端末使えばいいのかも知れんがw


673:デフォルトの名無しさん
09/11/05 05:16:55
コンマが
10進数浮動小数点の小数点、理論演算子の飾り、structureの区切り
で使われるからメンドイw。

目の慣れだろうな。自分は .AND. .OR. の方がみやすいけど。
スペース無しだとみにくいけど。

674:デフォルトの名無しさん
09/11/05 13:53:38
>>671,672
これはもう好みの問題だろうなぁ。
自分は記号のほうが、英数字に対して違いが際立つんで好きだな。
あと、文字数が少ないのもいい。.AND.は5文字もあるし。

>>673
>10進数浮動小数点の小数点、理論演算子の飾り
揚げ足じゃないが、これはコンマじゃなくてピリオドじゃ

675:デフォルトの名無しさん
09/11/05 14:16:56
>>674
C言語は特殊事情があるんだよ

史上最も記号が多い言語はAPLで、未だにこの言語を超えるものは
出ていないが、第二位にC言語となっている(今はC++)

C言語はとにかく予約語をできるだけ減らしたくて、多くのワードを記号に
したと言われている

そのためC言語の予約語はわずか32個しかない

C++はCより記号が多いにも関わらず予約語はかえって増えた
C++0xでは更に増える

676:デフォルトの名無しさん
09/11/05 17:40:23
そりゃ言語に機能をてんこもりにしてるんだから
記号も予約語も増えるよなぁ

FortlessはUnicodeで演算子を定義できるらしいから、もしかしたら使える記号の
数ではAPLを越えるかもw

677:デフォルトの名無しさん
09/11/05 17:41:11
Fortressだったorz

678:デフォルトの名無しさん
09/11/05 19:23:08
Fortressは死んだんじゃなかった?

Sun・・・(´;ω;`)ブワッ

679:デフォルトの名無しさん
09/11/05 19:28:56
Guy Steele が blog 始めたりとかしてるけど...
URLリンク(projectfortress.sun.com)

680:デフォルトの名無しさん
09/11/06 02:10:17
>>675
そういわれるとFortranは0-9,a-Z以外に使う文字は少ないね。
{}[]@^_%~`;<>?|\ は使わないでも済むね。[]%\ は使う状況はあるけど代替があるし。
固定書式で継続行に使うとかしないと使わない文字が多い。
$は微妙。規格外だけどたまに使う。#はプリプロセスしてれば使うなけど標準ではないな。

681:デフォルトの名無しさん
09/11/06 08:04:00
だからEBCDICだと

682:デフォルトの名無しさん
09/11/06 11:19:25
>>680
ASCIIコードを使ってるのは、ミニコンとかWSとかパソコンとかしょぼいマシンだけだったんだよ。
F90の規格に、やたらと固有文字コードとASCIIコード変換とかあるのはそのため。
小文字が端末から使えないことも多かったし。

数値フォーマットもバラバラだったから、数値の基数や有効ビット数を尋ねる関数もそろってる。



683:デフォルトの名無しさん
09/11/06 12:09:53
>>682
System/360にもASCIIとの切り替えスイッチは付いてたんだけどなw

684:デフォルトの名無しさん
09/11/06 12:19:22
>>683
そうなのかwww




685:デフォルトの名無しさん
09/11/07 02:57:41
ぱっとキーボードをみて・・・必須なのは
0-9 A-Z .,()=+-*/'
だけか。見落としなければ46文字。Spaceが必須でないところがなんともイカす。
使われる文字数が少ないのはパンチカード時代があるからだろうな。
Viで編集しやすいわけだw

686:デフォルトの名無しさん
09/11/07 08:52:27
C言語だってパンチカード時代に設計されたんだよ
scanf()なんてあれはパンチカード時代の名残
とにかくタイプ量を減らしたくて多くの予約語を演算子に変えた

687:デフォルトの名無しさん
09/11/07 10:01:38
それは違う。printfやscanfは、Fortran用のランタイムルーチンを流用したなごり。
C言語の発祥は主にミニコン文化圏で、パンチカードじゃなく、紙テープとテレタイプが主流。
記号だってEBCDICにないものを多用するし(そのせいでトライグラフなんてものも
できたりしたがw)

688:デフォルトの名無しさん
09/11/09 03:54:20
creat(笑)

689:デフォルトの名無しさん
09/11/09 09:36:45
>>685
機能の代替がない、という点では:の添字範囲指定もかな、ってあれ
1以外から範囲指定可なのはF77でも出来たっけ?

690:デフォルトの名無しさん
09/11/09 09:37:57
標準の機能として、という意味ね。

691:デフォルトの名無しさん
09/11/09 23:59:27
>>689
77では配列の宣言のところだけだったか、文字列では部分文字列の指定に使えた。
あとフォーマットでもコロンが使えたはず。


692:デフォルトの名無しさん
09/11/11 02:45:21
character*7 mojiretu
mojiretu = 'smtwtfs'
write(*,*) mojiretu
mojiretu(2:6) = 'sssss'
write(*,*) mojiretu

みたいな使い方の事だね。規格が30年くらい前だけど、その後のベクトル表現の匂いがする。
そういう文字列取扱いの需要があったからだろうけど、先をいってたんだな・・・たぶん。

フォーマット中の例が思いつかなかった。

693:デフォルトの名無しさん
09/11/30 16:44:28
今後GPGPU系のスパコンが主流になってきたら、いっそCに乗り換えたほうがいいのかな・・・
もうしばらくは様子見だけど

そういえば、CUDAが徐々にFortranに対応してきてるようだけど、使ってる人いる?

694:デフォルトの名無しさん
09/12/01 00:04:39
>>693
PGI が CUDA 対応 Fortran2003 を出荷し始めたみたいだけど、誰か使ってないのかな?

GPGPU も昔のアレイプロセッサとよく似ているから、すぐ廃れて終わるとか言う話も聞いて
なんなんだかなーw 


695:デフォルトの名無しさん
09/12/01 21:46:47
PGI頑張ってるよな
まぁ、うまくいけばIntelの二番煎じなポジションから脱却できるしな

696:デフォルトの名無しさん
09/12/14 01:04:11
フォートランを研究室で指定されて使おうとしてるんですけど
>>2
URLリンク(www.salfordsoftware.co.uk)
のどこからダウンロードするのかみつからないんですけど教えてくれますか?お願いします

697:696
09/12/14 01:05:55
間違えました
すみません

698:デフォルトの名無しさん
09/12/17 14:58:51
URLリンク(www.ftc.gov)
Intel secretly redesigned key software, known as a compiler,
in a way that deliberately stunted the performance of competitors’CPU chips.

だってさ

699:デフォルトの名無しさん
09/12/18 00:24:24
いろいろ考えるもんだねー

700:デフォルトの名無しさん
09/12/18 22:51:01
Fujitsu製Fortran&C Package Windows版が製造・発売中止となったため、
今後Windows XPの提供が終了すると新しいPCに使用出来なくなるので
新たなコンパイラーと数値計算ライブラリを探しています。
どなたかお勧めのメーカを教えてください。
条件は、Windows Vista & 7上で動作するコンパイラーとライブラリで
リーズナブルなもの。
パソコンは私1人で70台くらい使っています。
(Fujitsu製のライセンスは使用する人数にかかり、
PCの台数には関係なかったので重宝していたのですが。)
よろしくお願いします。


701:デフォルトの名無しさん
09/12/18 23:31:05
富士通がPC用Fortranやめるなら、OEMやってるアメリカのLaheyはどうすんだろ?


702:デフォルトの名無しさん
09/12/19 15:46:30
>>698
HPCが盛んになりつつある時代にこんなことやってたら
某機関に目を付けられて即死なんじゃw

703:デフォルトの名無しさん
09/12/20 05:34:39
某機関とは話をつけてからやらかしたのではw

704:デフォルトの名無しさん
09/12/21 18:27:54
FORTRAN使いなんかホントにいるのかいな・・・

705:デフォルトの名無しさん
09/12/22 10:23:48
cygwin、MPICH2でCompaq Visual fortran 6.6 を動作させる方法があれば教えてください。
MPICHのインストール時に set F90=~/Microsoft Visual Studio/DF98/Bin/f90
としてみたのですが、認識しませんでした。

706:デフォルトの名無しさん
09/12/26 10:50:24
あっそう

707:デフォルトの名無しさん
10/03/28 18:31:28
今,Intel Visual Fortran と PGI Visual Fortran のどちらを買おうか迷っています。
皆さんのお勧めはどちらですか?

実行速度とか,GPGPUとか,並列化とか,Visual Studio 2008 に統合してコーディングしているときの
使い勝手の良さとか,コンパイラの厳密さとか(← 変数宣言部で配列を a(3) と宣言しているのに,
実行部で a(4) = 1 と書いたとき,IVF のコンパイラはエラーを出してくれたけど,PVF のほうは
エラーなしでコンパイルが成功してしまった),その他色々な面でどうでしょう。


708:デフォルトの名無しさん
10/03/28 21:32:36
個人的には PGI はあまり信用していない
つか、Windows 環境で Fortran が信用できていない
# Intel は, まぁ, ましな部類だと思う


709:デフォルトの名無しさん
10/03/29 00:21:06
>>707
>実行部で a(4) = 1 と書いたとき,IVF のコンパイラはエラーを出してくれたけど,PVF のほうは
>エラーなしでコンパイルが成功してしまった),その他色々な面でどうでしょう。
66時代は整合配列が未整備だったので、サブルーチンとかの先では配列サイズを適当に固定して
はみ出して使うことがよくあった。歴史的事情から一概にエラーにするわけにもいかんのよ。

コンパイラのオプションとかで厳格な判断ができるはずだと思うから、調べてみてちょ。
IntelFortranにも90,95,2003毎の規格違反警告オプションが有る。

そういえば最近のPGI Fortranは米国大学研究機関に所属であれば、Win用が無償で使えたような?
キャンペーンはもう終わったかもしれないが。



710:デフォルトの名無しさん
10/03/29 03:32:41
IVF って GPGPU ができるのですか?

711:デフォルトの名無しさん
10/03/29 12:08:17
>>710
できない。

CUDAのAPIをCALLするという意味でならできなくも無い。
Fortranのラッパーを書くオープンソースなプロジェクトが動いていたはず。
GPU側で実行する部分は無論Cで用意するのだとおもうが。



712:707, 710
10/03/29 21:38:52
>>708-709 >>711
レスありがとうございました。参考になりました。

713:デフォルトの名無しさん
10/03/30 03:50:29
>>707 コンパイラの厳密さとか(← 変数宣言部で配列を a(3) と宣言しているのに,実行部で a(4) = 1

インテルのは添字範囲チェックが甘いよね。柔軟ともいえるけど・・・。
コンパイル時の警告のよさ?では gfortran -Wall あたりがいちばんかなぁ
以前はDEC系でいいのがあったんだけどね。さすがに今では。

714:デフォルトの名無しさん
10/03/31 06:17:02
(メイン階層で)
real a(10)
call hoge(a)

subroutine hoge(a)
real a(2)
a(10) = 1.0

というのがあって、スルーする大人がインテル。実際メイン階層では配列a(10)の内容に問題ないわけだ。
文句いうのがGfortranやFujitsuやPGIやIBMやNEC

715:デフォルトの名無しさん
10/03/31 16:56:36
>>714
そのsubroutineはモジュールじゃない、普通の外部サブルーチンという前提だよね
a(11)=1.0をやるとエラーになる?

716:デフォルトの名無しさん
10/04/01 02:37:19
>>715
そ、ただのSubroutine.
Module は値の追跡が面倒臭いし、コンパイル時に順番が関係するし、
Commonと同じような奇妙な振舞をする事もあるので自分では使わない。なれると便利らしいけどね。

a(11)=1.0
そのものにたいしては、コンパイル・実行時ともに文句をいわなかった。(以下ぜんぶIntel.他のはしらない)。
でも実行時にはcall hoge()のあとに a 以外の変数が壊れたりw、 hoge() 内で Invalid なんたららが
でたり・・コンパイルオプションでも変わる。何事もなかったかのように実行終了することもあるw
Intel Fortran は速度的には良いコンパイラだとおもうけど、
開発中に使うには危険な香りがするのでふだんはgfortran。
Intel のでも Visual がつく方はまだいいのかなあ? HPはもうDEC系譜のFortranは終了だよね。

717:デフォルトの名無しさん
10/04/01 11:50:28
>>716
MODULEつかえよw
型チェックとか便利だろ。
場合によっては最適化度もあがるはず。

まぁカスケード型のリコンパイルの嵐が起きるのがウザイのはわかるが、
あれもF2008でSUBMODULEが導入されてなんとかなる。


718:デフォルトの名無しさん
10/04/01 13:34:16
2008興味あるけど、使ってる人が周りに誰もいない・・・
というかググってもあんま情報ない気が
どこで勉強すればいいの?

719:デフォルトの名無しさん
10/04/01 14:28:48
716 の添字範囲うっかりさんはIntelだけの話ね。
他のはコンパイルエラーでそれ以上進めなかったから。

>>717
ある程度なれてマイModuleつくるともう戻れないくらいイイらしいね。
麻薬のようにもう抜けれなくなる、わけではないのだろうけどw
でも不慣れなときにコンパイルするだけにかなりもがいた
つらい経験をしてしまったので敬遠中。でもそのうち使うと思うよ!
>>718
F2008って規格の部分だけでも読めないのかな?
ベンダが対応するとかしないと商業レベルの本は出ないと思うので
(出ても日本語のがでるのかはあやしいが)せめて予習wくらいはしておきたい。

720:デフォルトの名無しさん
10/04/01 16:57:44
>>719
初心者だけど動的割付配列のためにモジュール使ってます
やっぱりコンパイルエラーやらは多いですね

721:デフォルトの名無しさん
10/04/02 01:32:14
>>718
それはたぶんF2003。
まだ完全対応コンパイラがCRAYしか出してない。
勉強の手始めは、PDF直リンだが
URLリンク(www.itscj.ipsj.or.jp) 
The New Features of Fortran 2003
URLリンク(www.ipc.bas.bg)

F2003は英文なら、なんぼか教科書もではじめている。しかし2003部分は1章程度だったりでいまいち。


F2008は
The new features of Fortran 2008
fURLリンク(ftp.nag.co.uk)
こっちはまだ規格の最終ドラフトができた段階で、正式規格ではない。最終ドラフトはただで見れる。
ここで↓
ISO規格の議論をしている本家
URLリンク(www.nag.co.uk)


722:デフォルトの名無しさん
10/04/02 08:05:25
ナグさんちが本家なのか

723:デフォルトの名無しさん
10/04/02 09:13:00
NAGが本家なのかよw

724:デフォルトの名無しさん
10/04/02 10:58:31
本家っつっても書記だけど、まぁ議事録的情報はここに集約されてるな。


725:デフォルトの名無しさん
10/04/02 12:15:07
softekみたいなもんか?w

726:デフォルトの名無しさん
10/04/06 06:01:13
教えて頂きたいのですが、
2次元配列の一部分だけをサブルーチンに送った場合、その部分的な要素だけを
繋げた別の配列が一時的に作られて処理をされるのでしょうか?

例えば、主プログラム冒頭で
integer :: x(10 , 20)
とした場合、メモリ上に10 * 20 の配列が出来ますよね?
これを call hoge( x(3:8 , 12:19) , ... ) とすると、
6 * 8 の一時的な x’ が別途メモリ上に作られたうえで
それがサブルーチンへ送られるのでしょうか?

膨大な配列を扱うので、なるべく効率的なプログラムを書きたいのです.
勉強し始めの者なので、トンチンカンなことを言っていたら恐縮です...

727:デフォルトの名無しさん
10/04/06 10:22:37
>>726
そういう連続していないのはcopy in - copy outで中間のテンポラリ配列が暗黙に作られる。

一次元に還元したときに連続している場合は、コピーを作るかどうかは場合によると思う。




728:デフォルトの名無しさん
10/04/06 17:30:33
データがシーケンシャルだって指示するオプションあったような?
いずれにしても、call hoge( x(3:8 , 12:19) , ... ) だと「一次元に還元したときに連続」していないから、コピーは避けられないだろうな

729:デフォルトの名無しさん
10/04/06 17:55:20
うひょー!Fortran!!11

730:デフォルトの名無しさん
10/04/06 18:10:43
Fortran2011の策定が始まったのかと思った
紛らわしいぞw>>729

731:726
10/04/07 07:28:05
>>727, 728
なるほど。どうもありがとうございます。
 
余計なメモリを消費させないためには、
call hoge( x(3:8 , 12:19) , ... ) は避け、
call hoge2( x, 3, 8, 12, 19, ...) などとして、サブルーチンへは x のまま渡して
実際に操作したい配列要素番号も別に指定するといった方法が良いって理解でよいでしょうか

もう一点質問があるのですが、
call hoge2( x, ... ) と call hoge2( x(:), ... ) は全く同じものでしょうか?
コンパイラーによりけりですか?


732:デフォルトの名無しさん
10/04/07 19:52:50
>>731
あくまで自分の理解だけど
>理解でよいでしょうか
yes
>全く同じものでしょうか?
yes

733:デフォルトの名無しさん
10/04/08 00:15:00
はとやまwwwwwwwww

天然バカwwww



734:733
10/04/08 00:16:10
すまん、笑いすぎて、誤爆したwwwwww


★「政治家がばかでは国もたぬ」=公務員研修の訓示で鳩山首相

・鳩山由紀夫首相は7日の国家公務員合同初任研修開講式で訓示し、入省したばかりの
 新人を鼓舞したが、その中で「政治家がばか者の集団では(国は)もたない」などと
 脱線気味に発言する場面があった。

 首相は弟である鳩山邦夫元総務相が政治家を志した際、大蔵事務次官を経て
 政界入りした父威一郎元外相が「政治家なんてものは物ごいをする情けないばか者だ」と
 反対した話を紹介。「父親は役人だったことに誇りを感じていた」と語る一方で、
 「トップの首相が大ばか者であれば、そんな国がもつわけがない」と繰り返した。

 首相としては、政治主導への決意を示しつつ鳩山内閣の優秀さを強調したかったようだが、
 指導力不足や自らの発言をめぐる迷走が指摘されているだけに、新人公務員も複雑な
 表情だった。
 URLリンク(www.jiji.com)

735:デフォルトの名無しさん
10/04/08 08:05:38
スレタイも読めないバカ

736:デフォルトの名無しさん
10/04/08 11:25:29
>>735
鳩山さんこそスレタイ見てください。


737:デフォルトの名無しさん
10/04/08 17:04:56
>>736
バカ

738:デフォルトの名無しさん
10/04/09 23:07:01
このスレ2000でも90でも77でも66でもなく、未だにIVかよ。

739:デフォルトの名無しさん
10/04/17 01:15:02
    LOOPY = 737
    PRINT *, LOOPY
END



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