2012-06-20 2 views
-1

저는 Fortran에 매우 익숙합니다. Fortran에 내장 된 lib를 사용하고 있으며, lib에는 많은 TYPE 배열이 있습니다. 다음 방법을 사용하여 c 프로그램을 통해 lib의 TYPE 배열에 값을 할당하려고합니다. 나는 c-fortran 인터페이스를 구축했다. 여기서 sqlite 데이터베이스의 값을 c prg의 ac 구조 배열로 가져온다.이 구조체 배열을 fortran 서브 루틴으로 전달한다. 파생 된 타입으로 선언한다. TYPE 변수의 정의와 일치한다. lib에 선언했다. 그런 다음 전달 된 배열의 값을 lib에 선언 된 실제 TYPE 배열로 복사하고이를 fortran 함수에 전달한다.파생 된 데이터 형식이 서브 루틴에서 fortran의 함수로 가정 된 모양 배열을 전달합니다.

배열의 값이 c에서 fortran 서브 루틴으로 전달되면 포트란 서브 루틴에서 값을 확인하기 위해 출력하지만 배열이 서브 루틴에서 함수로 전달 될 때 값이 왜곡됩니다. 배열을 가정 된 배열로 전달하고 있습니다. 함수는 모듈 내에서 선언되므로 호출 서브 루틴이 인터페이스를 필요로하지 않을 것이라고 생각했습니다.

정확히 무슨 일이 일어나고 있는지 이해하지 못하고 있습니다. 또한 TYPE 선언에서 시퀀스를 사용해 보았습니다. g95, gcc 4.0.3 컴플 라이터를 사용하고 있습니다. 배열의 모든 값은 REAL (KIND = 8) 유형이며 c 프로그램의 해당 값은 double입니다.

TYPE (something), TYPE (Something2)이 선언 된 lib를 고려하십시오. lib를 포트란 서브 루틴의 모듈로 임포트합니다.

는 LIB

TYPE(SOMETHING2_lib) !this is also declare in the lib 


      !I have a C program in which 

      ! in which 

에서

  TYPE(something_lib) is 

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

      END TYPE 

가정 수 있습니다 /////////////////////////// /////////////////////////////////////////////////////////////////// //////////////

 // 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 

하지만이 서브 루틴에서 확인합니다. 제 궁금한 점이 왜 이런 일입니까? 어떻게 해결할 수 있습니까?

+2

우리가하는 일을 정확히 이해하지 못하고 있습니다. 코드에서 문제를 보는 것은 매우 어렵습니다. –

+1

이 단계를 진행하는 생산적인 방법은 코드, 관련 부분이 포함 된 코드의 잘린 버전 또는 코드의 스켈 레탈/스키 매틱 버전을 제공하는 것입니다. 물론, 실행시 생성되는 모든 오류. – MarkWayne

+0

@High Performance 뼈대를 제공하기 위해 질문을 편집 할 것입니다. – codefor

답변

1

C & 포트란 언어 표준의 일부로 변수를 전달하는 ISO C 바인딩을 사용하는 것이 좋습니다. gcc/gfortran 4.3 이상이 필요합니다. G95 버전에 대해서는 잘 모르겠습니다. 그러나 C에 대한 인수로 가정 된 배열은 지원되지 않습니다. 추정 된 형태의 배열은 배열뿐 아니라 크기에 관한 정보를 포함하는 고수준의 배열이며 C에 전달하면 아마도 특정 Fortran 컴파일러의 내부를 이해해야 할 것입니다.

+0

hI 답장을 보내 주셔서 감사합니다.하지만 C에 가정 된 배열을 전달하려고하지 않습니다. 나는 포트란 서브 루틴에서 포트란 함수로 그것을 전달하려고하는데, 함수는 모듈을 포함하고있다. – codefor

+0

그럼 C 코드가 어떻게해야할까요? –

관련 문제