2013-06-30 40 views
14

Tôi đang thích nghi với một số mã Fortran tôi đã không viết, và không có nhiều kinh nghiệm fortran bản thân mình. Tôi chỉ tìm thấy một tình huống mà một số đầu vào không đúng định dạng đã âm thầm bỏ qua, và muốn thay đổi mã đó để làm điều gì đó thích hợp hơn. Nếu đây là C, sau đó tôi muốn làm điều gì đó nhưDừng chương trình fortran với non-zero trạng thái thoát

fprintf(stderr, "There was an error of kind foo"); 
exit(EXIT_FAILURE); 

Nhưng trong fortran, tốt nhất tôi biết làm thế nào để làm trông giống như

write(*,*) 'There was an error of kind foo' 
stop 

mà thiếu lựa chọn dòng đầu ra (vấn đề nhỏ) và trạng thái thoát (vấn đề lớn).

Làm thế nào tôi có thể chấm dứt một chương trình fortran với một trạng thái thoát khác không?

Trong trường hợp này là biên dịch phụ thuộc, một giải pháp mà làm việc với gfortran sẽ được tốt đẹp.

Trả lời

18

Các stop tuyên bố cho phép một số nguyên hoặc nhân vật có giá trị. Dường như có khả năng những thứ này sẽ được xuất ra thành stderr khi tồn tại, nhưng như stderr phụ thuộc vào hệ điều hành, có vẻ như tiêu chuẩn ngôn ngữ Fortran đòi hỏi rằng, nếu nó nói gì cả. Cũng có khả năng là nếu bạn sử dụng tùy chọn số, trạng thái thoát sẽ được đặt. Tôi đã thử nó với gfortran trên máy Mac, và đó là trường hợp:

program TestStop 

integer :: value 

write (*, '("Input integer: ")', advance="no") 
read (*, *) value 

if (value > 0) then 
    stop 0 
else 
    stop 9 
end if 

end program TestStop 

Trong khi một cách chính xác những gì stop với một số nguyên hoặc chuỗi sẽ làm là hệ điều hành phụ thuộc vào, tuyên bố là một phần của ngôn ngữ và sẽ luôn luôn biên dịch. call exit là một phần mở rộng của GNU và có thể không liên kết trên một số hệ điều hành.

+0

Theo tiêu chuẩn, "Tại thời điểm chấm dứt, mã dừng, nếu có, có sẵn theo cách phụ thuộc vào bộ xử lý." – astrojuanlu

4

Tôi không thể tìm thấy bất kỳ điều gì về STOP trong gfortran 4.7.0 keyword index, có lẽ vì đó là từ khóa ngôn ngữ và không phải là nội tại. Tuy nhiên, có một EXIT intrinsic mà dường như làm những gì tôi đang tìm kiếm: thoát với một trạng thái nhất định. Và the fortran wikia small example of using stderr đề cập đến hằng số ERROR_UNIT. Vì vậy, bây giờ mã của tôi bây giờ trông giống như sau:

USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT 
[…] 
WRITE(ERROR_UNIT,*) 'There as an error of kind foo' 
CALL EXIT(1) 

Điều này ít nhất là biên dịch. Kiểm tra vẫn đang chờ xử lý, nhưng nó sẽ hoạt động. Nếu ai đó biết một giải pháp thanh lịch hơn hoặc phù hợp hơn, vui lòng cung cấp các câu trả lời thay thế cho câu hỏi này.

+2

DỪNG là một tuyên bố. EXIT() là một phần mở rộng của GNU và có thể không có sẵn trong các trình biên dịch khác. –

10

Ngoài dừng n, đó cũng là lỗi dừng n từ Fortran 2008. Với gfortran trong môi trường Windows, cả hai đều gửi số lỗi cho hệ điều hành, như có thể thấy với một tiếp theo echo %errorlevel%. Thông báo lỗi lỗi cũng có thể được chuyển qua thông báo lỗi.

program bye 
    read *, n 
    select case (n) 
     case (1); stop 10 
     case (2); error stop 20 
     case (3); error stop "Something went wrong" 
     case (4); error stop 2147483647 
    end select 
end program