У меня есть проект с половиной в C и половиной в Fortran 77. [Нет, не Fortran 90 или 03, Fortran 77.] Код был бы намного чище, если бы я мог передавать указатели, сгенерированные на C обратно к Fortran, который затем передаст их назад, когда это необходимо для обработки в других функциях C. Как бы то ни было, код C заполнен глобальными переменными, которые не должны быть глобальными и в противном случае находятся на грани становления неструктурированным беспорядком. Итак, есть ли достаточно надежные способы передать непрозрачный указатель между C и Fortran?Непрозрачные указатели в F77
ответ
Вы можете сделать это с (нестандартным) Cray расширения указателя:
Если вы находитесь на 32-битной платформе, подумайте о том, чтобы указать указатели на целые числа и передать эти целые числа в код Fortran. Когда Fortran передает их обратно, верните целое обратно в указатель, перекрестие и используйте.
Из того, что я помню (от 25 лет назад), Fortran 77 имеет тенденцию передавать все на C по указателю в любом случае - и символьные строки передаются с длиной, а массивы передаются с их размерами.
Если вы находитесь на 64-битной платформе, вам придется решить, содержит ли компилятор Fortran 77 любые 8-байтовые целые числа (INTEGER * 8?) - мое подозрение в том, что оно не будет (в основном подтверждается просмотром GNU documentation, если вы использовали Fortran 2003, вы бы были в лучшей форме, похоже). Если это так, тот же трюк работает. Если это не так, вы попадаете в гораздо более унылую территорию.
Вы можете попробовать - против рекомендаций - с помощью объединения двойника и указателя. В C вы должны установить указатель в союзе из вашего указателя кода C, а затем скопировать двойной выход из объединения в Fortran REAL * 8 и до тех пор, пока никто не коснется этого, кроме как скопировать его или передать его назад, может быть, вы будете в порядке, если боги благосклонно одобряют ваши усилия. Скорее всего, все это взорвется - у такого союза есть невероятная способность обнаруживать, когда клиент будет очень раздражен, если что-то не работает, а затем начнет взрываться в нужный момент - частично через демоверсию , или через пятнадцать минут после выхода программы в эфир.
Альтернативой рассмотрению (все еще с зажженными зубами) является объединение 64-разрядного указателя и массив из двух 32-разрядных целых чисел, а затем требуется, чтобы код Fortran передавал массив из двух целых чисел, когда вам нужно верните (64-разрядный) указатель. Очевидно, что массив из одного целого (ы) будет работать с 32-битным кодом; может просто потребовать, чтобы вызывающий код передавал массив из двух целых чисел во всех случаях, обнуляя неиспользуемое целочисленное значение в 32-битном случае указателя? Это дает вам передовую миграцию.
Там нет стандартного взаимодействия между C и Fortran 77, так что это будет зависеть от вашего Fortran реализации. Если вы сообщите нам, какой из них вы используете, вы, скорее всего, получите полезные советы. – Pillsy
Пилюли: в основном GCC. –