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


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

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



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

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


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

くだすれFORTRAN(超初心者用)その2
pc11.2ch.net/test/read.cgi/tech/1164121236/

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

116 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:06:06 ]
俺の方法は
character(len=50):: fmt
integer:: line
write(fmt,*) "A7,", line, "F8.2"
do i = 1, ii
read(40,fmt) dummy3,(a(i,j),j=1,jj)
enddo
てやると思う。

数字書き出すときに1桁、2桁、3桁それぞれ別書式にする場合に使ってる。




117 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:45:46 ]
しかし、FORMAT文の動的変更は200レス毎に1回くらいは必ず来るなw
これが教科書に載っていないという点で、一体教科書執筆者は何をやっているのかと問いつめたい。

漏れ自身の場合も、この方法を知ったのはFORTRANやり始めて5年目くらいだったか。
他人のソースを読んでいて、意味不な変なことやっているなと、最初は思ったw

改めて文法書を読めば、確かに内部ファイルの項目はあったのだが、読み飛ばしていた。
文字変数が無くて整数変数に文字をつっこんでいたFORTRAN66のホレリス時代の聖遺物かと思っていたw


118 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:36:12 ]
良くも悪くも数値計算用言語ですから、
数値を上手く取り扱う方法に目がいって
その辺の所は教科書書く人も勉強する人も興味ない。

119 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:25:45 ]
>>115
>>116
無事にいけました☆本当にありがとうございました!

120 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:55:37 ]
>>118
読者は興味ありまくりんぐじゃないの。この質問ばっかりで無限ループしているジャン。

まぁ、
1.フォーマット文が文字列や文字変数で与えられる。
2.内部ファイルによって、文字列⇔数値変換が出来る。
という、あまり知られていない2点を同時に使うので、教育の威力が如実に現れる項目であるはずなのだが。



121 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:23:33 ]
執筆者予備軍としての一言

 ・VB やJAVA のようにさまざまな発刊企画があれば、
  上級者向け書籍が作れるが、Fortran では無理。

 ・初心者向け書籍では、内容を厳選するよう要請される。
  頁数を少なく、文字数を少なく、挿し絵を充実、などなど。
  common や内部ファイルは真っ先に削除対象となる。

122 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:27:04 ]
COMMON文の説明なんて要らないから
純粋なFortran95の解説書出してよー
F2003でもいいけど

123 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:55:12 ]
COMMON 文は F77 では必要悪だが
F95 だとバグを産む素でしかない。

124 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:44 ]
>>121
コラムとか付録のサンプルとかで、何とか突っ込んでくれ。




125 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:53:35 ]
動的の説明を書かないにせよ
character(len=20):: fmt
fmt = 'A5,2X,I10'
100 format(fmt)
って例が載っているだけでも、
あーこんな使い方できるんだ〜
って思えるよなあ。

126 名前:118 mailto:sage [2008/02/04(月) 01:00:23 ]
>>120
質問してくるのは、勉強中の人じゃなくて一通り基礎を勉強して、
より実用的、応用的なプログラムを組んでる人だと思うんだよね。
Fortranは数値計算とセットでやる事が多いだろうから
優秀な大学じゃないと内部ファイルまでやれないよ。
無理してそこまでやっちゃったら、大切な部分が疎かになったり
数%しか単位取れませんでしたとか言う事態になっちまう。

127 名前:デフォルトの名無しさん [2008/02/04(月) 16:50:31 ]
symbol A is not an array

こんなエラーが出るんですが何がいけないんでしょう?

128 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:59:12 ]
シンボルAは配列ではありません

129 名前:デフォルトの名無しさん [2008/02/04(月) 19:58:45 ]
Statement function statement cannot occur here

invalid forward reference to label 117

>>128ありがとうございます
ちなみにこれはどうすればいいんでしょう?

130 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:17:37 ]
>Statement function statement cannot occur here
文関数はここに存在することが出来ません

実行文の後ろなど、文関数の定義を置けないところに文関数の定義がある。
配列や関数の引用の書き方が間違っている可能性もある。

>invalid forward reference to label 117
ラベル117の無効な前方参照

文番号117が参照されているが見つからない。


どれも簡単な英文で、読めば全てではないにしろ大まかに察しが付くような文なので
エラーメッセージは自分でよく読むように習慣づけよう。

131 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:17:27 ]
>>129
>>130氏を補足しよう。

>Statement function statement cannot occur here
これは未宣言の配列を用いるとよく出てくるメッセージだ。
配列を宣言し忘れていたり、綴りを間違い、かつ添え字に変数を使っていると出てくる。

FORTRAN77では文関数なるものが導入された。
これは一行で書ける関数を宣言文のところで宣言しておくと、実行文のところで利用できるというものなのだか
大して役に立たないのでほとんど使われない。それだけならよかったのだが、とんでもない副作用が生じてしまった。

