「教えて!ピックアップ」リリース!

FORTRAN言語でプログラミングをして、実行させた際に次のようなエラーが出てきました。
forrtl: severe (64): input conversion error
ファイル(DATA FILE)を読み込む際に出ます。
なぜこのようなエラーがでるのかよく分かりません。
私が思うに読み込むデータファイルのサイズが大きすぎる(約2.3M)のではないかと思っているのですが、どなたか原因が分かる方ご教授お願いします。

A 回答 (5件)

FORTRAN 懐かしいですね.


FORMULA TRANSLATOR でしたっけ?

フォートランにもいろいろなバージョンがあるので,
何とも言えませんが,
conversion とは 変換という意味なので,
入力しているファイルのデータ型と入力している変数の方であわなくて変換できないと言うことでしょうか.

たとえば,数値に対して,文字列がきたとか.

どのバージョンかわかりませんが,
きょうび,2Mや3M程度の大きさの配列でエラーをだす処理系というのも無いと思います.

昔は,リージョンサイズが4M程度しか無かったので
エラーは出ましたが,サイズがおおきすぎて出るのは,
「Invalid Memory Access」とかそれっぽいものです.
サイズがもしも,処理系が派許容していないくらい大きいとしたら,コンパイル時にでるか,
実行ファイルをロードしたときに出ると思います.

ランタイム時にでるということは,プログラムミスで
おもったよりも大きなものを読み込もうとしている場合などが考えられます.
用意している配列が1Mなのに,読み込もうとしているデータが2Mある場合などです.

#1さまご指摘のように,ソースコードの一部や処理系を示さないとなんとも言えないと思います.

この回答への補足

早速のご返答有難うございます。
誠に申し訳ありません。#1様のおっしゃる通り、OSならびにソース等示す必要がありますね。
あまりの不備をお許しください。
ご指摘にお答えしますと、
OS:Windows xp
FORTRAN:Compaq Visual Fortran version 6.1
source:
--main--
OPEN(UNIT=28,FILE='D:\rslt_face\'//NRFILE//'.dat',
& ACCESS='SEQUENTIAL',STATUS='OLD')
CALL FLINFACE(IFACE,IEND,MODULUS,JMARK,FRSTR,FREFFST,
& FRDFEFFST,FRSTN,FRSUMEPSTN)
CLOSE(UNIT=28)
--subroutine--
SUBROUTINE FLINFACE(IFACE,IEND,MODULUS,JMARK,FRSTR,FREFFST,
& FRDFEFFST,FRSTN,FRSUMEPSTN)
IMPLICIT REAL*8(A-H,O-Z)
COMMON /D/ MODE
COMMON /ELTYPGS/ ICLAS,NODE,NGAUS,IPLAN,ISTR,NSTR
CHARACTER*120 D120
DIMENSION JMARK(IFACE,IEND)
DIMENSION FRSTR(6,4,IFACE,IEND)
DIMENSION FREFFST(4,IFACE,IEND),FRDFEFFST(4,IFACE,IEND)
DIMENSION FRSTN(6,4,IFACE,IEND),FRSUMEPSTN(4,IFACE,IEND)
c
READ(28,'(5X,I5)') MODE
READ(28,'(8X,I2)') MODULUS
C
DO 60 L=1,IEND
READ(28,'(A120)') D120
READ(28,'(A120)') D120
*
*
*
上に示しますオープン文、もしくはその直後のサブルーチンあたりでこけてるようです。
ご指摘に十分添えているか分かりませんが、お願いします。新たなご指摘があれば逐次対応させていただきます。

補足日時:2004/07/22 12:41
    • good
    • 0

#1です。

#3さんの書いているあたりが怪しそうですね。
OPEN(UNIT=28,FILE='D:\rslt_face\testfile.dat',
& ACCESS='SEQUENTIAL',STATUS='NEW')
WRITE(28,'(5X,I5)') 12345
WRITE(28,'(8X,I2)') 67
CLOSE(UNIT=28)
END
というプログラムで作られるtestfile.datと、
読もうとしているファイルの先頭2行を比べてみてください。
数字の値以外の文字数などは同じになってないとおかしいですが、違っているんじゃないでしょうか?改行文字とかが違うのかも。
もしそうならマニュアルをよく読んでください。
    • good
    • 0

#2です.


Visual Fortran というものがあるのですか.
知りませんでした.
私的には,fortran77で止まってます.(^-^;)

入力データはどんなものでしょうか.

ループの
最初からエラーをだしているのでしょうか.
それても,ファイル終端まで行っているのでしょうか.

IENDは,パラメータ文か何かで与えているようですが,値はちゃんと入ってますか?
ディスプレイかファイルに書き出してみて,チェックしてみましょう.
異常終了させると,ただしく出力しないケースがあるので,STOP文で強制的に終了させれば,その時点までの入出力は正しく反映されます.

デバッグ環境でやられているのであればブレークポイントを設定しても良いですし.

>DO 60 L=1,IEND
>READ(28,'(A120)') D120
>READ(28,'(A120)') D120
>*

このループに入る前にSTOP分などを入れて
プログラムを止めたときに,

MODE

MODULUS
には正しい値がはいっていますか?

また,このループでは,同じ変数に続けて値を入れています.行をスキップするためのようですが,
ファイルには120列の固定長データが書かれているのでしょうか.

FORTRANで文字列操作した経験は少ないので,あまりお力になれないかもしれません.

それでは.
    • good
    • 0

昔,SunOSだかirixだかで使ったFORTRANだと、


READ,WRITEで特殊なエミュレーションモードみたいな形式と通常のテキストファイルを読み書きするようなモードがありました。
で、エミュレーションモードで通常のテキストファイルを読み込むと、変換エラーになったかも知れません。

なぜこんな物があるかというと、元々カード形式とか、固定長レコードのファイルを扱うものだったので、
通常のテキストファイルだと同じ様な動作をさせることが原理的に無理だったためだと思います。
これかどうかは、試しにFORMAT文付きでWRITEしたファイルの中身を見ればわかります。

もしそうなら、多分OPENのパラメタになにか指定があると思います。
    • good
    • 0

エラーメッセージはコンパイラの種類によって違いますから正確な意味はマニュアルを読まないとわかりません。


conversion error(変換エラー) ということですから、ファイル内データ形式とREAD文での書式とが合ってないんじゃないでしょうか?
ただ、severe(重大なエラー)と出てるので、もっと根本的なところで間違っているのかも知れません。

少なくとも、OS名称、FORTRANの種類、データの形式、READ文周辺のプログラムを示さないと誰もこれ以上の返答は無理と思います。私の使ったことの無いFORTRANのようなので私はこれ以上返答できませんが。
    • good
    • 0

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

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


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

人気Q&Aランキング