トップページ⇒tech
1001コメント411KB

FORTRAN III

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
FORTRAN総合スレッドです。
FORTRAN77/90/95/2003, HPF等、FORTRAN全般に関する話題を書き込んで下さい。

・前スレ
FORTRAN II
http://pc5.2ch.net/test/read.cgi/tech/1068351911/
Fortran
http://pc2.2ch.net/test/read.cgi/tech/1003214738/
0446デフォルトの名無しさん2005/10/22(土) 11:35:33
>>445
form='binary' のかわりに access='stream' を使うとか。
0447デフォルトの名無しさん2005/10/22(土) 14:46:03
普通、 unformatted使わないか?
0448デフォルトの名無しさん2005/10/22(土) 15:51:40
>>446
ありがとー。
access='stream' で望んだ結果が得られました。
0449デフォルトの名無しさん2005/10/24(月) 13:01:06
これいいかも

http://www.nag-j.co.jp/FortranBuilder.htm
0450デフォルトの名無しさん2005/10/28(金) 00:21:02
WinXPユーザーなんですが、
Salford FTN95でコンパイルしたものと
g95でコンパイルしたexeのサイズがぜんぜん違うんです。(10倍ぐらい)
(30行くらいのものです)
Salford FTN95はいちいち最初にメッセージが出るんでコンパイラーを変えたいんですが
g95をこのまま使い続けてもいいんでしょうか。
0451デフォルトの名無しさん2005/10/28(金) 00:26:13
>>450
どっちかがスタティックリンクをしているから大きくなる?
04524502005/10/28(金) 00:47:24
>>451
そうなんですか。気にしないでおきます。たいしたプログラムは組みませんし。
ありがとうございました。

ところで、gfortranとg95はどちらが優れているのでしょうか。
とにかく早く計算したいんです。
別にこの二つに限らないのでWinXPで動くフリーのFortran90コンパイラーを紹介してください。
04534512005/10/28(金) 00:52:20
「早く」ということは、実行速度はともかく短期間で
実行可能なプログラムを作りたいということと考えれば
g95でないかな。gfortranではコンパイル出来なかった
プログラムがg95では出来たことがある。
フリーのコンパイラの件は知らん。
0454デフォルトの名無しさん2005/10/28(金) 12:06:54
>>452
貧乏なら無償のIntel FortranをLinuxにインストール。
金があるなら、Windows版Intel Fortranを買え。アカデミック版なら大した金額じゃない。
お遊び程度なら、Linux上でgfortranかな。
0455デフォルトの名無しさん2005/10/28(金) 16:17:00
>>454
Linux上で、っていう要件を満たせるなら、遊びでも素直にIntel Fortran使ったほうが吉かと。
0456デフォルトの名無しさん2005/10/28(金) 17:37:07
>>452
coLinux上でIFC
0457デフォルトの名無しさん2005/10/28(金) 17:53:22
>>456
IFCってIntel Fortran のバージョン7までだよね?
8からはifort。7系列をダウンロード出来る場所を
見付けられなかったよ。premierサポートに登録して
いて8と9はダウンロード出来た。
0458デフォルトの名無しさん2005/10/29(土) 00:48:17
いやバージョン関係なくIntel Fortran Compilerの略でIFCって使ったんだけど。
8以降はifortって言わないといけないのか。
04594502005/10/29(土) 02:06:35
みなさん、ありがとうございます。
LinuxのIntel製コンパイラーが優秀なのは知っているのですが、
なぜかインストールに失敗してしまいます。
Linuxに関してはかなり初心者なのでインストール方法があっているかも
自信はありません。
Vine Linux3.2はとっつきやすそうなので挑戦したいと考えてはいます。
LinuxになれたらIntelコンパイラーを入れてみようと思います。
0460デフォルトの名無しさん2005/10/30(日) 18:00:19
すいません、わからないので教えてください。
使ってるのは「fortran90」です。

「0度から90度まで5度刻みで、小数点以下5桁の精度の
三角関数sinとcosとtanの表を作れ。ただし、tan90°の
値には・・・・(中点4つ)を表示させること。」

途中まで作ったんですが…、最後の「tan90°の
値には・・・・(中点4つ)を表示させる」がわかりません…。

