2013-08-09 2 views
1

C++에서는 S의 배열을 할당합니다. Fortran에서이 배열의 요소에 액세스하려고합니다. 어떻게해야합니까?Fortran에서 C++ 구조체의 배열에 액세스 하시겠습니까?

C++ :

struct S {double a; double b;}; 
S *arrayOfS; 
arrayOfS = (S *)new S[123]; // allocate 

포트란 2003

USE ISO_C_Binding 
TYPE, BIND(C) :: SFortran 
REAL(c_double) :: a,b 
END TYPE SFortran 

S 및 SFortran 이제 상호 운용이 가능해야하지만, 나는 또한 C++에서 선언 된 배열의 요소에 액세스 할 수있는 방법이 필요합니다. Fortran에서 SC (5) % a를 C++의 arrayOfS [4] .a에 대응시키고 싶습니다. 이 액세스 권한을 가진 Fortran 어레이 SC에 적절한 값을 선언하고 설정하려면 어떻게합니까?

+0

C++에서'new'의 리턴 값을 캐스트 할 필요가 없습니다. 솔직히 짜증나는 동안 이니셜 라이저에는 선언문을 넣는 것이 관례입니다 :'S * arrayOfS = new S [123];' – Casey

+1

캐스트는 명확하게하기위한 것입니다. 같은 줄과 별도의 줄은 "거룩한 전쟁"문제입니다. 그러나 이것은 프로덕션 코드가 아닙니다. 질문을 명확하게하는 간단한 예입니다. – Woody20

답변

3

사용자 수 :

1)의 적절한 배열 인수를 포트란 BIND (C) 프로 시저 C++ 어레이를 통과한다. 당신은 또한에 걸쳐 배열의 크기를 전달하고 배열 인수 명시 적 모양을 할 수 있습니다이 방법

SUBROUTINE proc(array) BIND(C, NAME='proc') 
    ... 
    TYPE(SFortran) :: array(*) 

.

b) C++ 측에서 extern "C"전역으로 배열 포인터를 가져온 다음 BIND (C)와 Fortran 모듈 변수를 통해 상호 운용합니다.

MODULE some_module 
    USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_F_POINTER 
    ... 
    TYPE(C_PTR), BIND(C, NAME='arrayOfS') :: array_ptr 
    ... 
    ! In a procedure in the module... 
    TYPE(SFortran), POINTER :: array(:) 
    CALL C_F_POINTER(array_ptr, array, [123]) 

다시는 C_F_POINTER의 참조를 하드 코딩 피하기 위해 별도로 사용할 수있는 배열의 크기로 적합 할 수도 있습니다.

귀하의 요구 사항에 가장 적합한 접근 방법은 무엇입니까?

+0

인텔 포트란 컴파일러 XE 12.1.3.300을 사용하면 "정의되지 않은 외부 기호 c_f_pointer_set_scalar"링크 오류가 발생합니다. 이 오류를 일으키는 소스 행은 "CALL C_F_POINTER (scPtr, sc, 1)"입니다. 여기서 scPtr은 array_ptr에 해당하고 sc는 'array'에 해당합니다. Intel 설명서 나 Google을 통해 c_f_pointer_set_scalar에 대한 참조를 찾을 수 없습니다. 어떤 제안? – Woody20

+1

이는 링크 단계에서 인텔 포트란 런타임 라이브러리 중 하나를 포함하지 않았다는 것을 의미합니다. Windows에서이 프로시 저는 ifmodintr.lib에 정의됩니다. – IanH

+0

바로 위에! 링크는 IVF 11.1.065의 라이브러리를 사용하고있었습니다. Composer XE 2011 SP1 \ Compiler \ lib \ ia32로 변경했으며 링크 오류가 사라졌습니다. – Woody20

관련 문제