2010-12-03 5 views
0

이렇게하면 매우 이상한 행동이 발생합니다. 이것이 문제의 근원이라고 생각하지만 잘못 될 수 있습니다. 나는 이상한 뭔가를하고 있어요 : 당신의 어떤이는 참으로 정의되지 않은 동작을 확인할 수있는 경우에, 나는 적어도 내 질문은fortran 90에서 의도하지 않은 (스플라인) 스플라이 이드 배열에 대해 정의되지 않은 동작이 발생합니까?

subroutine X 
    real, allocatable :: block(:,:) 
    allocate(block(20,20)) 

    call Sub(block(1:5, 1:5)) 
! here is undefined behavior 
end subroutine 

subroutine Sub(b) 
    real, intent(out) :: b(:,:) 
    b = 0.0 
end subroutine 

내가 (컴파일 척하지 않음)했다고 가정

에 무슨 일이 일어나고 있는지 알게 될 것입니다 ? 나는 슬라이스를 통과하더라도 의도 (아웃)이 전체 블록을 정의하지 않는다는 느낌을 가지고 있으며, 나는 inout이 필요하다. 표준에서 확인할 수 있습니까?

편집 : inout은 정의되지 않은 동작을하지만, 슬라이스되지 않은 배열은 Sub에 전달합니다. 이것은 서브 블록의 초기화를 위해 슬라이스 된 배열을 전달하는 것이 표준을 위반하고 있다는 것을 의미합니까? 당신이 조각을 전달하면

감사

모든

답변

2

첫째, 나는 그것에 대해 전혀 모르겠어요하지만 당신이, 당신은 전체 배열을 할당하지 않을거야 때문에 의도 (입출력)를 사용할 필요가 의심 , 의도 (out)이 경우에 맞을 수 있습니다.

그러나 문제의 원인은 명시 적 인터페이스가 없거나 모듈에 배치하지 않고 가정용 모양 배열을 서브 루틴에서 사용하는 실수를하는 것입니까? 또는 코드의 해당 부분을 생략 했습니까?

코드에 명시적인 인터페이스를 추가하고 블록 1에 할당하고 컴파일 한 다음 모든 종류의 슬라이스를 정의 할 수있었습니다. 올바르게 설정되었으므로 0으로 올바르게 설정되었습니다. 어떤 종류의 정의되지 않은 동작을 정확하게 볼 수 있습니까?

+0

명시적인 인터페이스가 있습니다. 문제의 비 관련 코드를 생략했습니다. 정의되지 않은 동작은 코드에서 전혀 건드리지 않은 유형에 포함 된 포인터를 할당 해제하거나 다시 할당하거나 임의의 메모리로 보냅니다. –

+2

문제를 재현하는 코드를 제공해 주시겠습니까? – steabert

+0

그것은 매우 어려울 것입니다. 그러나, 나는이 문제를 해결하기 위해 노력했기 때문에이 시점에서 호기심에 불과합니다. –

관련 문제