[英]Mixed Programming Fortran and C
我是理論物理學的研究學生,從事宇宙學研究。 在研究過程中,我已經習慣了相當龐大的Fortran代碼庫,並且出於編程需要使用了C。
我已經能夠將兩個程序鏈接到大量的測試文件中,並且它們運行出色。 但是對於他們來說,我一直在使用目標文件來鏈接它們。 但是,當我嘗試通過C運行真正的交易時,請包括對Fortran頭文件的引用。 它們似乎可以相互集成並相互調用,但是Fortran頭文件的格式與C編譯器不兼容,因此,當它跳轉到頭文件時,它開始引發錯誤,無法理解語法。
例如,Fortran頭文件使用real * 8定義了雙變量,因此C讀取它們時會引發錯誤。 文件中的注釋也是如此。
所以,我想問問有什么辦法可以解決這個問題? 即,使fortran格式的頭文件可通過C讀取。
我查看了互聯網,發現了令人困惑的答案,但我不知道該遵循哪個答案。 在這方面的任何幫助將不勝感激:)
抱歉,您很困惑。 什么是Fortran頭文件? 例如,您不能使用C編譯器讀取Fortran包含文件! 兩種語言太不同了。 此外,Fortran包含文件幾乎永遠不會是與C相當的頭文件。
我不知道您使用的是哪種編譯器。 但是,如果您選擇了最新的GCC版本(Gnu編譯器集合),則其中包含的Fortran編譯器可以考慮ISO_C_BINDING功能,這使耦合Fortran-C更加容易。
范例:
MODULE my_fortran
USE iso_c_binding
IMPLICIT NONE
CONTAINS
SUBROUTINE my_subroutine(a,b) BIND(C,name="my_sub")
INTEGER(c_int),INTENT(in),VALUE :: a
REAL(C_DOUBLE),INTENT(out) :: b
...
END SUBROUTINE
END MODULE
例如,名為“ my_sub.h”的C頭文件:
void my_sub(int, double *);
C檔
#include "my_sub.h"
int main(){
double b;
int a=3;
my_sub(a,&b);
...
}
Fortran通常通過引用傳遞其變量(傳遞指針)。 這意味着您必須在調用的C程序中提供地址。
函數結果可以按值傳遞,例如,以下代碼調用稱為“ gamma”的FORTRAN函數:
double x, y;
..................
x = 2.0;
y = gamma_(&x)
確保調用程序中變量的大小與Fortran例程中的大小相同:
float --- REAL (this is typical, but not always the case)
double --- REAL*8
必須在C調用函數的開頭聲明Fortran函數:
extern void read_(int *small, float *medium, double *large);
注意,我們必須將所有變量作為指針傳遞給Fortran。 盡管函數名稱在Fortran中不區分大小寫,但它在C聲明和調用時會得到下划線:
read_(&small, &medium, &large);
Fortran函數接收變量,如下所示:
SUBROUTINE READ(small,medium,large)
INTEGER small
REAL medium
DOUBLE large
這些變量的精確大小取決於您的系統體系結構(32位對64位),因此您需要確認系統中C和Fortran中int,float和double的對應關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.