real, parameter :: rad=3.1415926/180.0
real :: r,s,c,t
integer :: k
print*, "角度 sin cos tan"
do k=0,90,5
r=k*rad
s=sin(r)
c=cos(r)
t=tan(r)
print'(1x,i3,2x,3f10.5)',k,s,c,t
end do
end
0461デフォルトの名無しさん2005/10/30(日) 19:50:53
IF文使えば?
0462デフォルトの名無しさん2005/10/31(月) 18:50:35
FORTRANというより数学の問題じゃないか。
なんで90度のtanだけ特別扱いになるか分かってるか?
0463デフォルトの名無しさん2005/11/01(火) 10:16:29
こんなの宿題か何かだろ?いちいち助言してたらキリがないよ。
>>460も自分で考えな。
プログラムを書くことからじゃなくて、アルゴリズムを先に考えるんだぞ。
0464デフォルトの名無しさん2005/11/01(火) 19:35:49
そういえばFortran 2003 には Floating-point exception handling が有るそうだが
どんな感じになるの?
調べてもようわからんかった・・・
0465デフォルトの名無しさん2005/11/02(水) 03:14:05
intelのサイトしか見てないけど
intelのwindows版コンパイラはvisual fortran版しかないの?
linux経験がないので非商用版を使う前に評価版で性能とかを
win上で確かめたかったけど
0466デフォルトの名無しさん2005/11/02(水) 20:33:02
>>465
どういう意味?
Windows版でもコマンドライン環境で使えるよ。
04674652005/11/05(土) 01:12:52
>466
http://www.xlsoft.com/jp/products/intel/compilers/index.html
みたらwin版はvisual fortran ってかいてて
linux版はfortranとしか書いていないから
ちがうものかと思ってました。
なんかlinux版にもvisual fortranがあると思いこんでました
0468デフォルトの名無しさん2005/11/08(火) 21:30:20
質問です。
今までCompaq Visual Fortran 6.6(以降CVF)を使っていましたが
最近Intel Visual Fortran(以降IVF)に乗り換えました。

ところがデバッグの仕方がわからず四苦八苦しています。

例えば
real*4 x(100)
に対して
do i = 1, 101
x(i) = 0.0
enddo
と書きます。
CVFを使って、この状態でデバッグ実行すると、配列オーバーで止まり
その時点での変数iの値などを見れました。

ですが、IVFだと止まることは止まるのですが
変数の中身が見れません。
Visual Studio関連のソースだと思うのですが
Cのソースコードが表示された状態からどうしたらよいかわかりません。

IVFでこの問題解決する方法ってありますか?

マニュアル読むにしてもキーワードもわからないので
何かアドバイス頂けたら、、と思います。
0469デフォルトの名無しさん2005/11/10(木) 22:17:41
数値解析や3Dグラフの描画にフォートランを使おうかと考えています。
いろいろと調べてみたところ、ヒューリンクスのプロフォートランが
良いかと思いました。
これを使っている人はいますか
http://www.hulinks.co.jp/software/pf/plplot.html
0470デフォルトの名無しさん2005/11/10(木) 23:52:35
>>468
Intel Visual Fortranでよくありますね。
エラーが出てプログラムが止まった時にDOS窓に戻ったら、
どこでエラーが出たかメッセージが書いてませんか?
サブルーチン名みたいなのと行番号みたいなのがあわせて書いてあると思うのですが。

それがないようなら、PAUSE文をたくさん挿入するなり、
「カーソルの行まで実行」で順に見ていくなりして、
様子を見るしかないと思います。
0471デフォルトの名無しさん2005/11/11(金) 01:00:31
cvfも残しておいたほうがデバッグがしやすいよな
04724682005/11/12(土) 10:27:22
>>470
>>471
レスありがとうございます。

機能的に無理なのですかね〜。
上位互換ということでCVFでできたことは全部できるかと予想していたのですが。


行番号などは確かにプロンプトに出ていますね。
それがループの中とかじゃなければ、その情報でも作業できるんですけどね〜。
0473デフォルトの名無しさん2005/11/15(火) 16:46:43
g77のときには無事コンパイルできていたのですが、gfortranになってからコンパイルエラーになります。

