2010-06-14 5 views
0

저는 Fortran을 처음 사용하고 간단한 일을하고 있습니다. 그리고 새로운 프로그래머로서 일반적으로 어떻게 작동하는지 정확하게 알지 못하기 때문에 내 설명이나 표기법이 최선이 아니라면 실례합니다. .F 파일 맨 위에 공통 선언이 있습니다. 나에게 그것을 설명하는 사람은 C로 구조체를 생각하고, 그것들이 글로벌하다는 것을 말했습니다. 또한 같은 .F 파일에서 어떤 유형으로 선언했는지.Fortran의 일반적인 블록 사용

COMMON SOMEVAR 

INTEGER*2 SOMEVAR 

내가 실제로 다른 파일에 사용되는 볼 때 다음, 그들은 지역 변수 (예 : SOMEVAR_LOCAL)과 상태에 따라 선언, 그들은 SOMEVAR_LOCAL = 1 또는 0

을 설정 : 그래서 같은 것이 있어요

가 그런 말을 할 줄 아래로 나중에 다른 조건이 무엇인가

IF (SOMEVAR_LOCAL. eq. 1) 
SOMEVAR(PARAM) = 1; 

같은 (이 포트란 적절하지 않은 경우 다시 나는 사과,하지만 난 지금 코드에 액세스 할 수 없습니다). 따라서 SOMEVAR이라는 변수와 같은 "구조체"가 있습니다.이 변수는 길이 (2 바이트의 데이터?)이고, 플래그로 사용되는 로컬 변수가 있으므로 나중에 전역 변수 구조체 SOMEVAR은 그 값으로 설정 될 수 있습니다. 그러나 (PARAM)이 있기 때문에 특정 인스턴스의 배열과 비슷합니까? 감사. 내 나쁜 설명을 유감스럽게 생각하지만, 바라건대 내가 묻고있는 것을 이해할 것이다.

답변

1

첫 번째 선언에는 2 바이트의 스칼라 정수로 SOMEVAR이 있습니다. 사용법에 따라 SOMEVAR에는 배열을 기반으로 색인이 생성됩니다. 이것은 "sequence association"을 통해 Fortran에서 수행 할 수 있지만 실용적이지 못합니다. 한 파일에서 SOMEVAR을 INTEGER * 2로 선언 할 수 있으며 두 바이트가이 스칼라에 할당됩니다. 다른 파일에서는 INTEGER * 1 SOMEVAR (2)로 선언 할 수 있으며 2 바이트가 예약되어 있습니다. 이번에는 각각 1 바이트의 두 요소로 이루어진 배열을 예약합니다. 두 파일에서 같은 공통 블록을 사용하면이 두 변수가 바이트 - 시퀀스 연관별로 겹칠 수 있습니다. 몇 년 전, 메모리가 매우 작 으면 프로그래머는 다른 서브 루틴이 다른 시간에 변수를 사용하고 있다는 것을 알고 메모리 사용량을 줄이기 위해이를 수행했습니다. 오늘 이렇게하는 이유는 매우 제한되어 있습니다. 혼동을 일으키기 쉽기 때문에 대개는 안됩니다.

EQUIVALENCE 문과 시퀀스 연관을 설정할 수도 있습니다. 다시 말하지만, 가장 피해야합니다. EQUIVALENCE 문이 필요한 "까다로운"일을해야하는 시대의 현대적 대체는 TRANSFER 기능입니다.

2

이미 언급 한 @MSB를 증폭하기 위해서 : COMMON 블록은 컴파일러에게 변수를 메모리에 배치하는 방법을 알려줍니다. 현대 Fortran, 즉 Fortran 90 이상을 처리 할 수있는 컴파일러와 함께 사용할 이유가 거의 없으며이를 피할 수있는 좋은 이유가 있습니다.

그리고 현대적인 Fortran에서는 C 구조체가 사용자 정의 유형으로 수행하는 작업을 대략 수행 할 수 있습니다. TYPE에 대한 설명서를 확인하십시오.

+0

나는 완전히 동의한다. 전역 변수의 경우 새 포트란 프로그램을 사용하면 공통 블록 대신 모듈 변수를 사용하는 것이 좋습니다. 특정 변수는 공통 블록에 배치 할 수 없으며 시퀀스 연결은 구식입니다. 그리고 TYPE은 변수를 구성하는 것보다 훨씬 더 나은 접근 방법이며, C 구조체에 가깝습니다. –

관련 문제