2013-08-15 14 views
5

Wszyscy wiemy, że pętla DO jest silniejsza niż oświadczenie FORALL w Fortran. Oznacza to, że zawsze można zastąpić FORALL przez DO, ale nie na odwrót.Równoważność IF i WHERE

Co z oświadczeniem i blokiem WHERE?

Czy mogę zawsze zastąpić IF przez WHERE? Czy zawsze można kodować warunkowe i bifurkacje za pomocą WHERE, unikając w ten sposób IF?

+3

Oryginalny intencją forall było umożliwienie zamaskowani zadania array być wykonywane równolegle - pochodzi wariant o nazwie High Performance Fortran i został przyjęty do Fortran 95. Niestety, semantyka FORALLA nie sprzyjała zrównolegleniu, więc Fortran 2008 dodał DO CONCURRENT, który jest nie tylko bardziej znajomy dla programistów Fortrana, ale ma również lepszą semantykę dla równoległości. Możesz spojrzeć na MERGE, który przy pomocy sprytnych masek może być dość potężny. –

+0

Kontynuując, co @SteveLionel powiedział, należy pamiętać, że "MERGE" * może * być używane wewnątrz bloku 'WHERE', podczas gdy instrukcja' IF' nie może *. –

+1

Należy również pamiętać, że 'FORALL' jest czysto instrukcją przypisania lub blokiem, natomiast' DO' jest bardziej ogólną konstrukcją kontroli przepływu. – milancurcic

Odpowiedz

9

WHERE oświadczenia są zarezerwowane dla tablic zadań i nic innego, np:

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

Jeśli próbowano dodając coś powiedzieć WRITE oświadczenie, wewnątrz bloku WHERE, by zobaczyć coś takiego błędu po opracowującym (kompilator zależna)

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

EDIT

Zauważ, że zagnieżdżone WHERE bloki są legalne:

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

OK, więc odpowiedź na powyższe pytanie jest prosta "NIE". –

+3

Prawidłowo, to prosta odpowiedź. Prosty, 10-liniowy fragment kodu mógł również powiedzieć ci tę samą odpowiedź, zamiast pytać nas: / –