Fortran90で書かれた、又はこれから書く、プログラム実行したく
GCCのgfortranをインストールしました。OSは、Windows XPです。

ところが、コンパイルのところで、つまずいてなかなか進みません。
(gfortranは動いてますので、インストールに問題はないと思います。)

そこで、gfortranについて(オプション等)、解説しているサイトや文献を教えて頂きたいと思います。
英語力があまり無いので、日本語のものを紹介いただけると助かります。

また、十数年ぶりのフォートランですので(現在はVBAしか触っていません)、初学者向けだと、なお助かります。

どうか、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

#3です。

確認しました。確かに Fortran 95コンパイラのようですね。ただ、

GNU Fortran 95 (GCC) 4.2.0 20060504 (experimental)
Copyright (C) 2006 Free Software Foundation, Inc.

とありますし、webページを見てもまだ開発段階の初期のものとみなされて
いるようなので誰もが問題なく使えるものではなく、ドキュメントも整備されている途上ですから、この時点で日本語に訳したものとか初学者向けを期待するのは少々無理があるかと。
ただ、他の f95という名のコンパイラと同じように使えるようなのでそれ向けの解説を見たりすると良いかもしれません。

ところでgfortran はコンパイル対象のファイルの拡張子が .for だと、それは Fortran 77で書かれたものとしてみなすようですがそれは大丈夫なのですか?
COMMONブロックが、includeされる方のファイル(f2.fi)に記述されているのなら、include自体はできているようです。

コンパイルしようとしているのが無償公開されているものとのことですので、エラーを起こしている最初の部分のソース数行を貼り付たりファイルの場所を教えてもらうとかは可能ですか?

参考URL:http://www.scl.kyoto-u.ac.jp/scl/appli/appli_man …
    • good
    • 0
この回答へのお礼

ありがとうございます!お手数をお掛けしております。大変参考になります。

>GNU Fortran 95 (GCC) 4.2.0 20060504 (experimental)
>Copyright (C) 2006 Free Software Foundation, Inc.

>とありますし、webページを見てもまだ開発段階の初期のものとみなされて

そうなんですか。コンパイラの選択から考えたほうがいいかもしれませんね。あまり英語得意じゃないもので・・・、(experimental)を見逃していました。

#2様の
>GCC の gfortran って, Fortran90 もコンパイルできたんでしたっけ?
で、少し、いや~な予感がしたのですが。。。そういう問題もあるのですね。



>COMMONブロックが、includeされる方のファイル(f2.fi)に記述されているのなら、include自体はできているようです。
はい、COMMONがf2.fiに記述されています。#5様からお示しいただいたサンプルプログラムでも、includeを確認できました。

>コンパイルしようとしているのが無償公開されているものとのことですので、エラーを起こしている最初の部分のソース数行を貼り付たりファイルの場所を教えてもらうとかは可能ですか?
プログラムの説明には、「公開(無料)」「プログラムの書き換え自由」と書いているのですが・・・、入手窓口が公開されていませんので、申し訳ございませんが、私の判断でお知らせする訳にはいかないと思います。恐れ入ります。

お礼日時:2006/05/25 17:51

「-x f95 って付けると Fortran95 だと思ってくれる」って書いてありますね....

    • good
    • 0
この回答へのお礼

ありがとうございます。

またまた、読み落としてしまったようです。
 http://gcc.gnu.org/wiki/GFortranUsage

>When gfortran is run on a file whose name ends ・・・・(省略)
>・・・・For Fortran 95 this is f95.

は、コンパイル時に明示的に言語を指定するためのやり方だったんですね。よく分からなくて読み飛ばしてしまっていました。ご忠告ありがとうございます。(^_^;)助かります。

お礼日時:2006/05/26 11:12

拡張子 .f でも Fortran77形式(固定書式)のソースとしてみなされます。


Fortran95形式(自由書式)のソースとして認識させたいなら、 .f95 という拡張子を使います(.f90でもよいかもしれませんが試してません)。
    • good
    • 0
この回答へのお礼

ありがとうございます。

今回調べてみて、フォートランの自由書式というのをはじめて知りました。
ただ、現在動かそうとしているプログラムは、「6カラム+コード」という、私が知っているf77の書き方と同じです。

そして、GCCのgfortranのホームページ
 http://gcc.gnu.org/wiki/GFortranUsage
