Какой удобный способ сделать новую библиотеку Fortran доступной из C

Я работаю над небольшой библиотекой Fortran (новый код), которая вызывается из нескольких приложений C/C++. Библиотека такая, что почти каждую подпрограмму можно было вызывать отдельно из приложения. Поэтому мне нужно предоставить интерфейс C для этих подпрограмм.

  • Я могу использовать модули, которые очень удобны сами по себе. Но тогда мне нужно либо вручную декодировать искажение имени модуля (что не очень сложно для gfortran, но выглядит плохо), либо использовать предложение bind(C,name="some_name"). Последнее приводит к предупреждениям компилятора, например, параметр подпрограммы не был явным образом интероперабельным (например, компилятор хочет, чтобы я заменил double precision на real(kind=C_DOUBLE)). И я должен в этом случае заменить почти каждую переменную в библиотеке такими уродливыми объявлениями, что приводит к плохому чтению кода.
  • Я могу использовать подпрограммы, когда каждый файл в библиотеке состоит из нескольких подпрограмм (я так и делаю сейчас). Явно интерфейсы передаются между ними с помощью interface ... include "otherfile_h.f90" ... end interface, что не очень удобно. В этом случае изменение имени довольно просто, и библиотечные подпрограммы можно легко вызывать напрямую из C.

Подход, который я использую (маркер № 2), требует большего набора текста и подвержен ошибкам из-за дублирования определений в исходных/заголовочных файлах. Есть ли лучший способ сохранить чистоту и читаемость исходных текстов с помощью интеллектуального интерфейса C?


person Yury    schedule 03.07.2012    source источник
comment
Я не понимаю использование термина «удобный» в отношении выбора между одним подходом к программированию и другим. Я подозреваю, что это относится к факторам программного обеспечения, которые являются субъективными и спорными, что поэтому делает этот вопрос неприемлемым здесь, на SO. Если я неправильно истолковал ваше намерение, пожалуйста, поясните.   -  person High Performance Mark    schedule 03.07.2012
comment
@HighPerformanceMark Согласен, переформулировал мой вопрос.   -  person Yury    schedule 03.07.2012
comment
Я все еще думаю, что этот вопрос поднимает вопросы мнения и вкуса. Я, например, считаю, что real(kind=C_DOUBLE) прекрасно читается, и мой "ответ" на ваш вопрос Есть ли лучший способ... - Нет. Я бы пошел дальше и заявляют, что программирование НА языке, а не программирование ВОКРУГ языка — это путь к счастью, удовлетворению и успеху. Но обратите внимание, что это всего лишь комментарий, я не предлагаю ответа.   -  person High Performance Mark    schedule 03.07.2012
comment
@HighPerformanceMark На самом деле я главный программист на C / C ++, и я не знаю обычных практик Фортрана в этом случае. Так что если ответ используйте kind=C_DOUBLE, потому что у меня большой опыт работы с таким кодом, и он отлично читается, то, вероятно, это приемлемый ответ.   -  person Yury    schedule 03.07.2012


Ответы (1)


Современный способ смешивания Fortran и C состоит в использовании привязки Fortran ISO C Binding. Это сделает ваш код переносимым, поскольку привязка ISO C является частью языкового стандарта. Выяснение искажения имени вручную зависит от компилятора и может не работать на другом компиляторе. «Двойная точность» не считается декларацией передовой практики для современного Фортрана (см., например, Расширенная двойная точность и http://fortranwiki.org/fortran/show/Modernizing+Old+Fortran). Современный способ - использовать «настоящий (вид = XYZ)». Концепция языка заключается в том, что обычно программист использует встроенную функцию SELECTED_REAL_KIND для определения константы (например, MyDouble) с необходимой точностью. Если точность, которая вам нужна, равна C_DOUBLE, то для Фортрана вполне уместно использовать такое значение. Это не уродливое заявление. (Я не понимаю вашу пулю № 2.)

person M. S. B.    schedule 03.07.2012