이것은 특정 질문 일 수 있지만이 두 컴파일러 (Compaq Visual Fortran 최적화 컴파일러 버전 6.5 및 minGW)로 메모리를 처리하는 방법과 관련이 있다고 생각합니다. Fortran 90에서 포인터를 사용하여 모범 사례에 대한 아이디어를 얻으려고합니다. 다음은 "out of the box"에서 gfortran 컴파일러의 경고 중 하나 인 "POINTER 값이 지정된 함수가 할당의 RHS에 표시됩니다"와 다른 컴파일러의 경고가 없다는 것입니다.Fortran 90의 컴파일러 시각 포트란과 gfortran의 차이점
module vectorField_mod
implicit none
type vecField1D
private
real(8),dimension(:),pointer :: x
logical :: TFx = .false.
end type
contains
subroutine setX(this,x)
implicit none
type(vecField1D),intent(inout) :: this
real(8),dimension(:),target :: x
logical,save :: first_entry = .true.
if (first_entry) nullify(this%x); first_entry = .false.
if (associated(this%x)) deallocate(this%x)
allocate(this%x(size(x)))
this%x = x
this%TFx = .true.
end subroutine
function getX(this) result(res)
implicit none
real(8),dimension(:),pointer :: res
type(vecField1D),intent(in) :: this
logical,save :: first_entry = .true.
if (first_entry) nullify(res); first_entry = .false.
if (associated(res)) deallocate(res)
allocate(res(size(this%x)))
if (this%TFx) then
res = this%x
endif
end function
end module
program test
use vectorField_mod
implicit none
integer,parameter :: Nx = 15000
integer :: i
real(8),dimension(Nx) :: f
type(vecField1D) :: f1
do i=1,10**4
f = i
call setX(f1,f)
f = getX(f1)
call setX(f1,f)
if (mod(i,5000).eq.1) then
write(*,*) 'i = ',i,f(1)
endif
enddo
end program
이 프로그램은 두 컴파일러에서 모두 실행됩니다. 그러나 루프를 10 ** 4에서 10 ** 5로 변경하면 gfortran에 심각한 메모리 문제가 발생합니다.
CTR-ALT-DLT를 사용하고 "성능"을 열면 gfortran에서 실행하면 실제 메모리가 빠르게 증가하고 compaq 컴파일러에서는 움직이지 않는 것처럼 보입니다. 내 컴퓨터가 충돌하기 전에 나는 보통 취소한다. 그래서 나는 그것이 최대에 이른 후에 행동에 대해 확신하지 못한다.
이것은 파생 데이터 유형에서 필요한 포인터를 사용하는 적절한 방법으로 보이지 않습니다. 그래서 내 질문은 : 안전하게 인터페이스 및 기능 같은 종류의 유지하면서 포인터를 사용할 수 있습니까?
p.s. 주 프로그램은 건설적인 것을하지 않는 것 같습니다.하지만 요점은 루프가 메모리에 의해 제한되어야한다고 생각하지 않고 실행 시간의 함수 여야한다는 것입니다.
도움을 주시면 대단히 감사하겠습니다.
마지막 질문에서 대답을 수락하지 않아 죄송합니다. 매우 유사했습니다. 그리고 끈기있게 해주셔서 감사드립니다. 이 주석은 많은 의미가 있으며, 현재는 포인터를 반환하기 위해 서브 루틴을 사용하는 것에 전념 할 것이라고 생각합니다. 또한, 나는 그것이 내 상황에 도움이 될 것이라고 생각하지 않기 때문에 first_entry 저장된 변수를 제거 할 것이다. 나는 무효화하고 내가 작업하고있는 데이터 구조 때문에 상위 레벨에서 수행되어야한다고 생각한다. 다시 한 번 고맙습니다. @IanH – Charlie