にて
>Since Fortran 95 allows for two different kinds of input source forms ・・・
とあって、
>1.Files whose name ends in .f or .for are assumed to be fixed form
>2.Files whose name end in .f90 or .f95 are assumed to to be free form

なるコメントを見つけましたので、今回のプログラムの場合では「.f」または「.for」でも良いのかなぁと解釈しました。(私の英語力では、またまた見逃しがあるかもしれませんが・・・)

お礼日時:2006/05/25 18:10

>「f1.for」ソースコード内のサブルーチンごとに「include 'f2.fi'」が書かれています。


>そして、「f1.for」と「f2.FI」は同じフォルダにあります。
>・・・・ということでした。

「サブルーチンごとに」と言うのがちょっと気になりますが、includeしているのであれば、
gfortran f1.for
でよいです。
gfortran f1.for f2.FI
ではいけません。

エラーなしに何かコンパイル成功したことはないのでしょうか?

ためしにやってみてください。ただしこのBBSは頭のスペースが取れてしまいますので、7カラムのスペースを頭につけてください。

まず、includeされるテストファイルincl.f(1行のみ)
write(*,*)'include ok'

次にincludeする側のテストファイルtest.f
include 'incl.f'
write(*,*)'hello, world!'
end

これで、
gfortran test.f
とやってみてください。

エラーが出るようなら、そのまま全部返信してください。

この回答への補足

さてさて、
おかげ様で、ひとつ可能性を潰すことができましたが・・・


gfortran f1.for
をたたいてみました。

それから、#6様のご指摘も踏まえまして、ファイルの拡張子を換えて、
gfortran f1.f
をたたいてみましたが、

やっぱり、滝のようなエラーが流れていきます。



つまり、
ソースコードがエラー、又は、gfortranと合わない
ということでしょうか?

ちょっと気になったのは、
f2.FI
のコードが、
「6カラム空白+コード」ではなく、
「タブ+コード」となっていたことです。
そこで「タブ」を「6カラム空白」に置換してコンパイルしてみたのですが、結果は同じエラーの滝です。



ここからは、ソースコードとのニラメッコになるのでしょうか?
一難さって、また一難です。

お手数ですが、ご助言いただけると幸いです。よろしくお願いします。

補足日時:2006/05/25 17:27
    • good
    • 0
この回答へのお礼

ありがとうございます!
ご教示いただいたサンプルプログラム、無事動きましたっ!

つまり、includeを使った、複数ファイルのコンパイルは、
お示しいただいた、コマンド
gfortran test.f
のパターンで行うということですね。

おかげ様で、ひとつ、可能性を潰すことができました。

お礼日時:2006/05/25 17:07

>ファイルが2つありまして、f1.for と f2.FI


f1.for で f2.FI をinclude しています。
>そこで、
>> gfortran -Wall s1.for s2.FI

includeしているのだったら、

gfortran f1.for -o f1
だけでよいのではないでしょうか?

この回答への補足

ご回答ありがとうございます。

さてさて、
>gfortran f1.for -o f1
>だけでよいのではないでしょうか?

たたいてみましたが、滝のようなエラーは変わらずです。


もしかして、
「f1.for で f2.FI をinclude しています。」
という私の表現がまずかったかもしれません。

正確には・・・・
「f1.for」ソースコード内のサブルーチンごとに「include 'f2.fi'」が書かれています。
そして、「f1.for」と「f2.FI」は同じフォルダにあります。
・・・・ということでした。

ひょっとして、includeがうまくできていないのでしょうか?


私、includeの動きがよく分かっていません。
私の理解レベルは、ファイルが複数あるときは、
「そういえば、コンパイラとかリンカとか使っていたような・・・でもどうやって使ってたかなぁ?」位しか覚えておりません。

この現象もそうですが、コマンドのオプションや使い方等について、良い情報(できるだけ日本語)があれば、それも教えていただけると助かるのですが・・・
すみません、欲張りで。どうか、よろしくお願いします。

補足日時:2006/05/25 15:05
    • good
    • 0

Windows XP 上で使われているとのことですが、具体的にどのパッケージのバイナリを使われていますか?


ダウンロード元の場所などを教えてください。

この回答への補足

>ダウンロード元の場所などを教えてください。

はい、
 http://gcc.gnu.org/wiki/GFortranBinaries
からダウンロードしました。
ここで2種類ありますが、

 mingw/"native Windows"
