Преобразование логического оператора ИЛИ из C ++ в Фортран - PullRequest
0 голосов
/ 09 октября 2018

Каким будет преобразование следующего логического оператора C ++ в Fortran 90 (.f90)?Если (vx присутствует или vy присутствует).Здесь vx и vy являются компонентами скорости

if(vx || vy){
vT=sqrt(vx*vx + vy*vy);
}

Я пытался выполнить следующие действия:

if(vx .or. vy) then
vT = sqrt(vx*vx + vy*vy)
end if

, но получаю ошибку:

operands of logical operator `.or.` at (1) are REAL(8)/REAL(8).

Можеткто-нибудь ведет меня сюда?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В данном случае это не актуально, но в целом следует отметить, что логические операции на Фортране не имеют короткого замыкания.Так, например, следующий код C ++

if (a == 0 || 10 / a == 1)
{
   ...
}

не эквивалентен

if (a == 0 .or. 10 / a == 1) then
    ...
end if

в Фортране.Компилятор может решить сначала оценить второе слагаемое, а затем ... упс.Он должен быть написан с использованием двух вложенных if s.

0 голосов
/ 09 октября 2018

Версия C ++ неявно сравнивает vx и vy с нулем.

В Фортране вы должны сделать это явно 1 :

if (vx /= 0 .or. vy /= 0) then

Поскольку оператор if выглядит как оптимизация производительности, возможно, стоит задаться вопросом, нужно ли оно вообще или его можно заменить безусловным присваиванием vT (которое установит vT в ноль, если оба vx и vy равны нулю).

1 Надеюсь, я правильно понял;много лет не программировал на Фортране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...