2010-11-30 2 views
3

공통 선언을 사용하여 메모리 변수를 "공유"하는 Fortran 77 응용 프로그램이 있습니다. 기억이 고가 였고 이로 인해 어려움을 겪었던 그 날은 뒤로 돌아 왔습니다.Fortran 77에서 C++로 변환

제어되는 장비가 상태 플래그를 설정합니다. 이 플래그는이 Common 변수에 상주합니다.

C++에서 공용 기능을 구현하는 방법에 대한 제안 사항은 무엇입니까?

아마도 모든 공통 변수가 공개 인 클래스 일 수 있습니다. 따라서 해당 클래스를 인스턴스화하는 모든 프로그램은 Common 변수의 내용에 액세스 할 수 있습니다.

포트란을 C 또는 C++로 변환하는 데 필요한 자습서/지침이 있습니까?

감사

모든
+3

25 년 전에 Fortran을 C로 변환하는 방법에 대한 질문에 대한 comp.lang.c의 표준 답변은 "rm -rf * .f는 모든 포트란 프로그램을 디스크 블록을 비우도록 변환 한 다음 –

+1

wrt "제어되는 장비가 상태 플래그를 설정합니다.이 플래그는 이러한 공통 변수에 있습니다.", 전역 변수 만 필요합니까? 아니면 C++ 코드가 실제 사실상 포트란 스타일 공통 블록과 상호 작용할 필요가 있습니까? ? 후자는 컴파일러/링커에 따라 가능합니다. –

+0

일반적인 varaibles는 정말 많은 메모리를 저장하지 않습니다! "장비 제어"에 대해 말하자면 장치 드라이버가 제어 플래그를 고정 된 메모리 영역에 매핑해야하므로 이러한 변수가 일반적이라고 생각합니다. C externs는 기능상으로 동일하지만 링커가 실제 필드 이름을 기반으로 메모리를 매핑하므로 조심해야합니다. 따라서 C 및 Legacy Fortran 모듈을 혼합하는 경우 동일한 순서로 동일한 이름을 정의해야합니다! –

답변

2

첫째, 당신은 포트란 90 개 모듈을 사용하여 일반적인 블록을 제거 할 수 있습니다.

공통 블록을 C++로 직접 변환하려면 전역/정적 변수 전체를 만들거나 이름이없는 네임 스페이스를 사용해야합니다.

그러나 정보 숨김에 위배되며 대부분의 사람들은 무분별한 전역 변수 사용에 대해 조언합니다.

더 일반적으로 Barton-Nackman 서적 Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples을 살펴 보는 것이 좋습니다. 조금 구식이지만, 그렇게 중요하지 않아야합니다. Fortran/절차 적 배경을 가지고 있다고 가정하면 과학 또는 공학 응용 프로그램을위한 C++을 가르칩니다.

+3

이상하게도, 공통 블록은 코드의 일부에서 정보를 숨기는 데 사용되었지만 코드의 일부에서 정보를 숨기는 데 사용되었지만 코드를 포함하는 모듈에 대해서는 전역 적이어야했습니다. – dmckee

1

Alexandros의 대답에 대한 대답은 "natural"음역은 common 블록의 모든 것을 C++ 코드의 클래스 정적으로 포함하는 것입니다. 그 결과는 이 아니고이 좋은 C++ 코드가되지만 리팩토링을 시작할 수있는 공간이됩니다.

즉, 보통 기존의 포트란 백엔드에 C++ 프론트 엔드를 연결하려고 시도하고 다음에 여전히 좋은 생각으로 보이면 번역 프로세스를 시작하십시오.

2

This Fortran to C/C++ Tutorial는 제안 :

 FORTRAN: 
      DOUBLE PRECISION X 
      INTEGER A, B, C 
      COMMON/ABC/ X, A, B, C 

     C: 
      extern struct{ 
       double x; 
       int a, b, c; 
      } abc_; 

     C++: 
     extern "C" { 
      extern struct{ 
       double x; 
       int a, b, c; 
      } abc_; 
     } 

당신은 C는/C++ 파일 사용법 #include와 함께 참조 .H 파일로 통근 구조체를 넣어 정확히 하나 개가 .c 또는 통화 당 파일에서 정확히 무엇을 넣어 .h 파일에 있지만 "extern"단어가 없었습니다.

제 가정은 상대적으로 간결하고 경계선이 이해하기 어렵고 원본과 거의 일대일 대응을 유지하는 방식으로 C++로 변환하려는 것입니다.

0

일반적인 블록은 현대에 저주를 부릅니다.

+0

질문의 요점을 놓쳤을 수 있습니다 ... 그는 공통 블록을 사용하는 코드를 가지고 있으며, 그 구조에 명백한 동등 물이없는 C++로 변환하려고합니다. – dmckee

+0

예. 당신이 옳다고 생각합니다. –

1

나는 내가 코멘트에서 말한 것을 재 포장하고 있다는 것을 알고있다. 그러나 나는 아무도 그것을 가지고 있다고 생각하지 않는다.

"제어되는 장비"라는 문구는 프로그램이 일종의 장치 드라이버이며 해당 장치가 플래그가 특정 메모리 영역에있을 것으로 예상 할 가능성이 높다고 나에게 알립니다. 공통 저장소가 사용되는 이유는 다양한 모듈이이 영역을 직접 액세스하고 업데이트 할 수 있기 때문입니다.이것들을 C extern should으로 번역하면 장치 인터페이스의 설명서를 제대로 읽어야 올바르게 작동하는지 확인할 수 있습니다.

일부 포스터 에서처럼 일반적인 스토킹을 잃는 것은 이러한 상황에서 단순히 작동하지 않습니다. 가장 좋은 방법은 공통 저장소에 대한 모든 업데이트를 처리하고 "get"및 "set"을 사용하여 공통 저장소에 대한 모든 읽기 및 쓰기를 새 클래스로 바꾸는 정적 클래스를 만드는 것입니다.

0

이상하게 보일 수 있지만, bitfield처럼 사용해야하는 장소 일 수 있습니다.

그는 고정 된 메모리 주소에 매핑 된 다양한 제어 레지스터와 상태 플래그가있는 하드웨어를 가지고 있습니다.

올바르게 배치 된 비트 필드 (컴파일러 관련)가있는 구조체 올바른 주소를 가리키는 포인터 유형을 가진이 구조체는 트릭을 수행 할 수 있습니다.

필드 값이 예고없이 변경 될 수 있으므로, 비 휘발성 Qualifer가 필요할 수 있습니다.

질문자가 공통 블록의 레이아웃에 대한 정보 ( )와 그 내부의 데이터 해석을 제공하면 도움이됩니다.