実行文のところに、たまたま変数を添え字とする宣言し忘れの配列を使ったとする。
すると見かけ上は文関数の定義のように見えるので、(そういうパターンにマッチしてしまうので)
上のようなエラーメッセージが現れることになる。



f(i) = 5 * i + 1

これが宣言文のとこに現れば、f(x) = 5 x + 1 という関数を文関数で宣言したことになるし、
DIMENSION f(10)
i = 1
f(i) = 5 * i + 1
....
のような形で現れれば、配列fのi番目の要素に、5i + 1を入れる代入式と解釈される。


この文関数がらみのエラーは、だされるメッセージと実際のエラーの内容が食い違っているので、
FORTRAN77初心者を惑わす罠になっている。
これは必ず通る道なので、まぁ文句言わずにあるがまま受け入れろw


132 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 07:36:18 ]
>こんなエラーが出るんですが何がいけないんでしょう?

俺なら「おまえの頭」っていうところだけどな


133 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 11:07:31 ]
>>132
うっせー おまえこそ すっこんでろ!w

ここはくだスレだからFORTRAN振興のために、宿題も解く甘やかしスレだ!

134 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:24:45 ]
FORTRANってなんですか?
アプリケーションを作れたりするプログラミング言語なんですか?



135 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:59:57 ]
科学研究をするログラミング言語です

136 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 15:48:50 ]
Linuxでの実行モジュールを作るには、Linuxで開発・コンパイルするしかないんでしょうか?
WindowsのVisualStudioに慣れてしまったので、この上で全部できればいいなと思うんですが・・・

137 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:42:45 ]
Linuxでやるしかないかな。

だけど、コーディングをLinuxでやる必要はないので、
そんなに大変じゃないと思う。

コンパイルオプションをLinux版に変えるだけで
頑張ってMakefile書くくらいで終わりっしょ。


特にVisual Studio + Intel fortran
から
Intel fortran Linux
に行くだけなら
つまづくこともかなり少ないと思われ。


138 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:16 ]
gcc をクロスコンパイル用にコンパイルしてしまえば
別に Windows 上でも Linux 用のバイナリを作ることはできるが、
Visual Studio 上となると・・・。
自分で makefile 書けば一応いけるのか?
まあ、一番の問題はデバッグが大変ってことか。

139 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:58:55 ]
./a.out


140 名前:136 mailto:sage [2008/02/08(金) 00:16:57 ]
>>137
ということはWindowsとLinux両方買わないといけない、ってことですよね?
コンパイラスイート買う予定ですが、Academicでも10万超えは堅いですね・・・

>>138
gccはGNUなだけにその辺偉いのですが、速度が・・・
数値計算だとどうしてもLinuxが主流なので、色々と悩ましいところではありますね。

141 名前:136 mailto:sage [2008/02/08(金) 00:21:06 ]
今気づいたのですが、Intel FortranコンパイラをVisual Stuido上で使った場合
出てくるロードモジュールはもしかしてマネージコードになるんでしょうか?

142 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:52:57 ]
>>140
学術目的ならLinux版は無期限ライセンス版が落とせる。

>>141
普通のEXEバイナリを吐く。



143 名前:136 mailto:sage [2008/02/08(金) 10:07:16 ]
>>142
>学術目的ならLinux版は無期限ライセンス版が落とせる。
↓ですね。
ttp://www.intel.com/cd/software/products/ijkk/jpn/224378.htm
コンパイラ以外も可とは、気前いいですね。
ただ、いくつかはPage Not Foundになってたりしますが・・・

>普通のEXEバイナリを吐く。
そうですよね、安心しました。
そういえばLinuxにはmonoがあるから、いちおうマネージコードでも動くことは動くのかなぁ

どうもありがとうございました。勉強になりました。

144 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 19:45:07 ]
VisualStudioがあるのにIntel C++コンパイラ必要?
Intelのほうが速いから?



145 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:58:28 ]
>>144
FORTRANと組み合わせるならIntelC++の方が楽。
BLASの類のライブラリのこともあるし。SSE、並列化等のCPUの最適化もIntelのほうが対応が早い。
またLINUXとWinとで同じにやろうとするなら条件がそろうのでIntelの方がいい。
無論C++でWin32API叩いたりするならMSの方が有利だろう。

146 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:56:22 ]
>>145
なるほど
thxです

147 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:58:08 ]
かなりどうでも良いことなんですが、
vimで.f90のソースを書いていると、
勝手にインデントをスペースに置き換えられるんですよね。
まあnoexpandtabすればタブ文字で書けるんですが、
syntaxの設定上タブ文字が赤く表示されてなんだか不安な気分に。
これもsyntaxファイルを改変すれば変えられるのでしょうけど。

fortranの世界ではソースにタブ文字を使わない事が常識なんでしょうか?

148 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 20:12:21 ]
常識
1行72文字とか132文字とか制限があるのに
何文字にカウントされるか分からないタブ文字を使うなんて
プラットフォーム依存性を無駄に招いているとしか思えない

