Đây là một chút phức tạp; Tôi hoan nghênh mọi ý kiến về cách cải thiện sự rõ ràng của câu hỏi.Phân bổ mảng động với kích thước phụ thuộc lẫn nhau
Ok, nói rằng tôi có một mảng:
real, allocatable :: A(:,:,:)
và tôi muốn phân bổ nó trước khi tôi sử dụng nó. Có thể cho kích thước của chiều thứ ba phụ thuộc vào kích thước của chiều thứ hai không?
Ví dụ:
do i=1,n
allocate(A(3,i,i**2))
end do
Rõ ràng những điều trên không có tác dụng. Tôi muốn kết thúc với một mảng (hoặc một tập hợp các mảng) với hình dạng (s)
(3,1,1), (3,2,4), (3,3,9), ... (3, n, n^2)
nơi kích thước của kích thước thứ ba là hình vuông kích thước của chiều thứ hai.
Quy tắc của tôi cho kích thước của thứ nguyên phụ thuộc phức tạp hơn một chút, nhưng nếu có thể tôi có thể làm phần còn lại.
Điều này có khả thi không? Nếu vậy, làm thế nào tôi có thể thực hiện nó ở Fortran?
Điều gì sẽ shape(A)
trả lại? Điều đó sẽ rất thú vị.
thay thế khác của tôi là để phân bổ đến kích thước tối đa cần thiết, và cẩn thận để chỉ sử dụng một số yếu tố trong tính toán, tức là
allocate(A(3,n,n**2))
Mặc dù tôi không cứng lên vào bộ nhớ tại thời điểm này, tôi muốn thực hành lập trình tốt. Đây là một vấn đề thú vị.
Cảm ơn bạn.
EDIT:
gì về việc có kích thước của một chiều hướng phụ thuộc vào giá trị của một phần tử trong không gian khác?
Trong câu trả lời dưới đây kích thước của mảng trong cả hai kích thước phụ thuộc vào chỉ số của B. Tôi muốn một cái gì đó dọc theo dòng của
type myarray
real :: coord(3)
integer,allocatable :: lev(:)
integer, allocatable :: cell(:)
endtype myarray
type(myarray), allocatable :: data
allocate(data(m))
allocate(data%lev(n))
forall (j=1:n) !simple now, for argument's sake
lev(j)=j
endforall
! I was thinking of using a FORALL loop here, but the errors returned
! suggested that the compiler (gfortran) didn't expect IF blocks and ALLOCATE
! statements in a FORALL block
do i=1,m
do j=1,n
allocate(data(i)%cell(lev(j)**2))
enddo
enddo
Bạn nhận được ý tôi chứ? Nhưng chương trình rơi xuống khi nó cố gắng phân bổ các biến đã được phân bổ, ví dụ: khi i=1
, nó phân bổ data(1)%cell(1)
và sau đó cố gắng phân bổ data(1)%cell(2)
... uh oh. Những gì tôi muốn là một cái gì đó như:
Mỗi data(i)
có một mảng lev(j)
các giá trị, với j
chạy từ 1 đến n, và cho mỗi giá trị lev(j)
chúng tôi có một cell
kích thước lev
^2. Lưu ý rằng những cell
là duy nhất cho mỗi data(i)
và mỗi lev
và kích thước của số đó cell
cụ thể phụ thuộc vào giá trị lev
tương ứng và có thể tương ứng với data(i)
.
Tôi có phải sử dụng loại có nguồn gốc trong loại có nguồn gốc không?
Chỉ cần để bạn biết, loại mảng bạn đang tìm kiếm được gọi là mảng "lởm chởm", so với mảng "hình chữ nhật". IRO-bot bên dưới có câu trả lời đúng; trong các mảng Fortran của mình luôn là hình chữ nhật nhưng bạn có thể sử dụng các loại được xác định để tạo cấu trúc của riêng bạn. –
"Bị lởm chởm" ... này, điều đó có ý nghĩa, theo hình ảnh. "... bạn có thể sử dụng các loại được xác định để tạo cấu trúc của riêng bạn." Có thật không? Vì vậy, nếu tôi muốn một mảng có hình dạng tăng cho đến nửa chừng sau đó giảm, hoặc sau chuỗi Fibonacci, hoặc là hoàn toàn ngẫu nhiên - đó là tất cả có thể cho nỗ lực không quá nhiều ... mát mẻ! –
@SamuelTan Tôi tiếp tục chỉnh sửa câu trả lời của mình bằng mã được cập nhật để giải quyết vấn đề mới của bạn. So sánh hai mã để xem bạn đang làm gì sai. – milancurcic