INTEGER MASKA
DATA MASKA/'377'0/
END
某プロフラムのソースで見かけたのですが、勉強不足なのか、このDATA行の意図することが分かりません。
MASKA
はINTEGERで、DATAにある
'377'
は「377というCHARACTER」を入れようとしているように読めるのですが…。
「377*0」でもなさそうですし、「3770」なら、そのまま書けばいいように思うのですが、どういった意味になるのでしょうか。
0474デフォルトの名無しさん2005/11/15(火) 19:30:33
>>473
自己レス

「'377'0」ではなく「'377'O」でした。
で、これは8進定数 (octal constant) というものでした。
gfortranでは「O"377"」と書いてやらないとコンパイルエラーを起こします。
0475デフォルトの名無しさん2005/11/16(水) 10:13:46
ちょっとお聞きしたいです。fortran77です。
format文でデータを5個横に羅列し、
改行してまた5個、以後繰り返しというプログラムのはずなんですが、4個目で改行、
5個目がひとつ書いてあって改行、以後繰り返し、という感じになってしまいます。
format文なしでやっても一緒でした。
一行あたりの文字量の問題かとも思ったのですが・・
なにかヒントいただけたら幸いです。
0476デフォルトの名無しさん2005/11/16(水) 18:15:57
>>475
WRITE(*,*) 0.1, 0.2, 0.3, 0.4, 0.5
と、書式を指定しない場合は、(コンパイラ依存かもしれないけど)
1行72文字 or 80文字で自動的に改行が入る。
(ファイルへの出力、標準出力いずれでも結果は同じ。)

WRITE(*,'(4F12.6)') 0.1, 0.2, 0.3, 0.4, 0.5
と、Format文で4つ分の書式しか指定していなければ
5つ目のデータ(ここでは0.5)が改行されてから出力される。

WRITE(*,'(5F12.6)') 0.1, 0.2, 0.3, 0.4, 0.5
と、ちゃんと5つ分の書式をしていれば、必ず改行なしで出力される。
80桁を超えてももちろんOK。

なんで、Format文でデータ5つ分の書式を指定していることをチェックしてみれば?
0477デフォルトの名無しさん2005/11/17(木) 13:49:11
>>476
ありがとうございました!5つ分の式が書いていませんでした。。
というか、出力6個あったのに5個と勘違いしていました。。
非常に助かりました。ご丁寧にありがとうございました。
0478デフォルトの名無しさん2005/11/17(木) 22:49:39
Sun、C/C++およびFortranの開発環境「Sun Studio 11」も無償化
http://www.itmedia.co.jp/enterprise/articles/0511/17/news025.html

太っ腹ですね。
0479デフォルトの名無しさん2005/11/18(金) 13:18:52
>>478
お、すげー!x86でSolaris試したかったんだけど、CコンパイラはともかくFortranコンパイラがないのがネックだったんだよね。
0480デフォルトの名無しさん2005/11/21(月) 17:31:03
rand() を使わずに乱数を作りたいのですが、
誰かわかるかた教えていただけませんか?お願いします。
0481デフォルトの名無しさん2005/11/21(月) 18:07:45
>>480
「乱数」伏見正則,東京大学出版会がいいと思う。
0482デフォルトの名無しさん2005/11/21(月) 18:16:56
乱数発生するPCIカードとかあるよ。
0483デフォルトの名無しさん2005/11/21(月) 18:21:28
>>481
ありがとうございます!調べてみます
>>482
できればプログラムの書き換えだけで済ませたいのです、、、。
でも書き込みありがとうございます!
0484デフォルトの名無しさん2005/11/21(月) 23:23:40
>>481
Numerical Recipe に解説+プログラムが
数パターン載ってる。
0485デフォルトの名無しさん2005/11/22(火) 10:52:26
なんとか解決できそうです。
みなさんありがとうございました!!
0486デフォルトの名無しさん2005/11/22(火) 23:54:47
>>485
どう解決するの?
0487デフォルトの名無しさん2005/11/23(水) 01:19:40
学校でFortranを習っているのですが、レポートがわかりません。

..以下のプログラムを作成しメールで提出
..「級数展開によりsin(xπ) を求め、表示する」
.. x とn は実行時にキーボードから入力
.. 実数の計算はすべて倍精度で行う