149 名前:147 mailto:sage [2008/02/11(月) 20:42:23 ]
>148
なるほど。文字数の制限があるからですね。
fortran90から入ったので、
ほとんど文字制限を気にした事が無かったから気づきませんでした。
ありがとうございました。

150 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:25:04 ]
>>148
> 常識
> 1行72文字とか132文字とか制限があるのに

f90 は自由形式だからその制限は無いはず。
f77 は制限アリ。

151 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:50:24 ]
>>150
文法書をもう一度読め。
Fortran90は132カラムだ。

Fortran2003ではもう少し増やす。機械生成のコードだと、変数名などが長くなりやすいから。

それにしてもインデントでタブが入るエディターは本当にむかつく。


152 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:55:05 ]
行頭のスペースを勝手にタブ文字に変えられると「タブ形式」と間違えられちゃうよー

153 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 00:05:18 ]
少なくとも Intel Fortran は1行の文字制限はないよ。
他のコンパイラも大概独自で対応しているんじゃないかな。

154 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:37:30 ]
NagのFortran Builder という開発環境を使ってる方いましたら、どんなものか教えてくれますか?
ttp://www.nag-j.co.jp/FortranBuilder.htm
他社A他社Bってどこでしょうかね?



155 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 12:19:44 ]
>>153
まぁFortranの規格はISOが決めているから。
各ベンダーの拡張は拡張として。

Intelは確かに原則制限無し、7200文字のようだ。
>Free Source Form
>In free source form, statements are not limited to specific positions on a source line.
>In Fortran 95/90, a free form source line can contain from 0 to 132 characters.
>Intel Fortran allows the line to be of any length.

>Fortran source line length
> fixed form: 72 (or 132 if /extend_source is in effect) characters;
>free form: 7200 characters


156 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:54:10 ]
目が悪くて文字解像度をあげられず、
エディターの一行表示上限が94文字しかないオレ様にしてみれば、
132文字も7200文字も無限と同じ。

157 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:17:43 ]
makedepf90、Windowsでビルドできないかなぁ。
みなさんオブジェクトの依存関係とか、どうやって調べてますか?

基本的に1ファイルに1個モジュールで書いてるから
use文を抽出さえすれば簡単にできそうか

158 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:40:42 ]
うほっ!
前スレに自己出力プログラムが出ていたが、俺も作ってみた。
IntelFortranで確認した。
一応F90の規約にのっとっている。以前上げられていた奴より分かりやすいのではと思うが如何?
ここでCHR(39)は『'』。

CHARACTER(LEN=68)::f
f='("CHARACTER(LEN=68)::f"/"f=",3a/"PRINT f,CHAR(39),f,CHAR(39)"/"END")'
PRINT f,CHAR(39),f,CHAR(39)
END



159 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 16:52:02 ]
Vistaで使えるフリーのfortran90コンパイラってありますか?

160 名前:デフォルトの名無しさん [2008/02/13(水) 17:24:29 ]
どうやってもこのエラーが消えないけどどうしたらいいんだろう?

assignment between arrays of differing rank

161 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 17:38:11 ]
>>159
Vista + Cygwin + gfortran or g95

162 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 00:50:54 ]
>>159
Silverfrost の FTN95 かな。Vistaで動くかは知らんがw
ttp://www.silverfrost.com/11/ftn95/overview.asp

>>160
配列の次元があっていないと言っているので、そのエラー行をよく見直すしかない。


163 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:44:10 ]
FORTRAN90 を勉強している者ですが構造体を下記のプログラムのように
使いたいのですがエラーがでてしまいます。m と n は、上位ルーチンのみ
で固定させたい(下位ルーチンにはサブルーチンの引数でサイズを渡したい)
のですが上手い方法をお教え頂けますでしょうか?構造体を使わず、
a(n,m) i(n,m) と配列にすればいいのでしょうが構造体を使って
書きたいので質問させて頂きました。よろしくお願い致します。m(_ _)m
program test
implicit none
integer,parameter::m = 1
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou)::data(m)
call dataset(data,m)
write(*,*) data(1)%a(1)
write(*,*) data(1)%l(1)
end program
subroutine dataset(data,m,n)
implicit none
integer,intent(in)::m,n
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
type(kouzou),intent(out)::data(m)
data(1)%a(1) = 3.0d+00
data(1)%l(1) = 2
return
end

164 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:23:42 ]
>>163
記憶が正しければ、それはFortran95以前では出来ない。
TYPEの中の型やサイズを引数にするのは、Fortran2003で導入される機能だ。
Fortran95以前で実現するには、POINTER属性で宣言してメインでALLOCATEするのかな?
ただ、単にTYPEの宣言を1ッ箇所で済ませたいだけならば、独立したMODULEでTYPEを宣言して
あとは残りのルーチンでそれをUSEすればよいと思う。

