2009-12-15 14 views
8

Tôi muốn kiểm tra xem con trỏ bên trong một kiểu dẫn xuất đã được xác định hay chưa. Tôi đã viết code đơn giản sau đây để cho bạn thấy vấn đề của tôi:Con trỏ kết hợp trong loại có nguồn gốc? gFortran vs Intel

program test 
implicit none 

type y 
    real(8), pointer :: x(:) 
end type y 
type(y), pointer :: w(:) 

allocate(w(2)) 
allocate(w(1)%x(2)) 

write(*,*) associated(w(1)%x), associated(w(2)%x) 

end program test 

Biên dịch mã này với gFortran 4.4.1 và chạy nó trên Ubuntu cho kết quả:

T F 

trong khi cùng mã biên soạn trên Windows Vista với trình biên dịch Intel Fortran 11.0 cung cấp:

T T 

Kết quả đầu tiên (gFortran) là điều tôi thực sự mong đợi. Nhưng thực tế là trình biên dịch Intel cung cấp một kết quả khác khiến tôi sợ mã của tôi có thể không chính xác. Tôi đang làm điều gì đó khủng khiếp sai với các con trỏ trong ví dụ này? Bất kỳ ý tưởng hay giải thích nào?

Rất cám ơn trước sự giúp đỡ của bạn!

Trả lời

11

Bạn đang kiểm tra xem con trỏ có được liên kết mà không sử dụng rõ ràng nullify trên con trỏ hay không. Một trang tuyệt vời trên common Fortran mistakes nhận xét (với mẫu mã đã bị xóa):

Nhiều người nghĩ rằng trạng thái của con trỏ chưa bao giờ được liên kết là không. liên kết. Điều này là sai. (...) Khi một con trỏ được khai báo trạng thái của nó là không xác định, và không thể được truy vấn một cách an toàn với associated nội tại.

Dường như trình biên dịch gfortran có thể được thiết lập để vô hiệu hóa rõ ràng con trỏ trên khai báo - bạn có thể nghĩ về điều này giống như trình biên dịch tự động thiết lập biến được khai báo bằng 0 và không được tính vào hành vi đó. Nếu bạn muốn chắc chắn, bạn sẽ tự vô hiệu hóa nó.

Sửa:

Tôi đọc qua hướng dẫn biên dịch của Intel, và nó xác định làm thế nào để đảm bảo rằng con trỏ được vô hiệu hóa một cách chính xác - bạn có thể thiết lập loại hình xuất phát của bạn như

type y 
    real(8), pointer :: x(:) => null() 
end type y 

Lưu ý, tuy nhiên, có vẻ như điều này được giới hạn trong Fortran 95, như đã đề cập trong bài viết được liên kết.

+0

Cảm ơn bạn rất nhiều !! Đây thực sự là vấn đề. Giải pháp bạn đề xuất hoạt động rất tốt, với cả trình biên dịch Intel và gFortran. – remek