2012-01-27 35 views
10

Tôi muốn phân bổ một mảng B có cùng hình dạng có cùng giới hạn dưới và trên như một mảng A khác. Ví dụ, tôi có thể sử dụngPhân bổ các mảng có cùng kích thước

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3))) 

Nhưng không chỉ là này thanh nha, nó cũng trở nên rất khó chịu đối với mảng của (chẵn) kích thước cao hơn.

Tôi đã hy vọng cho một cái gì đó giống như

allocate(B(shape(A))) 

mà không làm việc, và thậm chí nếu điều này đã làm việc, mỗi chiều sẽ bắt đầu từ 1, mà không phải là những gì tôi muốn.

Có ai biết cách tôi có thể dễ dàng phân bổ một mảng để có cùng kích thước và giới hạn như một mảng khác dễ dàng cho các thứ nguyên mảng tùy ý không?

+1

Tôi có thể hỏi lý do tại sao bạn cần phải làm điều này. Bạn có thể không chỉ phân bổ 'B' cùng lúc với' A' (hoặc ít nhất là trong cùng một phạm vi, khi bạn sẽ có quyền truy cập vào các tham số mảng/hình dạng được sử dụng để phân bổ 'A'). Ngoài ra, nếu bạn đang chuyển 'A' vào một hàm hoặc chương trình con, bạn có thể không chỉ có một mảng kích thước giả định' B' cục bộ cho thường trình đó giả định hình dạng của 'A'? – Chris

+0

Vâng, tôi cho rằng tôi không CẦN này, nó chỉ thực sự không phù hợp. Mảng 'A' được phân bổ trong một tệp .f khác với các ranh giới' A (nlmx-a_offset: nlpx + b_offset, ...) ', bạn sẽ lưu ý rằng đây là nhiều ký tự hơn là dùng l/ubound. – user1173081

+0

Sau đó, tôi nghĩ câu trả lời của M.S.B. có lẽ là cách tốt nhất để thực hiện những gì bạn đang cố gắng làm. – Chris

Trả lời

8

Bạn có thể định nghĩa nó trong một chỉ thị tiền xử lý, nhưng điều đó sẽ ở cùng một chiều cố định:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3) 

allocate(B(DIMS3D(A))) 

đừng quên để biên dịch với ví dụ các -cpp tùy chọn (gfortran)

Nếu sử dụng Fortran 2003 hoặc cao hơn, bạn có thể dùng tham số nguồn:

allocate(B, source=A) 

nhưng điều này cũng sẽ sao chép các phần tử của A đến B.

5

Nếu bạn là làm điều này rất nhiều và nghĩ rằng nó quá xấu xí, bạn có thể viết chương trình con của riêng bạn để chăm sóc nó, copy_dims (template, new_array), đóng gói dòng mã nguồn mà bạn hiển thị. Bạn thậm chí có thể thiết lập một giao diện chung để nó có thể xử lý các mảng của một số cấp bậc - xem how to write wrapper for 'allocate' cho một ví dụ về khái niệm đó.

+0

vâng, việc di chuyển nội dung sang các chương trình con chuyên dụng là rất tốt nếu bạn sử dụng nó rất nhiều và nếu bạn cần sự linh hoạt! – steabert

11

Tính đến Fortran năm 2008, hiện nay là lập luận MOLD tùy chọn:

ALLOCATE(B, MOLD=A)

khuôn = specifier làm việc gần như trong cùng một cách như NGUỒN =. Nếu bạn chỉ định MOLD = và source_expr là một biến, giá trị của nó không cần phải được xác định. Ngoài ra, MOLD = không sao chép giá trị của source_expr vào biến được phân bổ.

Nguồn: IBM Fortran Ref