MODULE m_type
IMPLICIT NONE
integer,parameter::n = 1
type kouzou
real(8)::a(n)
integer::l(n)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(out)::data_(m)
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
(以下略  (ここではm_typeをカスケードに呼んだが



165 名前:デフォルトの名無しさん [2008/02/17(日) 11:02:41 ]
スレチと思うけど質問させてください。
計算機によく入っているbsubとかqsubって打ってjobを実行するソフトって
何て言う名前ですか?フリーウェアですか?

166 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:10:40 ]
>>165
それはジョブ管理システムというものだ。
ググレばなんか出てくるだろう。

普通はメーカー毎・OS毎に独自のものがある。
LinuxとかだとLSFというのが主流の気がする。
UNIXはTSS処理を売りにしていたので、むかしJOB管理が糞だった。


167 名前:165 [2008/02/17(日) 14:40:22 ]
>>166

ググって色々調べてみたところ「Generic NQS」ってのが
フリーみたいですね。
自宅で数値計算をして遊んでみようと思いまして(;^_^A
どうも返答有り難うございました。

168 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:25:42 ]
Intel Visual Fortran での、Windows用グラフィック・ルーチンを作っています。
プロトタイプができているので、興味がある人は見てみてください。
ttp://d.hatena.ne.jp/fortran66/

やりたいことは、昔のBASICやXYプロッタ時代のようなグラフィックス・ルーチンで、
普通のコンソール用プログラムから簡単に呼び出せて、かつ対話的に絵を描けるものです。

変な何をやっているのかまったく不明なライブラリ集とかをインストールすることなく、軽く実現するのが目標です。
大げさなものにはせず、各人で好きなように拡張できるような、見通しの良い最小構成が出来たら良いかなと
思っています。




169 名前:163 mailto:sage [2008/02/17(日) 23:44:38 ]
>>164 さん
丁寧なご回答どうもありがとうございます!! 返信が遅くなり
申し訳ございません。今、intel fortran compiler 10.1 で
メイン部分を下記にして動くことを確認できました。
Fortran2003で導入される機能ということで驚いています。

program test
use m_subs
implicit none
integer,parameter::m = 1
type(kouzou)::data_(m)
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
end program


170 名前:163 mailto:sage [2008/02/17(日) 23:45:55 ]
実は、私がやろうとしていたのは、構造体のサイズ m とその中の要素の
サイズ n を下記のように入力データのようなものから動的に取得して
構造体の確保を実現させようと考えておりました。
下記のようなプログラムの構造体バージョンが目標でした。
下記の配列バージョンだと確保した配列全部をサブルーチンの
引数でひきずっていかなければならないと思うのですが構造体で
定義しておけば配列をパックにした構造体 1 つを引数で渡せると
考えました。
164 さんに教えて頂いたプログラムの MODULE m_type での
構造体の中の要素のサイズ n は、動的(データで決定)ではなく
parameter 文で静的にコンパイル時に確定させなければ
ならないんですよね?
長々と書いてしまって申し訳ありません。m(_ _)m

171 名前:163 mailto:sage [2008/02/17(日) 23:46:47 ]
program test
implicit none
integer::m,n
read(5,*) m,n
call test2(m,n)
end program
!
subroutine test2(m,n)
implicit none
integer,intent(in)::m,n
real(8),allocatable::a(:,:)
integer,allocatable::l(:,:)
allocate(a(n,m),l(n,m))
call dataset(a,l,n,m)
write(*,*) a(1,1)
write(*,*) l(1,1)
deallocate(a,l)
return
end
!
subroutine dataset(a,l,n,m)
implicit none
integer,intent(in)::m,n
real(8),intent(out)::a(n,m)
integer,intent(out)::l(n,m)
a(1,1) = 3.0d+00
l(1,1) = 2
return
end

172 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:32:34 ]
>>170 そういうことなら、以下のように出来る。
MODULE m_type
IMPLICIT NONE
type kouzou
real(8), POINTER::a(:)
integer, POINTER::l(:)
end type kouzou
END MODULE m_type
!
MODULE m_subs
USE m_type
CONTAINS
subroutine dataset(data_,m)
implicit none
integer,intent(in)::m
type(kouzou),intent(in out)::data_(m) ← INOUTにしないと駄目みたい。
data_(1)%a(1) = 3.0d+00
data_(1)%l(1) = 2
return
end subroutine dataset
END MODULE m_subs
!
program test
USE m_subs
implicit none
integer,parameter::m = 1
INTEGER :: n = 2
type(kouzou)::data_(m)
ALLOCATE(data_(1)%a(n), data_(1)%l(n))
call dataset(data_,m)
(以下略
ただALLOCATEは配列の全要素にいちいちやらないと駄目。解放も面倒。コンパイラによってはPOINTERはALLOCATEでも可。

173 名前:163 mailto:sage [2008/02/18(月) 14:44:48 ]
>>172 さん、本当に感謝です!! 上手くいきました。
ありがとうございます!! m(_ _)m
下記にすることで動的に確保できました。
上手い方法があるもんですね...
ただ、指摘された以下の場所は、私が試したところでは、inout で
なくても OK でした。
type(kouzou),intent(out)::data_(m)
あと、解放ですが deallocate(data_) 一発で OK?

program test
use m_subs
implicit none
type(kouzou),allocatable::data_(:)
integer::i,j,m,n
read(*,*) m,n
allocate(data_(m))
do j = 1,m
do i = 1,n
allocate(data_(j)%a(i),data_(j)%l(i))
end do
end do
call dataset(data_,m)
write(*,*) data_(1)%a(1)
write(*,*) data_(1)%l(1)
deallocate(data_)
end program

174 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:43 ]
>>173
多分Intelのコンパイラなら、POINTERをALLOCATABLEにしてもよいはず。
Fortran2003で可能になる機能だが実装されている。

