ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Fortranコミュの入力ファイルに関する質問

  • mixiチェック
  • このエントリーをはてなブックマークに追加
学生です.入力ファイルに関する質問をさせて下さい.


今回,2つの地震波形の相互相関を調べる簡単なプログラムを組んで,コンパイルも成功しましたが,実行すると,以下の様なメッセージが出て,外部の入力ファイルの参照がうまくいきません.一度は成功して結果が出力されたのですが….このメッセージにもあるように入力ファイル側に問題があることは間違いなさそうです.


「1525-097 10進法入力を使用するREADステートメントが、入力ファイルで無効な数字 '' を検出しました。プログラムは、この場所にゼロを想定することによって回復します。」


入力に関連するところを抜き出すと,

OPEN(5,FILE='FILENAME.DAT',STATUS='OLD')
READ(5,501) (DATAX(M),M=1,1024)
CLOSE(5)
501 FORMAT((F10.6))


FILENAME.DATは以下の様な書式で数値を1024個並べたものです.半角スペース(ここでは*で表示)をデータの前に加えて,FORMAT文に沿うようにしています.これにはエクセルの文字列操作を使いました.

*****29757
***-169751
***-384830
**-1095550
**-1342590


長くなってすみません.気付くところがありましたら教えて下さい.

コメント(27)

こんにちは、

同じフォーマット文で WRITE してみてファイルの内容を見てみると良いかもしれませんよ。
私も format 文をさほど使いこなせているわけではないのですが…

エクセルをかます、とか、面倒くさいですよね。


半角スペースはいれずに、
29757
-169751
-384830
-1095550
-1342590

と書いて、

OPEN(5,FILE='FILENAME.DAT',STATUS='OLD')
READ(5,*) (DATAX(M),M=1,1024)
CLOSE(5)

で読み込めば良いと思うのですが、
それでは不都合がありますかね?
ありがとうございます.

FORMAT文を使わないで試してみましたが,同じメッセージが出ます.結果はそれとは関係なく出力されています.FORMAT文を使っても結果は出ます.

先に進むことはできますが,なんかすっきりしません.

「無効な数字 ''」 って言われても,'と'の間に何も書かれてないし….
READ(5,501) (DATAX(M),M=1,1024)

の1024のところを1〜1024に変化させてみると問題の入力行が見つかるかもしれませんよ。

#入力ファイルの16進ダンプを調べましょうなんて...
数行だけとは考えられません.

例のメッセージはかなりの数,もしかしたら1024回出てるかもしれません.データ整理の過程から観ても,混じりは考えられないのです.

皆さん,ありがとうございます。
あとからの書き込み失礼します

ふと気になったのですが、原因は改行コードとか考えられませんか?
たびたびすみません。

囲さんの書かれているとおりにまったく書式にあわない書き方をされているのでプログラムが停止しなくても正しくデータが読み込まれていない可能性があります。直後にWRITE文を追加してダンプするなどの方法で確認が必要です。

FORTRANはコンパイル後に機械語でかっとぶのでチェックは最低限です。

というか、エラーが気になるなら、書式が正しくないので書き換える必要があります。

みかん箱さんの言われる原因のトラブルも良くあると思います。
しっかりとFORTRANを勉強しているわけではない者ですが……. ちょっと気になったので.


READ(5,501) (DATAX(M),M=1,1024)

↑これですと,横方向に読みますよね.

入力ファイル上で,改行しながらデータ入力されているのであれば,

DO M=1,1024
READ(5,*) DATAX(M)
ENDDO

これでいいんじゃないですかね?
改行コードを変換するのにお勧めのフリーソフトはありますか?ちょっとその線を試してみようと思います。

よく分からないのですが、OSによって改行コードが違うってことですよね。簡単に解説して下さると助かります。
念のためですけど、
変数 DATAX の定義文は大丈夫ですかね?
定義文ってこれのことですか?

DIMENSION DATAX(1024)
> 10: YUさん

プログラムはUNIX系のOS上でコンパイルしたのですか?
それなら、

dos2unix FILENAME.DAT

でwindowsの改行コードがUNIX、LINUXの改行コードに変換できると思います。
(他にもコマンドがあったはずですが、忘れてしまいました)
その通りです。

WINDOWSで作ったソースファイルをUNIX系のOSに転送してコンパイルしました.

% perl -pe 's/\r\n/\n/' winfile > unixfile

このコマンドで試してみました.改行形式の変換はできましたが,エラーはまだ出ます….
XL FORTRAN ですか。いいの使ってるなあ〜。

前にも書いたけど、FORTRANで出力したファイルを食わせてみるのが一番確実ですよ。
一般的な注意として、プログラムのバグを質問するときは実行環境を詳細に書いてくださいね。
OSやコンパイラーなどです。

あと、ソースファイルはできるだけ書いたほうが良いですよ。


そして、定義文ですが、
>DIMENSION DATAX(1024)
だと、整数か実数か分かりませんね。

Dで始まっているので、おそらく実数型になっていますか?
(implicit 文がありますか?)

入力データの方は、整数で書いてありますよね。

その不整合が原因の可能性がありますよ。
(もちろん、他の可能性もありますよ、コンパイラによって何にwarningを出すかは違いますから)


たとえば定義文を、
real*8::DATAX(1024)
と書き換えて、

つまり、入力データを、 9842.0D0 のように浮動少数で書いてみたらどうでしょうか?



