2017-12-05 23 views
0

現在、文字列をFortranライブラリに渡そうとしています。私はこのライブラリの他の関数を動作させましたが、この特定の関数は、関数の引数として渡される文字列を必要とする点でユニークなようです。ctypesを使用してFortranサブルーチンに文字列を渡す

ソースコードを見ると、関数は三つの引数

SUBROUTINE EZVOLLIB(VOLEQI,DBHOB,HTTOT,VOL) 

を必要と引数が定義されています:Pythonで

IMPLICIT NONE 

    CHARACTER*(*) VOLEQI 
    CHARACTER*10 VOLEQ 
    REAL DBHOB,HTTOT,TOPD, VOL(15), MHT 
    INTEGER REGN,ERRFLG 

関数への私の呼び出しは

from ctypes import * 

mylib = cdll.LoadLibrary('/home/bryce/Programming/opencompile/libvollib.so') 

dbhob = c_float(42.2) 
vol = (c_float * 15)() 
voleqi = c_char_p("101DVEW119 ") 

mylib.ezvollib_(voleqi, dbhob, vol) 
のように見えます

これはセグメンテーションフォールトなしで実行されますが、変数012を "満たす"ようではありませんには、15個の浮動小数点値が入ります。

volには、EZVOLLIB関数から返される値を取得する方法はありますか?

+0

15個の浮動小数点値は何ですか? – martineau

+1

*関数は3つの引数を必要とします* ... 'EZVOLLIB(VOLEQI、DBHOB、HTTOT、VOL)' ?? –

答えて

0

ここには多くの類似の質問がありますが、正確なという重複が見つかりません。さまざまな程度の普遍的な正しさと移植性でこれを行うには、いくつかの可能な方法があります。

もっとも正しい方法は、fortran77, iso_c_binding and c stringで説明されているように、現代のFortranからCへの相互運用性を使用することです。これはFortranラッピングコードをさらに記述する必要があります。

さらにFortranを書くことに厳格に反対する人もいますが、これは唯一のポータブルな解決策です。その場合、コンパイラ内のFortran文字列の実際の呼び出し規約を調べる必要があります。通常、文字列長の隠し整数引数がサブルーチンに渡されます。あなたの​​インターフェイスはこれらのコンパイラ固有の呼び出し規約を採用することができますが、インタフェースはコンパイラ固有のものになります。しかし、あなたはすでに特定の名前のmangling ezvollib_に依存しており、コンパイラ固有のものでもあります。ここでは、人々がそれに頼って噛まれた場所の例を見つけることができます。

ハイパフォーマンスマークに記載されているように、問題のサブルーチンには、EZVOLLIB(VOLEQI,DBHOB,HTTOT,VOL)という3つの引数ではなく、4つの引数があります。 mylib.ezvollib_(voleqi, dbhob, vol)のように3つだけ呼び出すのはエラーです。 HTTOT引数がありません。

関連する問題