将派生数据类型假定为从子例程到fortran 90中的函数的形状数组

时间:2012-06-20 20:39:52

标签: arrays fortran derived-types

我对fortran很新。我使用了fortran内置的lib,lib有很多TYPE数组。 我尝试使用以下方法通过c程序将值分配给lib中的TYPE数组。  我已经构建了一个c-fortran接口,我从sqlite数据库中获取值到c prg中的ac结构数组。然后将这个结构数组传递给fortran子例程,我将其声明为派生类型,匹配声明的TYPE变量的定义在lib中。然后我将传递的数组中的值复制到lib中声明的实际TYPE数组,并将其传递给fortran函数。

正在发生的是数组中的值从c传递到fortran子例程,我打印它们以检查它们在fortran子例程中,但是当数组从子例程传递给函数时,值会变得混乱。我将数组作为假定的形状数组传递。该函数在模块内声明,因此我认为调用子例程不需要接口。

我并不完全理解发生了什么,我也尝试使用TYPE声明中的序列。 我正在使用g95,gcc 4.0.3 complilers。 数组中的所有值都是REAL(KIND = 8)类型,c程序中的等价值是double。

考虑一个在其中声明了TYPE(某物),TYPE(Something2)的lib。我将lib作为fortran子例程中的模块导入。

让我们假设

           TYPE(something_lib) is

              REAL(kind =8) ::A 
              REAL(kind=8)  ::B

            END TYPE
lib中的

 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

因此,他们在传递函数后会出现乱码,但是可以接受 子程序。 我的问题是为什么会发生这种情况? 我怎么解决呢?

1 个答案:

答案 0 :(得分:1)

我建议使用ISO C Binding,它可以在C& C之间传递变量。 Fortran部分Fortran语言标准。这将需要gcc / gfortran 4.3或更高版本;我不确定g95版本。但是,不支持假定形状的数组作为C的参数。假定形状的数组是高级的,不仅包含数组,而且包含有关大小的信息,并将它们传递给C可能需要了解特定Fortran编译器的内部结构。