のほうです。
 (2006-05-04)
とカッコ書きされたインストーラをダウンロードしました。

理由は、
「mingw/"native Windows"」と「Cygwin」の2つのうち、どっちを選んだら良いか分からない人は、「mingw/"native Windows"」がよいと書かれているようでしたので。どっちがいいか分からない私は、コッチにしました。

よろしく、お願いします。

補足日時:2006/05/25 13:10
    • good
    • 0

GCC の gfortran って, Fortran90 もコンパイルできたんでしたっけ?

この回答への補足

つたない英語の読解力ですが、
GCCのホームページを見て、
Fortran95まで対象にしていると解しましたが・・・
何か問題があるのでしょうか?

補足日時:2006/05/25 10:32
    • good
    • 0

>ところが、コンパイルのところで、つまずいてなかなか進みません。



具体的にどう躓いているのでしょうか?
g77 test.f
と打つだけなので、正しくInstallされているなら、躓きようがない様に思いますが。

この回答への補足

>具体的にどう躓いているのでしょうか?

はい、実は・・・
ファイルが2つありまして、f1.for と f2.FI
f1.for で f2.FI をinclude しています。

そこで、

> gfortran -Wall s1.for s2.FI
とか
> gfortran -o test s1.for s2.FI
とか
たたきました。すると、

 >Error: Syntax error in COMMON statement at (1)
とか
 >Error: Expected another dimension in array declaration at (1)
とか
 >Unexpected STATEMENT FUNCTION statement at (1)
等などのエラーが大量に、滝のように流れます。

ソースのコードがエラーなのか?
ソースが他のfortran仕様なのか?(Fortran90とは書いてます。無償公開プログラムです。)
gfortranの操作ミスなのか?

見当がつきませんでしたので、質問しました。

この際ですので、じっくり勉強したいとも思っておりますので、
この問題に限らずに、初学者が理解できそうな、できれば日本語で書かれたよい情報があれば、教えていただきたいと思っております。
よろしくお願いします。

補足日時:2006/05/24 13:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfortran FFT output

FDTD法で遠方界の計算部分でフーリエ変換した値を使って、極座標変換した遠方界を出力するプログラムを作ったのですがコンパイルの際以下の様なエラーが出てしまいました。
z0も宣言しています。エラーの意味がよくわからず困っています。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。

ubroutine far_output
use consts
use fdtd
implicit none

integer :: n
real(8) :: theta, phi
real(8) :: sx, sy, sz, px, py
real(8) :: wth, wph, uth, uph, eth, eph

open(10,file="far_field.dat")

theta = 0
do phi = 1, 2*pi
sx = cos(theta)*cos(phi)
sy = cos(theta)*sin(phi)
sz = -sin(theta)
px = -sin(phi)
py = cos(phi)
do n = 1, ntime
wth = wx(l,n)*dx+wy(l,n)*sy+wz(l,n)*sz
wph = wx(l,n)*px+wy(l,n)*py
uth = ux(l,n)*sx+uy(l,n)*sy+uz(l,n)*sz
uph = ux(l,n)*px+uy(l,n)*py
eth(n) = -z0*wth-uph
eph(n) = -z0*wph+uth
enddo
enddo
write(10,*) eth(n), eph(n)

close(10)

return
end subroutine

コンパイルすると

In file far_output.f90:25

eth(n) = -z0*wth-uph
1
Error: Unexpected STATEMENT FUNCTION statement at (1)
In file far_output.f90:26

eph(n) = -z0*wph+uth
1
とエラーが出ます。

FDTD法で遠方界の計算部分でフーリエ変換した値を使って、極座標変換した遠方界を出力するプログラムを作ったのですがコンパイルの際以下の様なエラーが出てしまいました。
z0も宣言しています。エラーの意味がよくわからず困っています。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。

ubroutine far_output
use consts
use fdtd
implicit none

integer :: n
real(8) :: theta, phi
real(8) :: sx, sy, sz, px, py
real(8) :: wth, wph, uth, uph, eth, ep...続きを読む

Aベストアンサー

エラーの意味は #1 のいう通り. eth とか eph ってなんなの?
あと, このエラーとは関係ないけど do が終わった後で eth(n) や eph(n) を表示するのも変だね.

QFortran コンパイルエラーについて

Fortranでコンパイルを行ったところ下記のエラーが発生し、原因がわからずにいます。
Fortranに関しては全くの初心者です。