という内容です。級数展開の内容は次の通りです。
sin(xπ) ≒ xπ - ((xπ)^3)/3! + ((xπ)^5)/5! - ((xπ)^7)/7! + ((xπ)^9)/9! - ・・・・ ((xπ)^(2n-1))/(2n-1)!
04884872005/11/23(水) 01:21:00
授業で習った文法(?)で使えそうなものは、doとifぐらいです。
作ってみたのですが、これで合っているかどうかわかりません。
御指導お願いします。


program taylor_expansion
implicit none
interger :: i, j, n, kai
real(8) :: pi, x, result
intrinsic atan, sin

pi = 4.0D0 * atan(1.0D0)

write(*,*) "input x"
read(*,*) x
write(*,*) "input n"
read(*,*) n
04894872005/11/23(水) 01:21:46

if (n<=0.0D0) then
write(*,*) "error! n must be natural number!"

else

kai = 1
result = 0
do i = 1, n
do j = 1, 2*i-1
kai = kai*j
end do
result = result + (-1.0D0)**(i+1.0D0) * (x*pi)**(2.0D0*i-1.0D0) / kai
end do

write(*,*) "sin(x*pi) is about",result
write(*,*) "sin(x*pi) is",sin(x*pi)

end if

stop
end program
0490デフォルトの名無しさん2005/11/23(水) 15:30:00
>>487-489
kaiの初期化の位置がおかしい。
このままでは i のループの2回目以降で前回の値が持ち越されてしまう。

それから n を大きくすると階乗の値がオーバーフローする恐れがあるので
kai は倍精度実数の方がいいかも。
04914872005/11/23(水) 18:38:10
>>490
考えてくださって本当にありがとうございます!
「kai」の初期化の位置については全く気がついていませんでした。

result = 0
do i = 1, n
kai = 1
do j= 1, 2*i-1

と書くべきですよね。
明日学校でコンパイル・実行して試してみます。
ありがとうございました。
0492デフォルトの名無しさん2005/11/23(水) 19:49:18
級数展開でsin関数を計算する意図が良く分からない。手計算しかできないときは役立つけどさ。
その先生、頭悪いんだろうな。
ご愁傷様。
0493デフォルトの名無しさん2005/11/23(水) 21:10:50
>>492
ただの練習問題なんだろう。
そんなのの内容にまで一々ツッコミ入れてたらきりがないよ。

>>487
それよりも、ここに書き込み出来る環境があるなら
机上だけで悩んでないでフリーのコンパイラでも入れて
自分でも試すようにした方がいいよ。
0494デフォルトの名無しさん2005/11/23(水) 23:26:28
>>492
287を積んでない286マシンで極座標とか円筒座標の座標計算するときには役に立つと思う。
今はありがたみを感じないかも知れないけど。

たぶんセンセはその時代の人なんでしょう。
0495デフォルトの名無しさん2005/11/23(水) 23:37:27
>>494
コプロ世代か。
0496デフォルトの名無しさん2005/11/23(水) 23:38:15
つか、その世代だとテーブルに格納してたと思うけど。
04974872005/11/24(木) 22:18:26
>>490
今日学校でコンパイルして実行してみると、うまく動いてくれました。
まだプログラミングを始めて間もなく、自分で作ったプログラムの中ではいちばん難しかったのでとてもうれしかったです。
アドバイスしていただきありがとうございました。

>>492-493
ただの練習問題です。
フリーのコンパイラを入れて自分のパソコンでもコンパイルできるようにしようと思って試したのですが、
コンパイラの設定がうまくいってないのか、挫折してしまいました。
また今度やってみます。
0498デフォルトの名無しさん2005/11/25(金) 00:56:27
sage
0499デフォルトの名無しさん2005/11/25(金) 17:04:17
質問いたします。
fortranからmatlabを呼び出して関数を使えるらしいのですが、うまくいきません。
コンパイル時に undefined symbols として engopen などが認識されないようです。
当方はfortran77 , matlab7.0.1 を使っていますが、そのせいなのでしょうか?
↓参考にしました
ttp://www.cybernet.co.jp/matlab/support/helpdesk/r14/toolbox/matlab/matlab_external/ch_engi5.shtml#25618
0500デフォルトの名無しさん2005/11/26(土) 22:48:00
real A( 5, 2 )

call s( A )

subroutine s( A )
real A( 4, 2)

・・・

end

