2013-10-30 19 views
6

C可変関数を宣言してFortranから呼び出す方法はありますか? 文字列でラベル付けされたベクトル間のドット積を計算するには、この関数を呼び出す必要があります。 私の考えは、引数の変数リストに文字列リテラルが含まれている次のようなものを宣言することでした。変数の変数リストが空の場合、標準のラベルの中から検索を行い、計算を実行します。ユーザーが2つのラベルを指定した場合、私は、これらの二つのベクトルを取得し、そのドット積になるだろう。唯一の問題は、私は私のCライブラリをコンパイルし、Fortranの実行ファイルにリンクできることですC可変関数とFortranの相互運用性

extern "C" void compute_dot_product(double * dot_product, ...) 
{ 
    va_list args; 
    va_start(args, NULL); 
    char * label1 = va_arg(args, char *); 
    if (!label1) 
    { 
     // Do standard label lookup and compute dot product 
    } 
    else 
    { 
     // Compute dot product between the vectors with the specified labels 
     char * label2 = va_arg(args, char *); 
    } 
    va_end(args); 
} 

を、私はランタイムエラーを取得します私は引数の変数リストにアクセスしようとするとき。 私がしようとしていることがあれば、どんな考えができますか? 次に、標準ラベル検索(0引数の場合)と非標準ラベル参照(2引数の場合)を処理する関数の2つの関数に分割する方法が考えられます。私はむしろこの解決策を避けるだろう。

+0

両側でcdeclとして宣言する必要があります。片側がstdcallで、もう片方がcdeclであるため、ランタイムエラーが発生する可能性があります。 – cup

答えて

3

標準準拠(すなわちポータブル)の方法で可変関数を呼び出すことはできません。

C関数の定義を2つのパラメータだけにすることができます(これはもはや可変ではありません - 関数への既存の参照は変更する必要があります)。C関数の2番目のパラメータはポインタ追加のものが渡されていないこと、あるいはポインタの配列(おそらくNULLで終了している)を指していることを示したり、何かを追加したりします。 F201Xでは、この種の関数用のインターフェース本体は、第2引数にOPTIONAL属性を使用することができます。

+0

それは可変的な機能がするものです。参照してください:http://stackoverflow.com/a/19171063/1162141 – technosaurus

+0

@technosaurus私は、コメントまたはリンクされた答えの妥当性は表示されません。 – IanH

+0

variadic関数の "..."は本質的にポインタの配列です(ただし、整数型でも構いません)。リンクは、最初のポインタから始まる正しい型を得るためにこれらのキャストがやや複雑に行われる方法を示しています。ですからあなたの答えは "..." +1の代わりに意味があります。 – technosaurus