コマンドプロンプト -----------------

C:\>g95 aaa.f90
Warning(115):Line 100 of aaa.f90 is being truncated
In file aaa.f90:100

 else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then
1
Error:Unexpected junk after ELSE statement at (1)

aaa.f90ファイルは他の方が作成したものでそのaaa.exeもあるので、見よう見まねで
Fortranをインストールし、試みましたがエラーでEXEが作成されませんでした。

Fortranはv4.1.2(g95 0.93)、使用しているOSはWindows7Professional(32ビット)です。

エラーがでている行のコードしか記述できず申し訳ないのですが、エラーの意味だけでも教えていただけますでしょうか。

ご教示頂きますようよろしくお願いします。

Fortranでコンパイルを行ったところ下記のエラーが発生し、原因がわからずにいます。
Fortranに関しては全くの初心者です。

コマンドプロンプト -----------------

C:\>g95 aaa.f90
Warning(115):Line 100 of aaa.f90 is being truncated
In file aaa.f90:100

 else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then
1
Error:Unexpected junk after ELSE statement at (1)

aaa.f90ファイルは他の方が作成したものでそのaa...続きを読む

Aベストアンサー

Line 100 of aaa.f90 is being truncated

ということは100行目が途中(132カラム)までしか読み込まれていません。
したがってelse if文が完結せずにわけのわからない文になっているわけです。

else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then

これをたとえば

else if(hnum(mnum(ic-1,jc-1)) .eq. 45 .and. basin_num(nr) .eq. anum(mnum(ic-1,jc-1)) &
& .and. znum(mnum(ic-1,jc-1)) .eq. 'obs') then

と2行に分ければうまくいくでしょう。

QFortranのOPEN文