上のようなプログラムを作った場合、例えばメインプログラムのA(1,2)と
サブルーチンのA(1,2)は違うものになってしまいます。C言語と配列の
メモリ上配置が違うためというのは分かったのですが、これに対処するために
どうすればよいでしょうか?

・配列の添え字を逆にする。
・最後の添え字の次元をサブルーチンに渡す。

この2つしか思いつかないのですがどちらもわずらわしいです。
なにかいい方法は無いですか?
0501デフォルトの名無しさん2005/11/27(日) 00:05:41
>>500
最初の次元の長さが固定なら、
PARAMETER (N=5)
とか書いたヘッダファイルparm.hを用意して、
PROGRAM MAIN
INCLUDE 'param.h'
REAL A(N,2)
...
END

SUBROUTINE S(A)
INCLUDE 'parm.h'
REAL A(N,*)
...
END
とか書けば?

Cから書き直してるなら添え字を逆にしないと性能が大きく変わる
可能性があることは知っておくべし。
0502デフォルトの名無しさん2005/11/27(日) 00:40:52
>>499
ライブラリがつながっていないのではないかな?
HELPのUNIXでのコンパイルとリンクないしWindowsでのコンパイルとリンクのところをみて
ライブラリのリンクするための環境変数の設定を確かめてみれば?

>>500
FORTRAN90以降ならサブルーチン側での宣言を
real A(;,;)
で次元だけ合わせる形にしておけばとりあえず呼び出し側と同じサイズに自動的になる。

FORTRAN77なら整合配列を使う。呼び出し側で配列の大きさも渡す。
call(n1, n2, a)
...
sub(a)
real a(n1, n2)
...

ただし、FORTRAN77はサイズのチェックをしないから、サブルーチン側で擬寸法仮配列として
宣言しておけば、添え字の最後の大きさを明示的に渡さなくてもいい。
real(5,4)
...
call(5, a)
...
sub(n1, a)
real a(n1, *)
...

さらにいえば、FORTRAN66時代に書かれている既存のプログラムの場合、最後の次元を
擬寸法で与えることも無く、任意の整数値を入れてあることがある。(1とか10のことが多い。)

05035002005/11/29(火) 20:52:43
>502

解決しました。どうもありがとうございました。
0504デフォルトの名無しさん2005/11/29(火) 20:55:37
プログラム全体を通してのパラメータの定義をする方法というのは
ありますか?
サブルーチン、関数ごとに
parameter ( a=10, b=20 )
という風に何回も書いているのですが、バグの元になっています。
0505デフォルトの名無しさん2005/11/29(火) 21:14:59
use か include を使う。
05064992005/11/30(水) 22:23:09
>>502
遅くなりましたが、ありがとうございます。
調べてみます・・・。
0507デフォルトの名無しさん2005/12/11(日) 11:20:44
 999 CONTINUE
0508デフォルトの名無しさん2005/12/11(日) 11:56:42
条件分岐で
例えば
変数 i,j,k,l
が1から10までそれぞれとりうるとき
その各々について
分岐させたいんだけど
なにかいい命令文ない?

それぞれで内容がおおきく異なったり、おなじになったりするから

if,select case,do,where

どれも適当なものにならない
(書く量が莫大になる)
なにかいい命令文ない?




05095082005/12/11(日) 11:58:00
ちなみにfortran90
です
0510デフォルトの名無しさん2005/12/11(日) 14:23:44
>>508
いまいち状況がよく分からないけど、
num=(i-1)*1000+(j-1)*100+(k-1)*10+(l-1)
ってな感じでひとつの変数にまとめてから、
select caseを使って分岐するってのはだめ?
0511デフォルトの名無しさん2005/12/11(日) 15:35:38
if文だらけの状態でここにサンプル書いてみれば?
効率的にできるアドバイスもらえるんじゃね?
0512デフォルトの名無しさん2005/12/12(月) 18:23:59
Microsoft Visual .NET でFortranコンパイラを使っているのですが,
実行すると
 ifort: Command line warning: ignoring option '-extfor'; argument required

 ifort: Command line warning: unrecognized source type
  'C:\Documents and Settings\aoyama\My Documents\Visual Studio
  Projects\yabai\shallowgtemp3d8_new'; object file assumed
 ifort: Command line warning: no action performed for specified object file(s)

