Có cách nào để tạo các mảng có kích thước thay đổi trong Fortran trên ngăn xếp không? Phân bổ() không làm việc cho tôi, bởi vì nó đặt mảng trên heap. Điều này có thể dẫn đến sự cố song song (xem câu hỏi khác của tôi: OpenMP: poor performance of heap arrays (stack arrays work fine)). Tất nhiên, một số bộ nhớ thông minh quản lý sẽ cung cấp cho một cách xung quanh vấn đề đó, nhưng quản lý bộ nhớ trong Fortran âm thanh ngớ ngẩn.Các mảng kích thước biến đổi ở Fortran mà không phân bổ()
Về cơ bản, tôi đang tìm một tương đương Fortran các nội dung sau trong C:
scanf("%d", N);
int myarray[N];
Để tái lặp: Tôi không muốn
Integer, PARAMETER :: N=100
Integer, Dimension(N) :: myarray
vì đây xác định kích cỡ mảng lúc biên dịch thời gian. Tôi cũng không muốn
Integer, Dimension(:), Allocatable :: myarray
read(*,*) N
Allocate(myarray(1:N))
vì nó đặt mảng trên heap.
Giúp đánh giá rất nhiều. Tôi đã rất hài lòng với mảng Allocatable cho đến khi cuộc gặp gỡ gần đây của tôi với vấn đề trong câu hỏi được trích dẫn ở trên. Nếu có một câu trả lời tiêu cực cho câu hỏi này, tôi sẽ rất nhiều đánh giá cao một liên kết đến nguồn.
Chỉnh sửa: xem nhận xét về câu trả lời của M.S.B. Một cách thanh lịch để làm điều này chỉ trở thành có thể ở Fortran 2008, và nó được thực hiện trong một cấu trúc block
.
Cảm ơn, M.S.B.! Nặng như nó được so sánh với 'int array [N]' của C, nó thực hiện thủ thuật. – drlemon
Bạn có thể làm điều gì đó gần hơn với C, tức là một tuyên bố ở giữa mã, sử dụng cấu trúc khối của Fortran 2008. Xem, ví dụ, p. 12 của ftp://ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf. Tôi không biết trình biên dịch nào hỗ trợ điều này, hoặc liệu họ có hỗ trợ nó với OpenMP hay không. –
Tôi có cấu trúc này trong mã của tôi, tuy nhiên tôi nhận thấy rằng theo mặc định gfortran vẫn đặt các mảng trên heap, và bây giờ tôi có malloc ở giữa các vòng chặt chẽ của tôi. Có vẻ như tùy chọn "-fstack-array" là cần thiết. – DaveP