2016-10-11 4 views
0

변수와 매핑되는 Cray 포인터를 Fortran 서브 루틴으로 전달합니다. 다음과 같이 설명되어 있습니다 :Cray 포인터를 서브 루틴으로 전달하는 방법은 무엇입니까?

program test 
    integer val 
    pointer (ptr_val, val) 

    print *, "1:", loc(val) 
    print *, "1:", ptr_val 

    CALL DPMALLOC(ptr_val, sizeof(val)) 

    print *, "2:", loc(val) 
    print *, "2:", ptr_val 

    val = 999 
    call foo(val) 

end program test 

subroutine foo(val) 
    integer val 
    print *, "3:",val 
    print *, "3:", loc(val) 
    print *, "3:", ptr_val 
    call DPMALLOC(ptr_val, sizeof(val)) 
    print *, "4:", ptr_val 
    print *, "4:", loc(val) 
    return 
end subroutine foo 
void dpmalloc_(void **data, int *size){ 
    *data =(void *) malloc(*size); 
    printf("malloc\n"); 
} 

출력은 :

1:     0 
1     0 
2:    30743328 
2:    30743328 
3:   999 
3:    30743328 
3: 7.82827652E-38 
4: 7.82833033E-38 
4:    30743328 

따라서, 나는 서브 루틴에서 글로벌 포인터를 사용할 수 없습니다 것 같다. 어떻게 해결할 수 있습니까?

+3

사용하지 않는 포트란 77 크레이 포인터 결코 그 또는 다른 국제 표준의 일부가 아니며 따라서 본질적으로 휴대 할 수 없습니다. 이와 같이 잘 정의 된 방법이 없습니다. 당신은 당신의 컴파일러 문서를 읽어야 할 것이다. –

+0

사용하는 컴파일러가 중요 할 수 있습니다. 그리고 때로는 총알을 비트하고 fortran90으로 이동하는 것이 좋습니다. c_malloc을 ALLOCATE로 바꾸십시오. https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/293353 – Holmz

+0

질문에 답할 수 있도록 더 자세히 알려주십시오. 나는 서브 루틴의 코드 또는 적어도 헤더를 놓치고있다. 그리고 나는 또한 실제 문제에 대한 설명을 놓치고 있습니다. 귀하의 질문은 무엇인가? arny 오류 메시지가 있습니까? 그것은 어떻게 생겼어? 아니면 잘못된 결과입니까? 추락? –

답변

1

francescalus 포인트로 항상 IMPLICIT NONE을 사용해야합니다. 그것은 매우 중요합니다. Cray 포인터는 확장 기능이므로 FORTRAN77의 엄격한 호환성에 신경 쓰지 않아도됩니다. 따라서 IMPLICIT NONE을 사용하십시오!

그러면 ptr_val이 서브 루틴에서 정의되지 않았 음을 알 수 있습니다.

는 대신 포인터가 아니라 배열을 통과해야하고, 서브 루틴은 다시 포인터 관계를 선언

program test 
    implicit none 

    integer val 
    pointer (ptr_val, val) 

    print *, "1:", loc(val) 
    print *, "1:", ptr_val 

    CALL DPMALLOC(ptr_val, sizeof(val)) 



    print *, "2:", loc(val) 
    print *, "2:", ptr_val 

    val = 999 
    call foo(ptr_val) 

end program test 

subroutine foo(ptr_val) 
    implicit none 

    integer val 
    pointer (ptr_val, val) 

    print *, "3:",val 
    print *, "3:", loc(val) 
    print *, "3:", ptr_val 
    call DPMALLOC(ptr_val, sizeof(val)) 
    print *, "4:", ptr_val 
    print *, "4:", loc(val) 
    return 
end subroutine foo 

출력 : 실제로

> ./a.out 
1:     0 
1:     0 
malloc 
2:    10391632 
2:    10391632 
3:   999 
3:    10391632 
3:    10391632 
malloc 
4:    10391392 
4:    10391392 
+0

감사합니다! – kai

관련 문제