2012-03-13 17 views
11

FortranのC相互運用性メカニズム(Fortran 2003で導入され、gfortranとifortの新しいバージョンで実装されています)を使用してFortranからC関数を呼び出すコードを書いています。私は明確ではないよiso_c_bindingを使用したFortran-Cブリッジでの文字列の配列

int use_array(int n, char * array[]){ 
    int i; 
    for(i=0; i<n; i++){ 
     printf("Item %d = %s\n",i,array[i]); 
    } 
    return n; 
} 

This answerは私が必要なものはほとんどですが、私は非常に私はこのようになりますC関数のためのFortranで使用すべきかインタフェース宣言のまわりで私の頭を取得することはできません宣言は、Fortranエンドのインターフェイスのためにどうあるべきか:私はあまりにもNULL終端の問題に対処する必要がありますことを知っています

interface 
    function use_array(n, x) bind(C) 
     use iso_c_binding 
     integer (c_int) use_array 
     integer (c_int), value :: n 
     character(c_char) WHAT_SHOULD_GO_HERE? :: x 
    end function use_array 
end interface 

+0

感謝を。彼らのようなユーザーは、毎日の礼儀で人々が質問を読めなくするのを阻止しようとしています。 – JoeZuntz

答えて

8

私たちのやり方は、C_PTR配列を使用して文字列を指すことです。たとえば:

DO ns = 1, numStrings 
    stringArray(ns) = "My String"//C_NULL_CHAR 
    stringPtrs(ns) = C_LOC(stringArray(ns)) 
END DO 

とC関数にstringPtrsを渡す:

CHARACTER(LEN=100), DIMENSION(numStrings), TARGET :: stringArray 
TYPE(C_PTR), DIMENSION(numStrings) :: stringPtrs 

は、我々は彼らのようなヌルで終了する必要思い出し、 stringArrayで私たちの文字列を設定します。

C関数は、インタフェースを持っている:親切に私はそれの最後に「ありがとう」を除去することにより、少ない丁寧に見えるように、この質問を編集するためのユーザーfrancescalusため

void stringFunc(int *numStrings, char **stringArray) { 
    int i; 
    for(i=0;i<*numStrings;++i) { 
     printf("%s\n",stringArray[i]); 
    } 
} 
+0

すばらしい、すばらしい、すばらしい返信に感謝します。完全性を保つために、インタフェースの型は "type(c_ptr)、dimension(numStrings)" – JoeZuntz

+0

であり、実際にはC関数のインタフェースを提供していないので、私たちは 'external'として扱います。手元にあるインターフェイスブロックの簡単な例はありませんでした。 – tpg2114

+1

これは、標準のFortran 2003(15.2.1項を参照)または2008(15.3.2項を参照)ではありません。**型が文字の場合、長さ型パラメータは値が1の場合にのみ相互運用可能です。 gfortranはこれを(*文字(len = ...)*とC_LOCを使って)エラーとして通知します。この問題についてはGCCのbugzillaの[discussion](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36759)もあります。 –

関連する問題