>あと、解放ですが deallocate(data_) 一発で OK?
多分、ALLOCATEしたときと同じようにいちいち解放しないと駄目だと思う。
少なくともPOINTERの時は。ALLOCTABLEの時はいいかもしれないが、忘れたw 調べてチョ




175 名前:163 mailto:sage [2008/02/19(火) 00:01:59 ]
>>174
構造体とポインタの使い方が分かって非常にためになりました。
ありがとうございます。色々と変えてみて試してみます。m(_ _)m


176 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:37:08 ]
単精度をコンパイルオプション一発で倍精度にすることってできますか?

177 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:59:45 ]
>>176
> 単精度をコンパイルオプション一発で倍精度にすることってできますか?

コンパイラは何?

178 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:01:57 ]
>>176
一般的に、コンパイラには自動で倍精度にするautodblオプションがあることが多いので、マニュアル見ろ。

IMPLICIT REAL*8(A-H,O-Z)を入れるやり方もあるが、定数も倍精度にしないと下の桁にごみが入るので中々
容易い道ではない。


179 名前:490 mailto:sage [2008/02/27(水) 02:25:14 ]
ちょっとずれた質問かもしれませんが、
皆さんプログラムを書く(デバッグ)するときに使っているツールで「これは便利だ」と思うツールを教えていただけませんか?
わたしは大体vimで書いているのですが、tagexplorer.vimというスクリプトを使って、関数などを別のウィンドウに出したりしているのですが...
最近emacsで書いてみたいなあと思うようになって情報を集めているのですが、あまり情報が見つからないんです。
Cだとcscopeとか便利なツールがあるみたいなんですが...

180 名前:デフォルトの名無しさん [2008/02/27(水) 13:43:03 ]
>>176
intel fortran だと、 -r8 で一発、
fujitsu だと -RR8 かなにか、でまぁとにかく一発。
念のためにと、parameter文や sin などの intrinsic な関数を適当に使った、
適当に1000回くらいiterateする短いコードを
最初から倍精度で書いたやつと、
単精度で書いたコードをオプションつけてコンパイルして計算したら、
計算の結果はbinary で一致した。
ほかのコンパイラでも似たようなもんだろう。


181 名前:176 mailto:sage [2008/02/28(木) 20:15:57 ]
>>178
Intelコンパイラでした。マニュアル見たら速攻見つかりました・・すいませんでした。
autodblはHPやIBMのコンパイラでの名前みたいですね。

>>180
さすがにロードモジュールはバイナリ一致じゃないですよね。
わざわざ調べて頂いてありがとうございました。

182 名前:180 mailto:sage [2008/02/29(金) 13:13:23 ]
>>181

べっ、別にあんたのためになんたらかんたら。

昔作ったのをもっかいコンパイル&実行してみただけ。
intel fortranはまめにバージョンを上げてくれてありがたいんだけど、
時々挙動が変わるからね。以前やったときはできあがった実行ファイルも
同一になったよ。バージョンによっては実行ファイル作成時の日時が
格納されるのか(推定)、全く同じファイルを全く同じオプションでコンパイルしても
同一でない実行ファイルが出来ることがあったけど。
今使っている version 9.1 だとサイズは同じで先頭部分の100バイトくらい微妙に違う。


183 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:24:30 ]
>>182
うわ、ツンドラだツンドラだ

184 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:19:56 ]
>全く同じファイルを全く同じオプションでコンパイルしても
>同一でない実行ファイルが出来ることがあったけど。
「このファイル同じだっけ?」って確認をcmpでやる癖のある自分としては、ちょっと厄介だなぁ

IntelFortranは今10.1だっけ?




185 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:27:05 ]
Windowsの実行形式ファイルのヘッダには作成日時が入る箇所があるので、
IVFに限らず仕様通りに実行ファイルを生成するコンパイラ、というかリンカを使えば
同一ソースを同じオプションでコンパイルしても完全に同じ実行ファイルにはならない。

ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html

まあ、頭の方がちょっと違ってくるだけなので、違っている部分の位置で
同じ内容かどうかは判断できると思うが。

186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:48 ]
Debian+gfortranでやっています。
勉強で、以下のようなプログラムを作ってみたのですが、コンパイルエラーとなってしまいます。

