1

私は周りを見回しましたが、EXC_BAD_ACCESSの問題はたくさんありますが、どれも役に立ちませんでした。

Mountain Lion(OSX 10.8だと思いますか?)とPGI12を使用しています。

CからFortran関数を呼び出すことができないようです。簡略化されたケースを作成しましたが、整数を渡すことができないようです。

私のFortran関数は次のとおりです。

  1 integer function smallFortran(a) result(res) bind(c,name='smallFortran_')
  2 !integer function smallFortran(a) result(res)
  3     
  4     use ISO_C_BINDING
  5     implicit none
  6     
  7     integer(kind=c_int), intent(IN) :: a
  8     !integer, intent(IN) :: a
  9     
 10     print *,'A = ', a
 11     res = a;
 12 
 13 endfunction smallFortran

そして私のC関数は、

int main() {
   int ier=7;
   ier = smallFortran_(8);
}

それを構築します。

matt@pontus:diffFst$ make                                                                                                               
pgcc -c cDoDiffFst.c                                                                                                                    
PGC-W-0267-#warning --  "Unsupported compiler detected" (/usr/include/sys/cdefs.h: 81)                                                  
PGC/x86-64 OSX 12.9-0: compilation completed with warnings                                                                              
pgcc -g -O0 -traceback -o cDoDiffFst cDoDiffFst.o smallFortran.o -lpgf90 -lpghpf2 -lpgf90rtl -lpgftnrtl -lpghpf_rpm

(警告が私の問題の原因ではないことを願っています。PGIユーザーフォーラムは、新しいバージョンのファイルを送信すると言ってこれに応答しますが、まだ返信されていません。PGIがなぜそうする必要があるのか​​わかりません。指定する多くの追加ライブラリ)

デバッガーで実行すると。

matt@pontus:diffFst$ gdb cDoDiffFst                                                                                                     
(gdb) run
Starting program: /Users/matt/aurams/trunk/utils/diffFst/cDoDiffFst 
Reading symbols for shared libraries +............................. done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008
0x0000000100001906 in _smallFortran_ (a=Cannot access memory at address 0x8
) at smallFortran.f90:10
10              print *,'A = ', a
(gdb)

私は完全に迷子になっていますが、なぜintを送信できないのですか?整数に値を割り当てて送信しようとしましたが、サイコロはありません。サブルーチンとして試しましたが、戻り値なしで試しました。何も機能しません。

4

2 に答える 2

5

これは、質問の元のCに一致するようにFortranを作成する方法を示す代替ソリューションです。重要なのはvalue宣言の修飾子です。Fortran ISO Cバインディングを使用すると、Cが引数を渡すさまざまな方法に一致します。ルーチン名のアンダースコアを削除することもできます...これは、のnameキーワードの目的ですbind

呼び出しにアンダースコアがないCコード:

int main() {
   int ier=7;
   ier = smallFortran (8);
}

および対応するFortran:

function smallFortran(a) result(res) bind(c,name='smallFortran')

     use ISO_C_BINDING
     implicit none

     integer(kind=c_int), intent(IN), value :: a
     integer(kind=c_int) :: res

     print *,'A = ', a
     res = a;

 endfunction smallFortran
于 2013-01-03T06:16:34.660 に答える
3

エラーにより、何が問題になっているのかが明確になります。smallFortran_その引数が参照によって渡されることを期待し(Fortranのすべての引数と同様に、ここでは少し速くて緩いことに注意してください)、ポインター8でデータにアクセスしようとしますが、失敗します。修正は簡単です。関数はポインターを期待しているので、次のように指定します。

int main() {
  int ier = 7;
  int arg = 8;
  ier = smallFortran_(&arg);
}

これは、Fortran型が問題のコンパイラーintegerのCに対応していることを前提としています。intそうでなければ作る必要があるかもしれませarglong

于 2013-01-03T01:52:02.940 に答える