というエラーメッセージが表示されてしまいます。
これはどういう意味なのでしょうか?
またその解決法があれば教えていただきたいです。
お願いします。
0513デフォルトの名無しさん2005/12/12(月) 19:47:07
>>512
ソースのファイル名が「-extfor」になってない?
ファイル名と拡張子(固定形式なら .for か .f、自由形式なら .f90)を確認してみて下さい。
0514デフォルトの名無しさん2005/12/13(火) 13:23:04
>>513
ファイル名を.f90にしたところ上のようなエラーメッセージがなくなりました。
ありがとうございます!
0515デフォルトの名無しさん2005/12/14(水) 10:30:50
10個の数字を大きい順に並べる方法を教えてくれい
0516デフォルトの名無しさん2005/12/14(水) 14:31:23
>>515
「ソートアルゴリズム」とGoogle先生に聞けば即答してくれるよ。
しかも何通りも出てくる。
0517デフォルトの名無しさん2005/12/16(金) 16:16:56
f2cを使ってfortranのソースをc言語のソースに変換したいんだが、redumeが英語で
使い方が良く分からん!f2cってどうやって使うの?
0518デフォルトの名無しさん2005/12/16(金) 18:28:35
>>517
f2c -A -c hoge.f
0519デフォルトの名無しさん2005/12/19(月) 13:21:14
>>518
? よくわかんないッス
0520デフォルトの名無しさん2005/12/19(月) 18:32:49
>>519
せめて自分の環境と何をどこまでやったのかくらい書いてくれや。
>>517だけじゃ回答する方もよくわかんないッス
0521デフォルトの名無しさん2005/12/20(火) 14:42:34
プログラム終了時にsendmail等を使ってメールを送信することは出来ますか?
(fortran77)
0522デフォルトの名無しさん2005/12/20(火) 14:52:18
シェルスクリプト組めば何でもできるでしょ。
05235212005/12/20(火) 14:59:40
>>522
具体的にソースにどのように書けばいいのかを教えて欲しいのですが。
0524デフォルトの名無しさん2005/12/20(火) 15:21:14
#! /bin/sh

(fortranの実行ファイル名)
cat finish.txt | mail -s 'pugaaa' someone@somewhere


とでも書いておけ。つか、Unix勉強汁
05255212005/12/20(火) 16:15:33
>>524
出来ました!
どうもありがとうございます!
0526デフォルトの名無しさん2005/12/20(火) 21:48:13
intel visual fortran 9.0と visual c++ .net 2003の連携って
どうやったらできるのでしょうか?
いきなりの質問ですいません
教えてくださいm(__)m
0527デフォルトの名無しさん2005/12/20(火) 21:54:17
IVFに連携用のインストーラあるから、それ入れると自動的にできるよ。
0528デフォルトの名無しさん2005/12/21(水) 19:23:44
Fortranがタダで手に入りますよ

サン、Solaris 10対応開発環境最新版「Sun Studio 11」の無償提供を開始
http://japan.zdnet.com/news/devsys/story/0,2000052522,20093324,00.htm?ref=rss

>Sun Studio 11は、C/C++およびFortranを使用するアプリケーション開発ツール。
>最新のマルチコアUltraSPARC、x64およびx86プラットフォームを含むサンの
>最新ハードウェア上で稼働する32ビットおよび64ビットの高性能アプリケーションを開発できる。
0529デフォルトの名無しさん2005/12/21(水) 19:29:39
× Fortranがタダで手に入りますよ
○ 商用Fortranがタダで手に入りますよ
0530デフォルトの名無しさん2005/12/21(水) 20:54:27
>>528-529
Solaris版ね。
Linux版の方にはコンパイラは含まれていない。
0531デフォルトの名無しさん2005/12/22(木) 13:10:27
電気工学の研究をしている者です。
非常に基本的な質問で恐縮なのですが、
誰かご存知の方がいましたら教えてください。

ある数値データファイルおいて、
数値データファイルの1行目から20行目まで、
そのデータの測定情報が記載されていて(つまり文字データ)、
22行目から数値データの羅列が始まっている数値データファイルがあります。

この数値データファイルを読み込ませて処理をする場合、
21行目までを無視して、22行目から読み込むようにする方法はあるでしょうか?

