私は fortran にまったく慣れていません。また、fortran に組み込まれた lib を使用しています。lib には多くの TYPE 配列があります。次の方法を使用して、ac プログラムを介して lib の TYPE 配列に値を割り当てようとします。私は、sqliteデータベースからc prgのac構造配列に値を取得するc-fortranインターフェースを構築しました。次に、この構造配列をfortranサブルーチンに渡し、そこで派生型として宣言し、宣言されたTYPE変数の定義と一致します次に、渡された配列の値を lib で宣言されている実際の TYPE 配列にコピーし、それを fortran 関数に渡します。
何が起こっているのかというと、配列内の値が c から fortran サブルーチンに正常に渡されます。それらを出力して fortran サブルーチンでチェックしますが、配列がサブルーチンから関数に渡されると値が文字化けします。配列を想定された形状の配列として渡しています。関数はモジュール内で宣言されているため、サブルーチンの呼び出しにはインターフェイスは必要ないと思いました。
私は何が起こっているのか正確には理解していません.TYPE宣言でシーケンスを使用してみました。g95 、gcc 4.0.3 コンパイラを使用しています。配列内のすべての値は REAL(KIND =8) 型であり、c プログラムで同等のものは double です。
TYPE(something)、TYPE(Something2) が宣言されているライブラリを考えてみましょう。lib を fortran サブルーチンのモジュールとしてインポートします。
仮定しましょう
TYPE(something_lib) is
REAL(kind =8) ::A
REAL(kind=8) ::B
END TYPE
ライブラリで
TYPE(SOMETHING2_lib) !this is also declare in the lib
!I have a C program in which
! in which
/////////////////////////////////////////////// ///////////////////////////////////////
// C program
struct SomethingC
{
double a
double b
} ;
struct SomethingC x[2]
struct something2C s[2] // something similar to the first struct
//i fill the values in x ,s from database in proper format.(doubles).
//i call the fortran subroutine in the c program
A_(x,s); //call to fortran subroutine
/////////////////////////////////////////////// /////////////////////////////////////// // fortan サブルーチン
SUBROUTINE A (x,s)
USE Lib_module ! this LIB_Module also contains the function func
TYPE G
REAL(kind =8) ! this is defined similar to TYPE something(in lib) by me
REAL(kind =8)
END TYPE G
TYPE G2
similar to TYPE Something2 in lib
END TYPE G2
TYPE(something_lib) :: D(2) !derived type declared in lib
TYPE(Something2_lib)::E(2) ! derived type declared in lib
TYPE(G)::x(2)
TYPE(G2)::s(2)
! x, s are struct arrays from c which are now declared in the fortran function
copy code for
copying values from
x to D
s to E
print all values of
D
Print all values of
E
!this prints the values correct as expected for both x,d
func(D,E) ! this function is defined in the lib . The function is in the
! LIB_module
! so no interface will be required (i think)
! IN the Function
FUNCTION func(D,E) (while debugging)
TYPE(something_lib) :: INTENT (IN) D(:)
TYPE (something2_lib)::INTENT (IN) E(:)
when i try to print values of D , E in the
function i get garbled values like
1180333333
2.33419537006E-313
!when out of the function and back in the subroutine i.e after the call(while debugging)
! if I print the values of D,E here they print ok
END SUBROUTINE
したがって、関数に渡された後は文字化けしますが、サブルーチンでは問題ありません。私の質問は、なぜこれが起こっているのですか? どうすれば解決できますか?