2012-11-21 24 views
5

任意の浮動小数点文字列をfortranの実数に変換する簡単な方法はありますか? strtodのようなものを考えますか? READステートメントの問題は、すべての浮動小数点フォーマットの編集記述子に明示的な幅が必要であることです。これまで私が作った最高の回避策のようなものです:Fortran 95で任意の浮動小数点文字列を実数に変換

pure function strtod(s) 
    real(kind=8) :: strtod 
    character(len=*), intent(in) :: s 
    character(len=32) :: fmt 
    integer :: dot 
    dot = index(s, ".") 
    if(dot < 1) then 
    write(fmt, '("(F",I0,".0)")'), len_trim(s) 
    else 
    write(fmt, '("(F",I0,".",I0,")")'), len_trim(s), len_trim(s)-dot 
    end if 
    read(s,fmt), strtod 
end function strtod 

しかし、私は何かが欠けていることだし、可能性がある場合、私は思ったんだけどそれを行うには良い方法はありますか?

+0

なぜ文字列を実際の変数に読み込むことができないのですか? 'read(s、*)x'' s'はあなたのキャラクターで、 'x'は浮動小数点値です。 – Peaceful

答えて

1

私は何かが欠けているはずです。リストの指示でそれをすることで何が問題になったのですか?

[[email protected] stackoverflow]$ cat char2.f90 
Program char2 

    Implicit None 

    Integer, Parameter :: wp = Selected_real_kind(12, 70) 

    Real(wp) :: a 

    Character(Len = 32) :: s 

    s = '0.' 
    Read(s, *) a 
    Write(*, *) a 

    s = '1e10' 
    Read(s, *) a 
    Write(*, *) a 

End Program char2 
[[email protected] stackoverflow]$ nagfor -C=all -C=undefined char2.f90 
NAG Fortran Compiler Release 5.3.1 pre-release(904) 
[NAG Fortran Compiler normal termination] 
[[email protected] stackoverflow]$ ./a.out 
    0.0000000000000000 
    1.0000000000000000E+10 
+0

リスト形式の書式設定では、入力エラーを黙ってスキップする傾向があります。例:プログラムに入力として「12 *」を入力してみてください。リスト指向のフォーマットでは、ゼロを生成し(gfortranでテストされます)、私の関数ではエラーが発生します(望みどおり)。 – abbot

関連する問題