自分でも色々やってみましたが、結局同じファイルをコピーして、
文字データ部分を削除したファイルを作成し、使用しています。
これは面倒だし、ファイル数も多くなるので、
直接元のデータファイルを処理できれば便利なのです。
0532デフォルトの名無しさん2005/12/22(木) 14:37:06
>>531
行頭から、ASCII文字が21文字詰まっているものとして読み込み&無視
0533デフォルトの名無しさん2005/12/22(木) 14:37:53
>>532
ごめん、行じゃなくて列だと思ってた。
0534デフォルトの名無しさん2005/12/22(木) 15:11:37
>ASCII文字がつまっているものとして処理

すいません。具体的にどうやればよいのでしょうか。
これを応用すれば、1行目から21行目まで、
IF文で「数値データでないとき、次の行にうつる」
といったことができそうですね。
0535デフォルトの名無しさん2005/12/22(木) 16:47:42
>>531
WRITE文で後ろに変数を書かなければ
自動的に1行スキップしてくれる。
> OPEN(10,FILE='hoge.dat')
> DO i=1,21
> WRITE(10,*)
> END DO
> (…このあとデータ読み込み)
> CLOSE(10)

あと、>>532 が言っているように行頭の20文字を無視したい場合は
CHARACTER型の変数を用意して
> CHARACTER*20 chr
> WRITE(10,*) chr, (データを格納する変数)
って感じに書けばOK。
0536デフォルトの名無しさん2005/12/22(木) 17:02:02
>>535
writeでやると、ファイルに空白行書き込んじゃうことにならない?
0537デフォルトの名無しさん2005/12/22(木) 18:25:12
>>535
>> WRITE(10,*) chr, (データを格納する変数)
WRITE→READの間違いだとして
書式指定なしでやると途中でスペースやカンマが出てきた場合
そこで文字列の読み込みを止めて変な値を読んじゃうよ。

READ(10, '(A20,3G8.0)') chr, x, y, z
または
READ(10, '(20X,3G8.0)') x, y, z
05385352005/12/22(木) 20:19:09
間違いだらけだし…。すまん。

>>536
WRITE→READの間違いです。

>>537
それは知らなかった。指摘ありがと。
0539デフォルトの名無しさん2005/12/23(金) 01:38:19
みなさん。ありがとうございました。
みなさんの意見を参考に、以下のようなプラグラムをつくり、解決できました。


OPEN(10.FILE='file.csv',STATUS='OLD')
DO 100 K=1,LEN+21,1
IF(K.LE.21) THEN
READ(10,*)
ELSE
READ(10,*) T,C
HAIRETSU(K-21)=C
END IF
100 CONTINUE
    …
CLOSE(10)

LENというのは、数値データの個数です。
読み込むデータファイル「file.csv」は、
一列目が空白で、2列目に数値データファイルが入ってるので、
一列目にTというダミーの変数を用い、2列目のCの値を配列に格納するプログラムです。

ここでまた質問なのですが、このプログラムだと、1列目の空白をTという変数に読み込むという
無駄な操作をしていることになり、効率が悪いと思われます。
この操作をなくして、直接2列目の数値データだけを読み込ませる方法というのはあるのでしょうか?
0540デフォルトの名無しさん2005/12/23(金) 12:33:54
>>539
データが馬鹿でかくて読み込みにものすごい時間がかかってるのでないなら気にすんな。
データが馬鹿でかくて読み込みにものすごい時間がかかってるとしても、
そのプログラムを何回も実行しないなら気にするな。
そのプログラムを何回も実行するなら素直にデータ変換しる。
0541デフォルトの名無しさん2005/12/23(金) 16:42:51
>>539
書式指定して読み込め。効率はほとんど変わらないけど。
0542デフォルトの名無しさん2005/12/23(金) 21:47:31
この場合の書式指定のやり方がよくわからないです。
でもたしかにこの部分は一瞬で終わるので、気にしないことにします。
ありがとうございました。
0543デフォルトの名無しさん2005/12/29(木) 23:33:17
 100 CONTINUE
0544デフォルトの名無しさん2005/12/29(木) 23:39:42
GOTO 543
0545JAVAの強みは2005/12/29(木) 23:51:28
/*******************
ここへは絶対来ないw
********************/
■ このスレッドは過去ログ倉庫に格納されています