OPEN(2,FILE='../data/'//FNAME//'c.dat')
というOPEN文についての質問です.このOPEN文のファイル名の指定FILE=' 'のところがわからないので,教えていただきたいのです.
ドット二つ(..)とスラッシュ1本(/),二本(//)の意味など,わかる方よろしくお願いします.

Aベストアンサー

スラッシュ二本(//)は文字列の結合演算子です。

FNAMEはCHARACTER宣言された文字列変数のはずです(FORTRANの仕様だとそれ以外に考えようがない)。
で、FNAMEに'hogehoge'と入っていれば、

FILE='../data/'//FNAME//'c.dat'='../data/'//'hogehoge'//'c.dat'='../data/hogehogec.dat'

ということで、オープンするファイルは../data/hogehogec.datとなるわけです(よけいな話だけど、'c.dat'は'/c.dat'じゃないですか)。

ドット二つ(..)は一階層上(親ディレクトリといいます)を意味します、ルートでは(ルートは一番もと)ではありません。

あと、FORTRANでは、一桁のファイル番号には、5はSYSIN(昔だったらパンチカード)、6はSYSOUT(昔ならラインプリンタ、今だったらコンソール)など、特別な役割を持たせてきた歴史があります。できれば、一桁の番号は避けた方が賢明でしょう。

Qfortranのファイル入出力のopen文

fortranのファイル入出力のopen文で、パスを指定せずファイル名を指定すると、EXEのあるフォルダにそのファイルが作られますが、次の例は、サブフォルダOUTをあらかじめEXEのあるフォルダに作っておき、そこに、計算結果を判断してファイル名をvmax,timeと指定して出力した例です。この場合、サブフォルダOUTも、計算結果に応じてプログラム内で名前を指定したいのですが、できるのでしょうか。
例: open (10,file='./out/vmax.csv')
open (11,file='./out/time.csv')

Aベストアンサー

環境をお書きになれていないので動作保証はいたしませんが。
# f90, f95 では確認しましたが。
このように書けばよろしいのではないでしょうか?

character(len=80) filename1
character(len=80) filename2
character(len=80) dirname
(ディレクトリ・ファイル名を決める処理)
open(10,file=trim(dirname)//'/'//trim(filename1))
open(11,file=trim(dirname)//'/'//trim(filename2))

# マニュアルをご覧になることをお薦めします。

QfortranでのNaNについて

お忙しい所、NaNについて回答お願い致します。

fortranでプログラムを使用して数値計算を行っていますが、計算途中で結果がNaNとなり困っています。
NaNは、0で除算を行なったり、負の数の指数を求めようとした時に出る無限大や定義できない値のようなのですが、式を見ても0で除算を行なったり、負の数の指数を求めようとしている所はありません。

もし同じような経験をされて見事解決された方、居られましたらその時の対処法をお聞かせ願えないでしょうか。
何卒よろしくお願い致します。

Aベストアンサー

環境(OSとコンパイラ)がわからないのでできるとは断言できないのですが、
浮動小数点レジスタの制御フラグをいじって、NaNが生成されたときに
例外が起きるようにしておけば、どこでNaNになるのかが絞れるのではないでしょうか?

いずれにしろ、注意深く値の変化を追っていくよりないと思います。

参考URL:http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg22.htm

Qfortran errorについて

fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。

以下プログラム
program test

!ここからメインルーチン

!前準備 配列の用意

implicit none
integer N
integer,dimension(0:N,0:N) :: A
integer :: i,j,k

read * ,N

!初期状態の代入

do i=0,N
do j=0,N
A(i,j)=0
end do
end do


do i=N/2,N-1
A(N/2,i)=1
end do

do i=N/2,N-1
A(N/2+1,i)=-1
end do

!ループ 50回ループさせる

do k=0,50

!状態の表示

call visualize

!サブルーチン visualize

subroutine visualize

do i=0,N
do j=0,N
if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*"
if(A(i,j)== 0) write(*,'(A1)',advance='NO') " "
if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+"
end do
write(*,*)
end do
!end subroutine visualize


call insert


!サブルーチン insert

subroutine insert
do i=0,N
do j=0,N
if(A(i,j)== 1) A(i,j)=-1
if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j))
if(A(i,j)==-1) A(i,j)=0
end do
end do
!end subroutine insert

end do

end program test

これでコンパイラすると

In file test.f90:48

subroutine visualize
1
Error: Unclassifiable statement at (1)
In file test.f90:69

subroutine insert
1
Error: Unclassifiable statement at (1)

とでます
いろいろ調べたのですが全くわかりませんでした
できればよろしくお願いします

fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。

以下プログラム
program test

!ここからメインルーチン

!前準備 配列の用意

implicit none
integer N
integer,dimension(0:N,0:N) :: A
integer :: i,j,k

read * ,N

!初期状態の代入

do i=0,N
do j=0,N
A(i,j)=0
end do
end do


do i=N/2,N-1
A(N/2,i)=1
end do

do i=N/2,N-1
A(N/2+1,i)=-1
end do

!ループ 50回ループさせる

do k=0,50

!状態の表示

call visualize

!サブルーチン v...続きを読む

Aベストアンサー

以下のような感じで良いかと思います。参考になれば幸いです。

program test
! ここからメインルーチン
! 前準備 配列の用意
implicit none
integer n
! ★nのサイズは実行時までわからないのでallocatableとして実行時に決定する
integer, allocatable, dimension (:, :) :: a
integer :: i, j, k
read *, n
allocate (a(0:n,0:n)) ! ★nの値を読み込んでから配列領域を確保する
! 初期状態の代入
! do i = 0, n
! do j = 0, n
! a(i, j) = 0
! end do
! end do
! ★上記は以下のようにより簡単に書けます
a = 0
do i = n/2, n - 1
a(n/2, i) = 1
end do
do i = n/2, n - 1
a(n/2+1, i) = -1
end do
! ループ 50回ループさせる
do k = 0, 50
! 状態の表示
call visualize
call insert
end do
contains !★サブルーチンはまとめてcontainsの後ろに書く
! サブルーチン visualize
subroutine visualize
do i = 0, n
do j = 0, n
if (a(i,j)==1) write (*, '(A1)', advance='NO') '*'
if (a(i,j)==0) write (*, '(A1)', advance='NO') ' '
if (a(i,j)==-1) write (*, '(A1)', advance='NO') '+'
end do
write (*, *)
end do
end subroutine visualize
! サブルーチン insert
subroutine insert
do i = 0, n
do j = 0, n
if (a(i,j)==1) a(i, j) = -1
if (a(i,j)==0) a(i, j) = max(0, a(i-1,j), a(i,j-1), a(i,j+1), &
a(i+1,j))
if (a(i,j)==-1) a(i, j) = 0
end do
end do
end subroutine insert
end program test

以下のような感じで良いかと思います。参考になれば幸いです。

program test
! ここからメインルーチン
! 前準備 配列の用意
implicit none
integer n
! ★nのサイズは実行時までわからないのでallocatableとして実行時に決定する
integer, allocatable, dimension (:, :) :: a
integer :: i, j, k
read *, n
allocate (a(0:n,0:n)) ! ★nの値を読み込んでから配列領域を確保する
! 初期状態の代入
! do i = 0, n
! do j = 0, n
! a(i, j) = 0
! end do
! end do
! ★上記は以下の...続きを読む

QSegmentation Fault (メモリ制限?)

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下の例ではtest bが表示れる以前に止まります。)

!--------------------------------------------------
subroutine calc_tri( )

implicit none

real*8 data1(3,200000) !<--- ここでエラー -->

write(6,*) 'test b'
!--------------------------------------------------


このような場合、配列データを減らす以外にどのような対策が
あるのでしょうか?
あるいはメモリ制限になりそうなデータ数が分る方法などあります
でしょうか?


環境は
linux (CentOS)
intel Fortran Compiler version 8.0
Mem: 1GB

topコマンドにて Memの使用割り合いは10%にもならないのですが
コンパイラによるメモリ制限などもあるのでしょうか?

subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下...続きを読む

Aベストアンサー

スタックオーバフローを起こしているのでは。
ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。

Qfortranでデータの抜き出しをしたい

プログラムは、ド素人ですが急用です。
以下のようなCSVファイルがあります。
ido,keido,point
134.603057155416,34.1005169871047,1.07
134.603270155368,34.1005169871253,0.9
134.603499155317,34.1005129871483,0.76
134.603713155269,34.100512987169,0.54
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
このようなものが100000個続く。
_________________________
データ数が100000個があります。
これらから、例えば、0以上0.5未満でido,keido,pointを
抜き出して、新たなCSVファイルを形成したいのです。
上の中なら、
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
だけが抽出されたものです。

イメージとしては、(ファイル名は適当です。)
OPEN (5,FILE='motod.csv', status='old')
OPEN (5,FILE='newd.csv')
do 10 i=1,100000
READ(5,*) ido,keido,atai
IF(atai.GE.0.00).and.IF(atai.LT.0.50)then
WRITE(5,*)ido,keido,atai
10 continue
  stop
END
になりますが、配列などが必要な気がします。

新たにお示しいただくか、継ぎ足したプログラムをお示しください。
また、今後のために参考になりそうなサイトもご紹介いただけると
幸いです。

空白がおかしいところがあろうかと思いますが、
よろしくお願いいたします。

プログラムは、ド素人ですが急用です。
以下のようなCSVファイルがあります。
ido,keido,point
134.603057155416,34.1005169871047,1.07
134.603270155368,34.1005169871253,0.9
134.603499155317,34.1005129871483,0.76
134.603713155269,34.100512987169,0.54
134.604354155125,34.1005059872324,0.19
134.604567155077,34.100505987253,0.39
134.604796155026,34.100501987276,0.44
このようなものが100000個続く。
_________________________
データ数が100000個があり...続きを読む

Aベストアンサー

書かれているプログラムに対して気が付いたことをあげておきます。

型宣言を最初にしておくべきでしょう。
宣言文無しでは、iやkは整数型とみなされます。
real*8 ido,keido,atai

装置番号に5の使用は避けた方がよいと思います。
一般に標準入力として使用されています。
標準出力として使われる6も同様の理由で避けた方がよいです。
また、入力と出力の装置番号は一緒にしない方がよいと思います。
Fortran77の固定形式を使うのであれば、10から99までの数字を使って下さい。
OPEN (10,FILE='motod.csv', status='old')
OPEN (20,FILE='newd.csv')
...
READ(10,*) ido,keido,atai
...
WRITE(20,*)ido,keido,atai

読み込むcsvファイルの1行目に
ido,keido,point
という情報があれば、これは読み込む必要はないのでdo loopに入る前に空読みします。
read(10,*)
do 10 i=1,100000

if文でandを使うのであれば、
IF(atai.GE.0.00 .and. atai.LT.0.50)then
です。

出力にコンマ区切りが必要であれば、
WRITE(20,*)ido,',',keido,',',atai
とします。フォーマット文を使っても同様のことはできます。

stopの前に全角スペースが入っています。
コンパイラにもよりますが、一般にコメント文以外で全角文字を使うとコンパイルできなくなります。

特に配列は必要ありません。

質問とは直接関係ありませんが、コメント
うまく行かない場合はエラーメッセージを読みながら試行錯誤してください。
短いプログラムでは、コンパイルエラーをしっかり読めば簡単にデバグできます。
また、プログラムを勉強するのであれば、ネットも利用するのも1つの手段だとは思いますが、例題がたくさん載っている良書を参考にするのも良いと思います。

書かれているプログラムに対して気が付いたことをあげておきます。

型宣言を最初にしておくべきでしょう。
宣言文無しでは、iやkは整数型とみなされます。
real*8 ido,keido,atai

装置番号に5の使用は避けた方がよいと思います。
一般に標準入力として使用されています。
標準出力として使われる6も同様の理由で避けた方がよいです。
また、入力と出力の装置番号は一緒にしない方がよいと思います。
Fortran77の固定形式を使うのであれば、10から99までの数字を使って下さい。
OPEN (10,...続きを読む

QFortran90についての質問です。

Fortran90に関する問題です。
「正の整数mを正の整数nで割った余りrを求める手順を、組み込み関数MOD(m,n)を用いずに、単一の算術式で表せ」
このプログラム文を以下のように作成しました。ファイル名は「amari.f90」にしました。
INTEGER::m,n,f,r
REAL::a,k
PRINT*,'Input 正の整数'
READ*,m,n
a=REAL(m)
k=a/n
f=INT(k)
IF(m>0,n>0) THEN
r=m-(f*n)
PRINT*,'余り=',r
END IF
END
そして、Cygwin画面上で
gfortran -o amari.exe amari.f90と打って、コンパイルしようとしたら以下のようなエラー文が出ました。

amari.f90:8.6:

IF(m>0,n>0) THEN
1
Error: Syntax error in IF-expression at (1)
amari.f90:11.3:

END IF
1
Error: Expecting END PROGRAM statement at (1)
プログラム文のどこの箇所が間違っているのかを教えていただけませんか?お願いします。

Fortran90に関する問題です。
「正の整数mを正の整数nで割った余りrを求める手順を、組み込み関数MOD(m,n)を用いずに、単一の算術式で表せ」
このプログラム文を以下のように作成しました。ファイル名は「amari.f90」にしました。
INTEGER::m,n,f,r
REAL::a,k
PRINT*,'Input 正の整数'
READ*,m,n
a=REAL(m)
k=a/n
f=INT(k)
IF(m>0,n>0) THEN
r=m-(f*n)
PRINT*,'余り=',r
END IF
END
そして、Cygwin画面上で
gfortran -o amari.exe amari.f90と打って、コンパイルしようとしたら以下のようなエラ...続きを読む

Aベストアンサー

FORTRAN77で終わってしまったものなので、FORTRAN90仁対しては不正確な知識で回答しますが

IF(m>0,n>0) THEN
この文、比較式の結合条件がわかりませんね、m>0かつn>0なのか、m>0またはn>0んのかコンパイラは判断できません。

普通は、if(m>0 .and. n>0)など、論理演算子を使って条件式を結合するように書きます。

ところで、このプログラム、ちゃんと動きませんよ、nに0がセットされたら、k=a/nで除算例外が発生します。
それに、わざわざrealに変換する意味が不明(というより不要)です。すべて、整数の演算で処理すればいいはずです。

QFortran:列数の分からないデータの読み込み

列数の分からないcsvファイルを想定して、配列を用いて読み込むプログラムを作成しようと考えています。

試しに十分に大きい1次元配列を用いてデータを読みこむプログラムを作成したところ
1行目読み込み時に行をまたいでデータを読み込んでしまいました。

なんとか、各行のデータだけを読み取る方法はないでしょうか?

よろしくお願いします。

ちなみにプログラムの内容、入力データ、出力結果は次の通りです。

・プログラム
implicit none
integer a(5),i
open(10,file='a.csv',status='old')
read(10,*)(a(i),i=1,5)
write(*,*)(a(i),i=1,5)
close(10)

・入力データ
    1,2,3,4
    5,6,7,8
    9,1,2,3

・出力結果
    1 2 3 4 5

Aベストアンサー

ちょっと強引かもしれないけど、

implicit none
integer a(5),i
character(80) line
open(10,file='a.csv',status='old')
read(10,'(a)') line
read(line,*,end=1)(a(i),i=1,5)
1 write(*,*)(a(i),i=1,5)
close(10)
end


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報