이 순서를 변경하는 것은 예상 된 후에 발생 중요하고 나쁜 일이다 COMMON
블록의 변수의 순서. 공통 블록이 사용되는 모든 곳에서 동일해야하며 은을 C++ 프로그램에 포함합니다. 중요하지 않은 것은 변수에 주어진 이름입니다. 예 :
double precision a, b
common /block1/ a, b
을 그리고 또 다른 서브 루틴에서 당신은 할 수있다 : 하나 개의 서브 루틴에 당신은 할 수
double precision c, d
common /block1/ c, d
여전히 a
및 c
을 동일한 메모리 위치를 공유 할 것입니다. b
및 d
에도 동일하게 적용됩니다. 이것은 혼란을 야기 할 수 있으며 통상적 인 실행은 변수 공통 블록 선언과 공통 블록 선언을 모두 사용자가 수행 한 특정 공통 블록을 사용하는 모든 서브 루틴에 의해 include
-d 파일에 저장하는 것입니다. 이제 모든 공통 블록에서 무언가를 변경하면 모든 서브 루틴이 변경된 것을 볼 것이며 모든 것이 예상대로 작동합니다.
문제는 변경된 공통 블록에 대응시키기 위해 해당 C 구조를 변경해야한다는 것입니다. 예 :
이
struct common_block1
{
double a;
double b;
};
extern struct common_block1 block1_;
(참고 : 오래된 포트란 컴파일러 bind(C)
속성 넣어를 지원하지 않는 내 보낸 각 식별자의 끝에서 밑줄 C/C에 있도록 ++ 당신이 가진 것
double precision a, b
common /block1/ a, b
는로 C에 해당 참조하는 block1
) block1_
로 당신에게 일반적인 블록을 변경하는 경우 :
integer a
double precision b, c
common /block1/ a, b, c
당신은 또한에 C 구조를 변경해야합니다 :
struct common_block1
{
int a;
double b;
double c;
};
모든 것을 C와 포트란 컴파일러가 같은 메모리 정렬 규칙을 사용하여 모두 주어진. 정렬은 대개 컴파일러 옵션 (C/C++/Fortran) 및 유형 속성 (C/C++)을 사용하여 제어 할 수 있습니다. ISO_C_BINDING
사용 Fortran 모듈은 Fortran과 C에서 동일한 저장 공간 크기를 가진 유형을 사용하도록 보장 할 수 있습니다. 가장 큰 객체 (예 : 어레이, (DOUBLE) COMPLEX
개 변수, DOUBLE PRECISION
개 변수 등)를 공통 블록의 시작 부분에 넣고, 그 뒤에는 작은 물체 등이 뒤 따른다.
감사합니다. 그러나 나는 코드를 변경하는 것이 가장 간단한 해결책이라는 것을 확신하지 못합니다. 그 이유는 대부분 fortran 77로 작성된 거대한 코드이기 때문입니다. – user1453767