Ba cách bạn đề cập đến cho mảng sao chép, các do
vòng lặp, b(1:n) = a(1:n)
và b = a
, tất cả đều tương đương; họ sao chép nội dung của mảng a
vào mảng b
. a
và b
chỉ đơn giản là mảng, không phải là con trỏ ưa thích hoặc bất kỳ thứ gì và do đó việc gán a = b
về cơ bản giống như biểu thức toán học. Không có phép thuật với các tham chiếu đang diễn ra (mà người dùng cần biết), đó là lý do tại sao Fortran là một ngôn ngữ khá thẳng về phía trước để học. Bạn có thể có các mảng con trỏ trong Fortran, nhưng đây là một vấn đề khác.
M Metcalf và J Reid Fortran 90/95 giải thích luôn là tài liệu tham khảo tốt cho tư vấn về các tính năng ngôn ngữ của Fortran. Từ trang 48:
3,11 Mảng phân
Bằng cách phân nội tại, một biểu thức mảng có thể được gán cho một biến mảng của hình dạng tương tự, được hiểu là nếu mỗi phần tử của biểu thức được chỉ định thành phần tử tương ứng của biến. Ví dụ, với các tờ khai
real, dimension(10, 20) :: a
Việc chuyển nhượng
a = a + 1.0
thay thế a(i,j)
bởi a(i,j) + 1.0
cho i=1,2..,10
và j=1,2,..,20
.
Cũng lưu ý rằng một biểu thức vô hướng có thể được gán cho một mảng, trong trường hợp giá trị saclar được phát sóng đến tất cả các phần tử mảng.
Xét về cách thực hiện điều này thực sự được thực hiện, đó là những gì tôi nghĩ bạn đang lái xe cùng với câu hỏi của bạn, điều này hoàn toàn không được chỉ định theo tiêu chuẩn Fortran. Loại điều này là trái không xác định để cho phép các nhà văn biên dịch làm bất cứ điều gì tối ưu họ cảm thấy như thế nào. Ví dụ, trong nhiệm vụ a = b
, thứ tự các thành phần của b
được sao chép vào a
không được chỉ định theo tiêu chuẩn, do đó các trình biên dịch khác nhau có thể thực hiện điều này theo nhiều cách khác nhau. Tất cả những gì bạn cần biết là, với điều kiện là a
và b
không phải là con trỏ, thì a
và b
là các mảng riêng biệt và thay đổi thành phần của một yếu tố không thay đổi phần tử tương ứng. Vì vậy, nó là một cảm giác, a=b
là một "bản sao sâu" và bạn có thể nghĩ về điều này như sao chép tất cả các mục trong b
đến vị trí bộ nhớ của a
.
@ IanH Đây không phải là điều tôi biết nhiều, vì vậy tôi chỉ tập trung vào mảng trong câu trả lời của mình. Nó sẽ là thú vị để xem một ví dụ về ở trên không phải là trường hợp cho các loại có nguồn gốc nếu bạn muốn gửi một câu trả lời. – Chris
Lời xin lỗi cho điều đó, đó là một bong bóng suy nghĩ chưa hoàn thành mà tôi đã quyết định là không liên quan đến câu hỏi (với áp phích cụ thể đề cập đến các biến REAL). Tôi thậm chí không biết rằng nó đã được đăng. – IanH
'b (1: n) = a (1: n)' và 'b = a' không tương đương. Ví dụ, trước đây sẽ không kiểm tra sự phân bổ lại cần thiết. –