Эквивалентность Фортрана

Я хочу использовать Equivalence. Как это можно использовать в gfortran-5?

Я использую:

Select Case (dst)
Case ("cm")
  Equivalence :: (cm2Mm_r32, r32), (cm2Mm_r64, r64)
  Call qcdiv (qb, qa, r32, r64, cm2Mm_r128)
Case ("m")
  Equivalence :: (m2Mm_r32, r32), (m2Mm_r64, r64)
  Call qcdiv (qb, qa, r32, r64, m2Mm_r128)
Case ("Km")
  Equivalence :: (Km2Mm_r32, r32), (Km2Mm_r64, r64)
  Call qcdiv (qb, qa, r32, r64, Km2Mm_r128)
End Select

person Zeus    schedule 11.03.2015    source источник
comment
Не. Просто не надо. Напиться до беспамятства, считай утреннее похмелье справедливым наказанием за мысль об употреблении equivalence. К счастью для вас, equivalence является типом объявления и не может быть расположен там, где вы хотите.   -  person High Performance Mark    schedule 12.03.2015
comment
Как можно было бы иметь два имени для переменной?   -  person Zeus    schedule 12.03.2015
comment
Из того, что я понял, есть как минимум два возражения против использования equivalence: 1) это затрудняет чтение кода, поскольку посторонний не обязательно будет знать, что две переменные относятся к одному и тому же биту памяти, 2) вы можете интерпретировать бит equivalenced памяти как разных типов, что не очень разумно.   -  person Kyle_S-C    schedule 12.03.2015
comment
да, equivalence это так плохо. Вероятно, он все еще существует только для поддержки устаревшего кода. У вас может быть несколько имен для переменной с указателями. Почему?   -  person M. S. B.    schedule 12.03.2015
comment
Я использую две неограниченные полиморфные переменные для обработки общих числовых преобразований, и в итоге получаю чрезвычайно длинную подпрограмму. Я хотел использовать более короткие переменные для коэффициентов преобразования, устанавливая их в соответствии с происходящим преобразованием. Чтобы упростить, я должен обрабатывать полиморфную проверку, создавая другую подпрограмму и вызывая ее с правильным коэффициентом преобразования.   -  person Zeus    schedule 12.03.2015
comment
Если только имена слишком длинные, используйте associate, если вам не нужны allocatable или pointer.   -  person Vladimir F    schedule 12.03.2015


Ответы (1)


Заявление об эквивалентности должно располагаться в части объявления. Вы не можете контролировать это с помощью условий.

Современный Фортран предпочитает transfer() для преобразования битовых шаблонов. Если вам не нужны преобразования типов, используйте указатели.

На самом деле я использую эквивалентность в одном месте своего кода, где компилятор Intel не может оптимизировать transfer(), но это исключение, вы должны дважды подумать, прежде чем использовать его.

person Vladimir F    schedule 11.03.2015
comment
Мне нужны преобразования типов. Теперь я нашел аккуратное решение без эквивалентности, передачи или указателей. - person Zeus; 12.03.2015
comment
Что это за решение? Есть шанс, что он будет противоречить некоторым ограничениям стандарта Fortran и может сломаться при оптимизации. У многих трюков с каламбурами есть эта проблема. - person ; 12.03.2015