के लिए रैपर लिखने के लिए कैसे मैं 'आवंटित' फ़ंक्शन के लिए एक रैपर लिखने की कोशिश कर रहा हूं, यानी फ़ंक्शन जो सरणी और आयाम प्राप्त करता है, स्मृति आवंटित करता है और आवंटित सरणी देता है। सबसे महत्वपूर्ण बात यह है कि फ़ंक्शन को विभिन्न रैंक के सरणी के साथ काम करना चाहिए। लेकिन मुझे स्पष्ट रूप से फ़ंक्शन इंटरफ़ेस में सरणी के रैंक को स्पष्ट करना होगा, और इस मामले में कोड केवल संकलित करता है यदि मैं पैरामीटर के रूप में कुछ रैंक के सरणी पास करता हूं। उदाहरण के लिए, इस कोड को संकलित करता है नहीं:'आवंटित'
module memory_allocator
contains
subroutine memory(array, length)
implicit none
real(8), allocatable, intent(out), dimension(:) :: array
integer, intent(in) :: length
integer :: ierr
print *, "memory: before: ", allocated(array)
allocate(array(length), stat=ierr)
if (ierr /= 0) then
print *, "error allocating memory: ierr=", ierr
end if
print *, "memory: after: ", allocated(array)
end subroutine memory
subroutine freem(array)
implicit none
real(8), allocatable, dimension(:) :: array
print *, "freem: before: ", allocated(array)
deallocate(array)
print *, "freem: after: ", allocated(array)
end subroutine freem
end module memory_allocator
program alloc
use memory_allocator
implicit none
integer, parameter :: n = 3
real(8), allocatable, dimension(:,:,:) :: foo
integer :: i, j, k
print *, "main: before memory: ", allocated(foo)
call memory(foo, n*n*n)
print *, "main: after memory: ", allocated(foo)
do i = 1,n
do j = 1,n
do k = 1, n
foo(i, j, k) = real(i*j*k)
end do
end do
end do
print *, foo
print *, "main: before freem: ", allocated(foo)
call freem(foo)
print *, "main: after freem: ", allocated(foo)
end program alloc
संकलन त्रुटि:
gfortran -o alloc alloc.f90 -std=f2003
alloc.f90:46.14:
call memory(foo, n*n*n)
1
Error: Rank mismatch in argument 'array' at (1) (1 and 3)
alloc.f90:60.13:
call freem(foo)
1
Error: Rank mismatch in argument 'array' at (1) (1 and 3)
इस तरह के आवरण ..
धन्यवाद को लागू करने की कोई तरीका है!
बहुत बहुत धन्यवाद! हालांकि इसे आवंटक मॉड्यूल में कोड डुप्लिकेशन की आवश्यकता है, कम से कम मैं इस आवंटन समारोह को कॉल करते समय कम से कम सामान्य नाम का उपयोग कर सकता हूं। मुझे यही चाहिए था। – robusta