-1

私は 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

したがって、関数に渡された後は文字化けしますが、サブルーチンでは問題ありません。私の質問は、なぜこれが起こっているのですか? どうすれば解決できますか?

4

1 に答える 1

1

ISO C バインディングを使用することをお勧めします。これにより、C と Fortran の間で変数を渡すことが Fortran 言語標準の一部になります。これには gcc/gfortran 4.3 以降が必要です。g95 バージョンについてはわかりません。ただし、C への引数として形状引き継ぎ配列はサポートされていません。想定形状配列は高レベルであり、配列だけでなくサイズに関する情報も含まれており、それらを C に渡すには、おそらく特定の Fortran コンパイラの内部構造を理解する必要があります。

于 2012-06-21T07:05:20.137 に答える