最後に、とりあえず、プログラム単位でここに載せてみたほうが、みんながアドバイスしやすいと思いますよ。
そうですか。まだエラーが出ますか。

> 9: 裏方さん の改良は試してみましたか?

手元にUNIXが無いのではっきりしたことは言えませんが、処理系、コンパイラによって改行コードの取り扱いが違うのかも知れません。

少し試してみました。
windows環境で、Intel Fortranだと、問題なく入力してくれました。Write文で読み込んだ値をチェックしても、問題はなさそうでした。

Cygwinのg77だと、

invalid number: incomprehensible list input

となります。入力ファイルの改行を無くし、横に並んだデータにすると、問題なくファイルが読めました。

多分、改行コードを認識してしまっているのではないでしょうか?
わき道にそれる様で申し訳ないのですが、

>FILENAME.DATは以下の様な書式で数値を1024個並べたもので
>す.半角スペース(ここでは*で表示)をデータの前に加えて,
>FORMAT文に沿うようにしています.これにはエクセルの文字
>列操作を使いました.

でエクセルからどうやって出力したんでしょうか?。
CONCATENATEとLEFTBという関数を使ってFORMAT文に沿うように整理して(今はFORMAT文を使ってませんが),そのままTXTファイルで保存しただけです.こういった操作をすると不具合が生じそうですか?見た目は何の変哲もないTXTファイルが出力されましたが.


IMPLICITは使用していませんので実数型で入力すべきでしたね.対策としてreal*8::DATAX(1024)とするのではなく入力データの末尾に小数点を加えることで整合させてみましたが,エラーが依然出ます.


他にもいろいろと案を頂いたので,やってみます.ソースファイルも載せますので何かお気づきの点ありましたら,教えて下さい.
すみません.

今日は帰宅します.いろいろとありがとうございました.
いろいろと試してみますので,引き続き面倒見て下さい.

自宅にFORTRANの環境が整えたいです.

フリーのコンパイラはあるのでしょうか.
参考にならないかも知れませんが、一応こちらの
検証結果を書きます。

私はエクセルでは無くて、openoffice2.0でやってます。

(1)openofficeのフィールド内部に
1
2
3
4
5

と打って、ファイル-名前を付けて保存で
テキストCSV(.csv)の拡張子で、
test1.csvで保存して、

PROGRAM TEST
IMPLICIT NONE
INTEGER NMAX,I
PARAMETER(NMAX=10)
REAL*8 X
OPEN(5,FILE='test1.csv',STATUS='OLD')
C
DO I=1,5
READ(*,*)X
WRITE(*,*)X
ENDDO
C
STOP
END

でコンパイルすると、普通に読み込んでくれました。


>自宅にFORTRANの環境が整えたいです.
>
>フリーのコンパイラはあるのでしょうか.

cygwinでf77があります。
解決しなくて残念ですね〜。

上のやりとりだとソースプログラムファイルの改行コードを変換したようにもとれますが、データファイルを変換しましたよね。

FORMAT文をとった後は、入力ファイルは空白をとって左詰めにしてますよね。

フリーのコンパイラは、WINDOWS上なら Cygwinを導入して、Linux が使えるならその上で g77 などがあるとおもいます。

ワーニングのメッセージなんて気にしないのも手かも。
自宅で環境を整えて試してみると,

入力ファイルをCSVで保存するとエラーが出ませんでした.他は変更していません.

DATのままだと実行のところでエラーが出ます.コンパイラーの違いからか文言は違いますが(数行のエラーメッセージの後に写真の様なa.exe.stackdumpというファイルが作成されました).

今回のエラーはデータ自体よりもデータの区切りの仕方によると考えてよろしいでしょうか。
書き忘れましたが,

>上のやりとりだとソースプログラムファイルの改行コードを変換したようにもとれますが、データファイルを変換しましたよね。
>FORMAT文をとった後は、入力ファイルは空白をとって左詰めにしてますよね。

そのようにしています.これで改善されませんでしたが.
>自宅で環境を整えて試してみると,
>
>入力ファイルをCSVで保存するとエラーが出ませんでした.他>は変更していません.

良かったですね。私もこの手のアプリケーションを
跨いでデータをやり取りするときに、エラーは吐いて
止まった経験が何度もあります。プログラムのバグで
止まるのは「バグ取り物語」(ぇのノリでやりますが、
データのやり取りで止まるのは非常にストレスが溜まった
経験があります。

と感想を書いても仕方が無いのですが、今回のエラーの
原因としては既に指摘されているようなフォーマットの
問題だと思うのですが、何が原因なのでしょうか。

>DATのままだと実行のところでエラーが出ます

と書いてあるのですが、DATファイルとしてセーブした
場合、Notepadで開くと変なコードが入ったりしないで
しょうか。

もう一つ考えられるのは
>CONCATENATEとLEFTBという関数を使って‥

と言う操作が問題になった場合です。この関数を使って
処理した場合に、msftたんさんが指摘した場合が考え
られると思います。

もう一つは

セーブするときに、改行コードをソフトウェア側から
聞いてきます(私の場合、openoffice側から聞かれました)。
そこでの改行コードの設定に問題があった場合です。

(ちなみに私も勉強になりました)
一応,解決したのでよかったです.

原因が確定したわけではありませんが….

いろいろと聞きなれない言葉が出てきて勉強になりました.

ありがとうございました.

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Fortran 更新情報

Fortranのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング