2014-12-16 3 views
0

나는 컴파일 할 수 있어야하는 60-90 년대의 레거시 포트란 코드를 가지고 있습니다.레거시 포트란 코드 컴파일 문제

코드는 더 이상 표준이 아닌 기존 사례를 사용하더라도 작성된대로 작동합니다. Intel Visual Fortran 2011 컴파일러 및 Visual Studio 2008에서 성공적으로 빌드되었습니다. 이제 Visual Studio 2012 및 Intel Visual Fortran 2013을 사용하고 있습니다. 제대로 구축 할 수있는 올바른 옵션을 찾을 수없는 것 같습니다.

큰 문제는 거대한 동등한 배열을 사용하고 배열이나 실제 포인터를 서브 루틴에 전달하는 대신 포인터 등가 배열의 단일 값을 전달하는 것입니다. 어떻게 든 포인터 시퀀스의 단일 값을 전달합니다. 값. 가장 큰 에러는

    실제 인자의 유형 가인 유형 상이
  • 실제 인수가 스칼라 인 경우 실제 인수가 입력 문자 또는 원소이다 않는 더미 인자 라한다 모양, 포인터 또는 다형성이 가정되지 않은 배열의 배열

다시 한번. 코드가 내장 된 것처럼 작동한다는 것을 알고 있습니다. 도움이되는 제안이 있으면 감사하겠습니다.

+0

Fortran을 C로 변환하여이 문제를 처리하는 항공 우주 설비에 대해 알고 있습니다. Fortran은 Microsoft의 호환 가능한 컴파일러 지원 없이는 유지하기가 어렵습니다. –

+0

코드를 다시 작성할 수 있다는 것을 의미합니다 ... –

+0

또는 새 컴파일러가 만족할 수 있도록 오류를 수정하십시오. 또는 이전 컴파일러를 사용하십시오. –

답변

0

내 특정 문제에 대한 대답은 프로젝트 속성 -> 진단 -> 언어 사용 경고 -> 루틴 인터페이스 확인 및 "아니오"로 설정하는 것입니다.

0

쿼리 한 지 약 1 년이지만, 문제를 해결할 수 있었던 fortran 포인터와 동적 메모리 할당과 관련된 문제가 발생했습니다.

레거시 코드의 메모리 주소 위치 값은 INTEGER * 4 데이터 유형과 같지만 새 운영 체제에서는 INTEGER * 8이었습니다. 동적 메모리 할당이 작동하는 방식은 더미 배열 'HEAP (ii)'의 위치가 "malloc"에 의해 주어진 절대 주소가 참조 될 수있는 기준점으로 사용된다는 것입니다. HEAP 기본 주소 (즉, LOC (HEAP (1))가 11111이고 "malloc"에 의해 해제 된 절대 주소가 메모리 주소 1731111111111111에 있고 HEAP가 정수 * 4 (또는 동일하게 실제 * 4)로 할당 된 경우, "malloc"에 의해 해제 된 첫 번째 위치는 HEAP ((1731111111111111-11111)/4 + 1)와 동일합니다. 이러한 미친 듯 큰 인덱스 값에서 iaddress를 사용하는 서브 루틴 호출에서 HEAP (iaddress)를 인수로 사용하면 . HEAP는 호출 루틴으로 배열 인수로서 사용

지역을 문제 포함 :

POINT1) "의 malloc"에 의해 주어진 해제 된 메모리의 절대 어드레스의 값은, 저장되었다. 저장된 계산 데이터 값 바로 뒤에있는 HEAP()의 위치. 이 주소 값은 나중에 메모리를 비울 때 사용할 수 있도록 저장되었습니다. 이 INTEGER * 8 주소가 새 운영 체제/컴파일러에 대한 INTEGER * 8 주소록 경계를 넘어서 저장된 경우이 저장된 INTEGER * 8 메모리 주소 값에 액세스하려고하면 "HEXADECIMALS OF DOOM"스타일 충돌이 발생합니다 INTEGER * 4 HEAP 인덱스를 기반으로합니다. 메모리 주소의이 저장된 값에 대한 저장 지점 앞에 1 개의 INTEGER * 4 위치의 여분의 패딩을 포함 시키면이를 피할 수 있습니다. 이전 데이터 세그먼트에 저장된 데이터 값의 수가 홀수 xxxx * 4 데이터 값이었을 때마다 필요했습니다.저장된 메모리 주소 값은 필요할 때 INTEGER * 4 HEAP()에서 INTEGER * 8 LONGHEAP()까지 그리고 longheap()에서 약 1 인 색인 값을 사용하여 INTEGER * 8 주소로 읽을 수 있습니다/2 HEAP()에서 배열 색인으로 사용되는 광기가 긴 색인 값의 2 (1에서 시작하는 배열의 포트란 색인화를 설명하기 위해 -1과 +1이 사용됨)

POINT2. 메모리 주소 위치를 저장하는 모든 변수 추적해야하고 INTEGER * 4에서 INTEGER * 8로 전환해야합니다. 이것은 함수를 호출하는 함수를 호출하는 서브 루틴에서는 까다로운 작업이었습니다 ... 찾기위한 한 가지 구조는 메모리 위치 스와핑 (TEMP = Iaddress)입니다. Iaddress = Jaddress; Jaddress = TEMP : 스왑에서 TEMP가 INTEGER * 8인지 확인하십시오. 다른 메모리 주소 산술 및 임시 저장 변수로 인해 문제가 발생할 수 있습니다. 또한이 스위치를 만든 후에는 새 INTEGER * 8 변수가 서브 루틴 및 함수 호출에서 인수로 사용되었는지 확인해야합니다. 그렇다면 호출 된 함수/서브 루틴을 적절히 수정하고 동일한 함수/서브 루틴에 대한 다른 모든 호출에서 데이터 유형이 일관성이 있는지 확인해야합니다.

모든 것을 * 8로 바꾸고 인덱싱 산술과 관련된 문을 검사하는 것이 가능했을 수도 있지만 논리적 * 8 값의 새로운 배열과 이전 정수가 포함 된 멋진 항목 * 2 배열이 효과가있었습니다.

+0

정수의 기본 종류 값을 변경할 수 있어야했기 때문에 도움이되었습니다. –