2012-11-21 18 views
5

Có cách nào dễ dàng để chuyển đổi chuỗi dấu chấm động tùy ý thành số thực trong fortran không? Hãy nghĩ về một cái gì đó như strtod? Vấn đề với câu lệnh READ là tất cả các định dạng điểm nổi chỉnh sửa mô tả yêu cầu độ rộng rõ ràng. Cho đến nay giải pháp khắc phục tốt nhất mà tôi đã thực hiện là:Biến đổi chuỗi dấu chấm động tùy ý thành hiện thực trong 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 

Nhưng tôi tự hỏi nếu tôi thiếu điều gì đó và có thể có cách nào tốt hơn để làm điều đó?

+0

Tại sao bạn không thể đọc chuỗi đó thành biến thực? 'read (s, *) x' trong đó' s' là ký tự của bạn trong khi 'x' là giá trị float của nó. – Peaceful

Trả lời

1

Tôi phải thiếu điều gì đó. Có gì sai khi thực hiện nó với danh sách được hướng dẫn?

[[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

Định dạng theo danh sách có xu hướng âm thầm bỏ qua lỗi đầu vào. Ví dụ: hãy thử cho ăn "12 *" làm đầu vào cho chương trình của bạn. Với định dạng danh sách, nó tạo ra số không (được thử nghiệm với gfortran), với hàm của tôi nó tạo ra một lỗi (như mong muốn). – abbot

Các vấn đề liên quan