2013-08-15 24 views
5

Chúng ta đều biết rằng vòng lặp DO mạnh hơn câu lệnh FORALL ở Fortran. Tức là, bạn luôn có thể thay thế một số FORALL bằng một số DO, nhưng không phải ngược lại.Tương đương với IF và WHERE

Còn câu lệnh và khối WHERE thì sao?

Tôi luôn có thể thay thế IF bởi một WHERE? Có luôn luôn có thể mã các điều kiện và phân nhánh với một WHERE, do đó tránh IF?

+3

Mục đích ban đầu của FORALL là cho phép các bài tập mảng đeo mặt nạ được thực hiện song song - nó đến từ một biến thể gọi là High Performance Fortran và đã được thông qua vào Fortran 95. Thật không may, ngữ nghĩa của FORALL không có lợi cho việc song song, vì vậy Fortran 2008 đã thêm DO CONCURRENT, không chỉ quen thuộc với các lập trình viên của Fortran mà còn có ngữ nghĩa tốt hơn cho việc song song. Bạn có thể muốn nhìn vào MERGE, có thể, với một số mặt nạ thông minh, khá mạnh mẽ. –

+0

Tiếp tục những gì @SteveLionel đã nói, lưu ý rằng 'MERGE' * có thể * được sử dụng bên trong khối' WHERE' trong khi câu lệnh 'IF' * không thể *. –

+1

Cũng lưu ý rằng 'FORALL' hoàn toàn là một câu lệnh gán hoặc khối, trong khi' DO' là một cấu trúc điều khiển lưu lượng tổng quát hơn. – milancurcic

Trả lời

9

WHERE báo cáo được dành riêng cho các mảng bài tập và không có gì khác, ví dụ:

INTEGER, DIMENSION(100,100) :: a, b 
... define a ... 
WHERE(a < 0) 
    b = 1 
ELSEWHERE 
    b = 0 
ENDWHERE 

Nếu bạn đã cố gắng thêm trong một cái gì đó, nói một tuyên bố WRITE, bên trong khối WHERE, bạn sẽ thấy một cái gì đó giống như lỗi biên dịch sau (phụ thuộc biên dịch):

Error: Unexpected WRITE statement in WHERE block at (1) 

EDIT

Lưu ý rằng lồng WHERE khối là hợp pháp:

WHERE(a < 0) 
    WHERE(ABS(a) > 2) 
     b = 2 
    ELSEWHERE 
     b = 1 
    ENDWHERE 
ELSEWHERE 
    b = 0 
ENDWHERE 
+0

OK, vì vậy câu trả lời cho câu hỏi trên là "KHÔNG" đơn giản. –

+3

Đúng, nó là một câu trả lời đơn giản không có. Một đoạn mã đơn giản 10 dòng cũng có thể đã cho bạn biết câu trả lời tương tự, thay vì hỏi chúng tôi: / –

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