2015-02-07 7 views
2

loc 함수를 광범위하게 사용하여 배열 주소 (Matlab과 상호 작용할 수있는 API의 일부)를 얻는 Fortran 90 프로젝트가 있습니다.LOC 및 % LOC가 Windows의 서브 루틴에서 작동하지 않습니다.

이 코드는 Intel과 gfortran 모두를 사용하여 Mac 및 Linux에서 컴파일 및 작동하며 잠시 (두 가지 다른 컴파일러 버전에서) 사용합니다.

필자는 Composer XE 2015의 인텔 포트란을 사용하여 Windows를 빌드하려고합니다. 디버거를 단계별로 실행할 때 주 기능의 LOC 호출이 주소를 올바르게 반환하지만 호출 된 서브 루틴 내에서 호출되는 것을 볼 수 있습니다. 아무 것도하지 않으면 - 단지 위치 대신 데이터의 값을 반환합니다.

LOC가 작동하지 않는 이유는 누구입니까? 나는 loc()와 % LOC()를 모두 시도해 보았고 같은 행동을했다. 예를 들어 this function을 참조하십시오. 69 행의 loc은 작동하지만, 116 행의 loc은 데이터의 값을 반환하지 않습니다. REPIDX_0 (X, 1)은이 경우 단지 X를 반환하는 선행 처리 매크로입니다.

어떤 조언이나 조언을 부탁드립니다. 내가 예상 출력을 얻을 12.1.3 ifort와 맥/리눅스에

program testloc 
    implicit none 
    real, pointer :: x 
    integer(8) :: add1, add2 

    allocate(x) 
    x = 2 
    add1 = loc(x) 
    call get_add(x,add2) 
    write(*,*) add1 
    write(*,*) add2 
    deallocate(x) 
contains 
    subroutine get_add(x,add) 
     real, pointer, intent(in) :: x 
     integer(8), intent(out) :: add 
     add = loc(x) 
    end subroutine 
end program 

: ifort와 Windows에서

MatlabAPI_lite robince$ ./a.out 
     140661969926608 
     140661969926608 

를 15.0.1 내가 문제가 얻을 여기

는 최소한의 예입니다 출력 :

c:\code\MatlabAPI_lite>testloc 
     4636400 
       2 
+2

코드를 보여주십시오. 예제는 질문 자체에 * 표시되어야합니다 (주제를 벗어난 이유로 인용). –

+0

이미 코드에서'iso_c_binding'을 사용하고 있습니다. 'type (c_ptr)'과'c_loc()'을 사용하지 않는 이유는 무엇입니까? –

+0

글쎄 내 질문에 대한 내 코드에 대해별로 아니에요 - 나는 그것을 디버깅하고 LOC 값 및 주소가 반환됩니다 문제를 식별했습니다. 그래서 내 질문은 그 일이 일어날 수있는 방법입니다. 나는 몇 년 전이었던 것처럼 세부 사항을 기억하지 못한다. 그러나 c_ptr과 c_loc이 나에게 효과가 없었던 이유가있다. 컴파일러 지원이나 다른 문제가 없다면 rememebr을하지 않는다. 내가 다시 생각해 볼 수 있지만 Windows에서 빌드 된 기존 코드를 얻는 것이 더 쉬울 것이라고 기대하고 있습니다. (이후 Mac 및 Linux에서 수년 동안 안정되었습니다.) – robince

답변

2

이것은 컴파일러 버그로 15.0.3에서 수정되었습니다.

관련 문제