program test
implicit none
real y
y=hoge(3.0)
stop
end

real function hoge(x)
real x
hoge=2.0
return
end

コンパイルするとy=hoge(3.0)のところで、
Function 'hoge' at (1) has no IMPLICIT type
といわれます。どのように対処すればよいのでしょうか。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:51 ]
>>186
IMPLICIT NONEなのに関数hoge()の宣言がないから。
対処法としては
・関数hoge()を主プログラムtestの内部手続きにする。
・testの中にhoge()のINTERFACE宣言を書く。
・hoge()を含むMODULEを作る。
など。

188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:47:26 ]
real hogeをtestで宣言するかimplicit noneを削れ


189 名前:デフォルトの名無しさん [2008/03/07(金) 00:40:07 ]
ここって、Linux環境でのFortranのインストールの仕方って
質問していいんでしょうか?

Linuxの方でも場違いな気がいたしまして。。

190 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:18:17 ]
>>189
GCC入ってないのか?

191 名前:デフォルトの名無しさん [2008/03/07(金) 14:40:22 ]
えっと、説明不足ですみません。
ここで質問してもいいかわかりませんが、とりあえず
Intel Fortran を Ubuntuにインストールしようとしたのですが、

まず、Ubuntuにデフォルトで開発環境が入っていないとか
libstdc++.so.5が
libstdc++5 だという話は解決したのですが、

コンパイラ、デバッガのインストールが終わって
Please Enter to Continue

Enter
を押しても、反応がなく、ただ改行する所で止まってます。

いろいろ調べて、Ubuntuのコミュニティで同様の投稿があったのですが、
なんだかよくわからず。(英語のページだからというのもありますが。。)

Intelが発表している内容は、
ifort とかのファイルにある
"/bin/sh"を"/bin/bash"に書き換えろとか書いてあるんですが、
すでに書き換わっていたりして。

もうお手上げです。。。

助けて下さい。。よろしくお願いします。

192 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:53:48 ]
>>191
> インストールしようとした

どうやって?

例えばl_fc_p_10.1.011_ia32.tar.gzをダウンロードして、
展開して出来たl_fc_p_10.1.011_ia32に移動して、
install.shを実行したということ?
ubuntuのパッケージはdebだから、それにrpmのパッケージをそのまま
インストール出来るのだろうか。

私はalienでdebに変換してインストールした。

193 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:28:14 ]
HPUX上の fortran90 にて

プログラムコードに”program main”と書かないと実行時に
/usr/lib/hpux64/dld.so: Unsatisfied code symbol 'main' in load module '/usr/lib/hpux64/libc.so.1'.
って表示されるんですが、”program main”を省略出来ないのは何故でしょうか?

何か環境変数で設定すればよきに計らってくれるのでしょうか?

194 名前:デフォルトの名無しさん [2008/03/07(金) 20:25:15 ]
>>192
仰るとおり、install.shからです。

intelのインストーラが起動すると、
ubuntuではg++が入ってないと出来ないとは書いてましたが、
debとかrpmという言葉は出てきませんでした。

宜しければ、どうやってインストールされたか
詳しく教えていただくと有難いです。。



195 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:57:43 ]
>>194
私はDebianは使っているけど、Ubuntuは使ったことがない。
以下はDebian使いの私のインストール方法なので、Ubuntuに
そのまま適用出来るかどうかは知らない。また、あくまで私のやり方なので、
もっと楽なやり方があれば指摘して欲しい。

$ tar zxf l_fc_p_10.1.013_ia32.tar.gz
$ cd l_fc_p_10.1.013_ia32/data
$ fakeroot -u alien intel-ifort101013-10.1.013-1.i386.rpm
$ fakeroot -u alien intel-iidb101013-10.1.013-1.i386.rpm
$ su
# dpkg -i intel-ifort101013_10.1.013-2_i386.deb
# dpkg -i intel-iidb101013_10.1.013-2_i386.deb
# cd /opt/intel/fc/10.1.013/bin
ifort, ifortvars.csh, ifortvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/fc/10.1.013に置換する。
私の場合、viで開き、
:%s/<INSTALLDIR>/\/opt\/intel\/fc\/10.1.013/g
を実行した。
# cd /opt/intel/idb/10.1.013/bin
idbvars.csh, idbvars.shを開き、<INSTALLDIR>という
文字列を、全て/opt/intel/idb/10.1.013に置換する。
ログイン時に上の*vars.shか*vars.cshファイルを読みこむように、
シェルの設定ファイルを変更する。私の場合はbashを使っているので、
~/.bashrcに
. /opt/intel/fc/10.1.013/bin/ifortvars.sh
. /opt/intel/idb/10.1.013/bin/idbvars.sh
を追加した。


196 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:03:43 ]
>>193
考えにくいな。もっと詳しく。
最小例で。


197 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:28:57 ]
>>195 さん
ありがとうございます。
実は、Linux自体初心者で勉強し始めたばかりでなかなか困ってます。
195さんのように、ファイルをrpmからdebに直してされている方はUbuntuの方でいらっしゃいました。

