簡體   English   中英

混合編程Fortran和C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM