쿼리 한 지 약 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 배열이 효과가있었습니다.
Fortran을 C로 변환하여이 문제를 처리하는 항공 우주 설비에 대해 알고 있습니다. Fortran은 Microsoft의 호환 가능한 컴파일러 지원 없이는 유지하기가 어렵습니다. –
코드를 다시 작성할 수 있다는 것을 의미합니다 ... –
또는 새 컴파일러가 만족할 수 있도록 오류를 수정하십시오. 또는 이전 컴파일러를 사용하십시오. –