僕もやってみましたが、こちらはデフォルトのエディタで、optファイル内は書込み禁止になっているらしくて、
その対処法がなくストップしてしまいました。

つまり、<INSTALLDIR>の置換操作が出来なかったところです。

あと、ログイン時に読み込むファイルの設定の仕方がとか、
そういったファイルの場所がわからなくて、困っていました。

やはり普通に実行しては無理っぽいんですね。
ありがとうございました。そのあたりを勉強しなおして、もう一度やってみます。


どうやら、問題はLinuxの操作の知識不足にあるようですから。。。


198 名前:192,195 mailto:sage [2008/03/08(土) 02:08:25 ]
>>197
さようなら。


199 名前:デフォルトの名無しさん [2008/03/08(土) 11:49:08 ]
サブルーチンsabuで計算結果をディスプレイに一行出力するのですが、
open文の後ではその出力がなぜかNANになってしまいます。


program main
implicit real*8 (a-h,o-z)

call sabu(1.0, 2.0)
call sabu(1.0, 2.0)
open(unit=24, file='gomi.txt', status='unknown')
call subu(1.0, 2.0)
call sabu(1.0, 2.0)
close(24)

stop
end


のように呼ぶと、必ずopen文の次から全てNANになります。
sabuの引数を変えたり、open文の装置識別子やファイル名を変えてみてもダメでした。
また、open文前後のsabuをcallする回数を変えてもダメでした。

sabu中では何個かのサブルーチンをcallしていて、その中でopen文は合計1行だけあります。
その装置番号は2で、装置識別子が重複しているわけでは無いようです。


原因は何でしょうか?宜しくお願いします。
cygwinでg77を使っています。
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

200 名前:デフォルトの名無しさん [2008/03/08(土) 11:59:22 ]
今の時代FORTRAN使うメリットってあるんですか?

201 名前:デフォルトの名無しさん [2008/03/08(土) 12:29:51 ]
TSS

202 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 12:35:40 ]
>>199

sabu() の中で開けたものは、sabu() を出る前にちゃんと閉じてる?

sabu() の中身が分からないので何とも…。

203 名前:199 mailto:sage [2008/03/08(土) 14:30:47 ]
>>202
レス有難うございます。
sabu()中で、

open(2,file='input.dat',status='old')

に続いて、read()した後close()があり、

write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'

とwriteで挟んでみたところ正しく表示されるので、
close文は実行されているのだと思います。

204 名前:199 mailto:sage [2008/03/08(土) 14:31:49 ]
担当の先生によるとsabu以下は公開してだめだそうで、
一部を以下に写してみます(中略が要領を得ないときはご指摘ください)
cccccccccccccccccccccccccccccccccccccccc
subroutine sabu (xvalue,zvalue)
implicit real*8 (a-h,o-z)
< 中略(commonとdimension) >

open(2,file='input.dat',status='old')
< 中略(doとcontinueに挟まれてread) >
write(*,*)'debug: close begin'
close(2)
write(*,*)'debug: close end'
call sub1
<中略(ifとdoに挟まれて変数へ代入)>
call sub2(x,eps)
write(*,2000)(df(i),i=1,10)
2000 format(10e15.3)

return
end



205 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:49:47 ]
よくわかりませんが、
mainとsabuでそれぞれにopen文があるので多重openになっていませんか?

206 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 23:50:39 ]
>>204
情報が足りなくて全くのあてずっぽで書くが、昔のプログラムはAUTOMATIC変数がSAVE属性が
あるかのごとく仮定していることがあるので、コンパイラのオプションでSTATIC属性にしてみそ。


207 名前:199 mailto:sage [2008/03/09(日) 11:51:38 ]
>>205
レス有難うございます。
今writeでデバッグした限りですが、同じファイルを2回openはしてないように見えます。

流れとしては、メインprogramから、
open(unit=24, file='gomi.txt', status='unknown')

サブルーチンをcall

open(2,file='input.dat',status='old')

close(2)

サブルーチンからreturn

close(24)
となっています。


>>206
レス有難うございます。
アドバイスの通りg77で'-fno-automatic'を付けてみたらNANが無くなりました!

www-jlc.kek.jp/~fujiik/mklinux/memo/g77/porting3-j.html
>-fno-automatic: を指定すると、変数を static にアロケート します。
>これは、全てのルーチンに SAVE を付けるのと同値です。

大変感謝です。2週間これで詰まってました。
sabu含むすべてのサブルーチンでSAVEはありませんでした。

208 名前:206 mailto:sage [2008/03/09(日) 16:16:07 ]
>>207
解決おめ。
少し補足すると、サブルーチンを呼んで帰った後、もう一回同じサブルーチンを呼んだときに、
サブルーチン内のローカル変数が前回の値を保持するかどうかが問題になっている。

