2016-11-19 1 views

답변

1

먼저 바이트 수준에서 작동하는 기능이 무엇인지 명확하지 않습니다. Fortran 문자를 사용합니까? 또는 1 바이트 정수입니까? 그들은 Fortran에서 다른 짐승입니다.

함수의 서명에 대해 거짓말을하고 배열을 그대로 전달할 수 있습니다. 작업을 수행 할 가능성이 있으며 엄격하게 표준을 따르지는 않습니다.

Transfer()은 비슷한 목적을위한 가장 현대적인 도구이지만 실제로는 임시 변수가 포함될 수 있습니다.

배열의 크기가 고정되어있는 경우 (이 할당 가능하지 않거나 포인터 나 더미 인수)는 C.

에서 union

매우 유사 equivalence을 사용할 수 있습니다하지만이 허용되는 것에 대해주의해야합니다, 이것은 악명 높은 dodgy 지역입니다. C 조 조합 규칙조차도 C++ 규칙과 다릅니다. Fortran 동등성에는 자체 규칙이 있으며 더 엄격합니다. 타입 페닝은 허용되지 않지만, 야생에서는 많은 코드가 그것을합니다.

C 포인터로 트릭을하고 다른 유형의 다른 포인터에서 동일한 배열을 가리키는 것은 분명히 표준을 따르지 않으며 어떤 경우에는 예상 된 결과를, 다른 경우에는 잘못된 결과를 줄 수 있습니다 (C 및 C++).

+0

Fortran 문자를 사용합니다. –

+0

MAP 및 UNION도 사용할 수 있습니다. 이는 dec 확장이지만 fortran Character에서 작동하는 것이 어떤 모양인지 이해하지 못합니다. BYTE 또는 INTEGER * 1 이해합니다 ... 또는 문자 및 대문자. – Holmz

1

A "NO_COPY"방법 ...하지만 감속 확장에 의존한다 : 하나는 감속 확장에 액세스 할 수없는 경우

USE ISO_C_BINDING 
IMPLICIT NONE 
UNION 
    MAP 
    REAL(KIND=C_DOUBLE) , DIMENSION(N) :: R8_Data 
    END MAP 
    MAP 
    BTYE     , DIMENSION(N*8) :: B_Data 
    END MAP 
    MAP 
    CHARACTER(LEN=1)  , DIMENSION(N*8) :: C_Data 
    END MAP 
    MAP 
    INTEGER(KIND=C_Int16_T), DIMENSION(N*4) :: I2_Data 
    END MAP 
    MAP 
    INTEGER(KIND=C_Int32_T), DIMENSION(N*2) :: I4_Data 
    END MAP 
END UNION 

@Valdimir 등가도 작동합니다.

MAP 및 UNION DEC 확장 프로그램에 추가 할 gfortran으로 예정된 업그레이드가 있으므로, 시간이 지나면 거기에도있을 것입니다. 차이의 내 감사 돌아올 때

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56226

... 하나는 구조의 내부에 UNION/MAP를 사용할 수 있습니다. 구조/TYPE 외부에서는 등가성이 모두 필요합니다.

그래서 블라디미르으로

REAL(KIND=C_DOUBLE) , DIMENSION(N) :: R8_Data 
BTYE     , DIMENSION(N*8) :: B_Data 
CHARACTER(LEN=1)  , DIMENSION(N*8) :: C_Data 
INTEGER(KIND=C_Int16_T), DIMENSION(N*4) :: I2_Data 
INTEGER(KIND=C_Int32_T), DIMENSION(N*2) :: I4_Data 

EQUIVALENCE(R8_Data, I4_Data) 

하나의 특정 문제가되지 않는 한 그것이 가치보다 거의 더 위험 ...이 또한 "카피"입니다 언급했다.

+0

이 조합을 사용하여 유형 펀칭에 사용할 수 있는지 여부는 문제입니다. C++에서는 허용되지 않습니다. –

+0

이 작동하지만 바이트 연산이 있으면 복식이 손상됩니다. 나는 왜 OP가 그것을하고 싶어하는지 모르겠다. 나는> 1M 라인의 소스를 가지고 있으며, 이것이 기념비적 인 일이 아니라면 모든 것을 가져갈 것입니다. – Holmz

+0

작동 및 작동이 보장되는 사양은 두 가지입니다. 간단한 테스트로 인해 오해의 소지가있을 수 있으며 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30475 또는 https://gcc.gnu.org/bugzilla/show_bug.cgi에서 예기치 않게 문제가 발생할 수 있습니다. ?id = 71892 GCC는 최적화를 위해 정의되지 않은 동작을 사용하는 것으로 특히 유명합니다.하지만 인텔은 더 보수적이라고 생각합니다. –