2010-07-28 14 views
14

Trong Fortran 95, nếu bạn gán một biến tại khaiphân Fortran về kê khai và TIẾT KIỆM thuộc tính Gotcha

integer :: var = 0 

nó tương đương với

integer, save :: var = 0 

và do đó biến được bảo quản sau khi thực hiện thường xuyên (tương đương với static trong C nói) và không được khởi động lại khi được gọi lại. Vấn đề lý do/kỹ thuật đằng sau hành vi đó (IMHO nguy hiểm) là gì?

+2

Vì mục đích đầy đủ, hãy để tôi đề cập rằng trong tiêu chuẩn Fortran 2003, điểm bạn đề cập được đề cập trong C1107: "Nếu đối tượng thuộc loại khởi tạo thành phần (R444) xuất hiện trong phần đặc tả của một mô-đun và không có thuộc tính ALLOCATABLE hoặc POINTER, đối tượng sẽ có thuộc tính SAVE. ". –

+0

@Alexandros Gezerlis - Đúng, nhưng anh ta hỏi "tại sao" họ đã làm mọi thứ theo cách này, và bây giờ tôi hiểu câu hỏi của anh ấy, tôi cũng có cùng một câu hỏi :). – dcp

+0

Tôi biết, đó là lý do tôi không đăng câu trả lời này. –

Trả lời

8

Tôi không nghĩ rằng có một số lý do đằng sau hành vi như vậy.

Nhưng theo như tôi biết, Stefano, bạn đã sử dụng thuật ngữ sai. Trong mã của bạn không có câu lệnh gán chỉ khởi tạo biến (var) bằng cách sử dụng biểu thức khởi tạo (0).

integer :: var = 0 ! type declaration & initialization 

integer :: var ! type declaration 
var = 0  ! assignment 

Vì vậy, có vẻ như đó chỉ là quyết định thiết kế của ủy ban. Nếu chúng ta có biểu thức như vậy (với câu lệnh khai báo kiểu dấu bình đẳng) thì đó là khởi tạo không gán. Và khởi tạo chỉ diễn ra một lần trong suốt quá trình thực thi chương trình (và không phải là thủ tục).

Tuy nhiên, có thể có một số lý do lịch sử cho quyết định như vậy. Hãy xem chủ đề this.

Hiện tại, hành vi này rất nguy hiểm vì nhiều ngôn ngữ được sử dụng rộng rãi khác tuân theo các quy ước khác về khởi tạo/chuyển nhượng.

+0

Nếu đây là một quyết định thiết kế có chủ ý, tôi có nên đăng câu hỏi "các thành viên ủy ban Fortran được phép hút thuốc trong các cuộc họp quyết định không?" :) nghiêm túc. Tôi không nghĩ rằng họ hơi say lên, vì vậy phải có một lý do, có thể bắt nguồn từ khả năng tương thích hoặc các vấn đề kỹ thuật. có vẻ quá kỳ lạ là một quyết định thiết kế vì lợi ích riêng của nó. –

+1

@Stefano: cũng có thể có một số lý do lịch sử và không hút thuốc. =) Đọc chủ đề này: http://www.rhinocerus.net/forum/lang-fortran/92384-initialization-local-variables.html – Wildcat

+0

Tôi nghĩ rằng bạn chỉ cần nhấn tại chỗ! Vui lòng chỉnh sửa câu trả lời của bạn để bao gồm liên kết. –

6

Nhiều trình biên dịch FORTRAN 77 cũ và các trình biên dịch cũ hơn phân bổ tĩnh tất cả các biến. Nhiều lập trình viên dựa vào hành vi này - đây là lỗi trong chương trình của họ, trừ khi họ sử dụng vòng loại "SAVE" trong khai báo (hoặc thêm câu lệnh SAVE đơn giản cho mọi thủ tục) giá trị của biến không được xác định khi reentry thủ tục. Nhưng vì trong những ngày đó các chương trình có khuynh hướng bị ràng buộc với một nền tảng và trình biên dịch cụ thể trong nhiều năm, các lập trình viên đã tránh xa điều này. Đây là một "bản ghi" rất phổ biến trong việc chuyển mã FORTRAN 77 cũ sang một trình biên dịch Fortran> = 90 hiện đại. Hầu hết các trình biên dịch cung cấp các công tắc biên dịch thời gian để khôi phục hành vi này, chẳng hạn như tùy chọn fno-automatic của gfortran. Rất có thể ủy ban đã xem các biến được khởi tạo trong tuyên bố của họ rất có thể cần thuộc tính SAVE - theo ý kiến ​​của tôi, một quyết định thiết kế hợp lý. Tôi nghĩ điều khác biệt nhất với các ngôn ngữ khác và dễ gây nhầm lẫn cho lập trình viên đa ngôn ngữ là việc khởi tạo chỉ được thực hiện một lần.

Các vấn đề liên quan