FORTRAN77ではSAVE文ないしオプションが定義されて、明示的に前回の結果を取っておくことが
出来るようになった。規格ではFORTRAN77では前回の値を保障していなかったはず、
FORTRAN66では未定義かな?

しかし慣習的に、FORTRAN66時代から、前回の結果が残っているような処理系の実装が主流だったために、
かつては大抵のFORTRAN77処理系ではSAVEが暗黙にデフォになっていた、と思う。

Fortran90時代になって、動的にメモリーを取ることが普通になって、SAVEを明示的に指定しないと、
毎回任意のメモリーが割り当てられることがデフォになった気がする。ゆえにローカル変数内に
非数値的なビット列(NaN)のごみが入っていたりする。

昔のプログラムではFORTRAN77でもSAVEを仮定していることが多い。大抵はそれで動いていた。
メモリーを動的に確保せず、リンク・ロード時に静的にメモリーを割り付けていた。

というわけでg77が歴史的事情を尊重しないのが悪いと言ってみるw


NaNは配列はみだしか初期値のごみででることが多いのと、77スタイルのサブルーチンを出してきたので
推論した。


209 名前:デフォルトの名無しさん [2008/03/10(月) 21:14:08 ]
初めまして。超初心者なんで宜しくお願いします。
使っている環境はF90 g++ debian です。

以下 ソースです
program dotp4
implicit none
real(8), allocatable :: u(:), v(:) !allocatable属性を付けて割り付け配列を宣言
integer :: n
write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)
read (*,*) n
allocate (u(n), v(n)) !nを用いて配列の割り付けを行う
write(*,'(a\)') 'input u(1 : n)'
read(*,*) u(1 : n) !配列uの要素の値を読みとる
write(*,'(a\)') 'input v(1 : n)'
read(*,*) v(1 : n) !配列vの要素の値を読みとる
write(*,*) 'dp = ' , dot_product(u,v) !内積の計算
deallocate (u ,v)
end program dotp4

エラーは (col. 23) remark: LOOP WAS VECTORIZED.
です。
DO 文でベクトルを使うと大抵この文がでて来ます。

どうぞ宜しくお願いします (ちなみにallocateが赤くなりません)

210 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:22:28 ]
>>209

> write(*,'(a\)') 'input n :' !入力を促す表示(改行の抑制)

ここの '(a\)' に対してなら文句を言われた。なので '(a\)' を全て * に変えてコンパイルしたら通った。因みに gfortran でだ。g95 ではもとのママでも何も言われなかった。実行については共に特に問題無さそうだった。

211 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:50:00 ]
>>209
>エラーは (col. 23) remark: LOOP WAS VECTORIZED.
>です。

これはエラーじゃない。リマークであって、警告ですらない。

単にDO-LOOPをベクトル化したという事を念のため教えてくれているに過ぎない。
つまりSSEを用いた最適化をしたという事を教えてくれている。

初心者なら、気にしなくてよい。


212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 08:32:04 ]
>>211

そのリマークってオプションなしのコンパイルでも出るんでしょうか?

213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:48:37 ]
>>212
処理系によって違うのでマニュアルを読んでもらうのが一番確実。
たとえば Intel Fortran の場合は、SSEによるベクトル化に関しては、
オプションを指定しないと何も言わない。

一般的に言えば、error, warning, info ( ここでは remark ) のような、
おおよそ3分類で、完全なるあやまち、分かってやってるならOK、念のための御注進 
にあたるメッセージをデフォールトで言う。

うざいならオプションで抑止できるのが普通。
まぁコンパイラのオプションの説明嫁。



214 名前:デフォルトの名無しさん [2008/03/11(火) 15:47:45 ]
>>210
>>211
ありがとうございます。
ちゃんと実行できました!
remarkはエラーでは無いんですね。把握しました。
精進します



215 名前:デフォルトの名無しさん [2008/03/13(木) 03:18:38 ]
教えて下さい。
0の二乗が正しく計算できません。
なぜでしょうか?
MacOSXでもg95で同じような計算結果になります。

プログラム hoge.f95
program hoge
write(*,*) 0**2, 0.e0**2, 0.d0**2
end program hoge

以下、コマンド
> g95 hoge.f90

> a.exe
1 1. 1.
> g95 -v
Using built-in specs.
Target:
Configured with: /src/G95/gcc-4.1.2/configure --prefix=/mingw
--enable-languages=c --with-ld=/mingw/bin/ld --with-as=/mingw/bin/as
--host=i386-pc-mingw32 --enable-threads --disable-nls
--disable-win32-registry --enable-sjlj-exceptions --enable-libgcj
--without-x
Thread model: win32
gcc version 4.1.2 (g95 0.91!) Feb 7 2008

環境
Windows XP Professional Service Pack 2

216 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:25:15 ]
>>215

> MacOSXでもg95で同じような計算結果になります。

MacOSX の g95 では上手く行っていますが?ちなみに PPC 版 Tiger。なので言っている事の意味ワカラン。






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

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

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