2010-04-06 26 views
6

Đối với các ngôn ngữ lập trình của tôi, một vấn đề hw yêu cầu:Biến cục bộ trong Fortran 77 tĩnh hay ngăn xếp động?

Biến cục bộ trong FORTRAN tĩnh hay ngăn xếp động? Các biến cục bộ được INITIALIZED với giá trị mặc định là tĩnh hay ngăn xếp động? Cho tôi xem một số mã với giải thích để sao lưu câu trả lời của bạn. Gợi ý: Cách dễ nhất để kiểm tra điều này là để chương trình của bạn kiểm tra độ nhạy lịch sử của một chương trình con. Hãy xem điều gì sẽ xảy ra khi bạn khởi tạo biến cục bộ thành giá trị và khi bạn không. Bạn có thể cần phải gọi nhiều hơn một chương trình con để khóa câu trả lời của bạn một cách tự tin.

Tôi đã viết một vài chương trình con: - tạo một biến - in biến - khởi tạo biến đến một giá trị - in biến một lần nữa

Mỗi cuộc gọi liên tiếp đến các bản in chương trình con ra giá trị ngẫu nhiên cùng cho biến khi nó được uninitialized và sau đó nó in ra giá trị khởi tạo.

Giá trị ngẫu nhiên này khi biến chưa được khởi tạo là gì?

Điều này có nghĩa là Fortran sử dụng cùng một vị trí bộ nhớ cho mỗi cuộc gọi đến chương trình con hoặc nó tự động tạo không gian và khởi tạo biến ngẫu nhiên?

Chương trình con thứ hai của tôi cũng tạo một biến, nhưng sau đó gọi chương trình con đầu tiên. Kết quả là như nhau ngoại trừ số ngẫu nhiên được in của biến chưa được khởi tạo là khác nhau. Tôi rất bối rối. Hãy giúp tôi!

Cảm ơn bạn rất nhiều.

+1

nơi fortran được dạy? – jonnystoten

+0

Ngôn ngữ không được dạy hoàn toàn. Nó chỉ là một phần của hw cho khóa học ngôn ngữ lập trình. Đó là nhiều hơn về việc học các cấu trúc ngôn ngữ lập trình và sử dụng một ngôn ngữ cũ như Fortran 77 thực sự thúc đẩy các điểm. Chương trình giảng dạy của chúng tôi xoay quanh phần lớn Java. – mm2887

Trả lời

11

Trong Fortran 77 & 90/95/2003, nếu bạn muốn giá trị của biến cục bộ cho chương trình con được duy trì trong suốt cuộc gọi chương trình con, bạn nên khai báo thuộc tính "lưu", ví dụ: (sử dụng kiểu Fortran 90):

integer, save :: counter 

HOẶC

integer :: counter 
save :: counter 

. Hoặc, nếu bạn muốn "cứu" hành vi để áp dụng cho tất cả các biến chỉ bao gồm trong chương trình con đơn giản

save 

tuyên bố mà không cần bất kỳ biến. Trong Fortran 90, một khởi biến trong một tuyên bố,

integer :: counter = 0 

tự động mua lại các thuộc tính lưu. Tôi không nghĩ rằng đây là trường hợp ở Fortran 77.

Đây là một lĩnh vực mà thử nghiệm có thể gây hiểu nhầm - họ sẽ cho bạn biết trình biên dịch cụ thể là gì, nhưng có lẽ không phải là tiêu chuẩn ngôn ngữ Fortran 77 , cũng không phải những gì các trình biên dịch khác đã làm. Nhiều trình biên dịch cũ của Fortran 77 không đặt các biến cục bộ trên ngăn xếp và tất cả các biến đều có thuộc tính save, không có lập trình đã sử dụng khai báo đó. Điều này, ví dụ, là trường hợp với các trình biên dịch DEC Fortran phổ biến. Nó phổ biến cho các chương trình Fortran 77 cũ chỉ được sử dụng với một trình biên dịch đặc biệt của kiểu này để trục trặc với trình biên dịch hiện đại vì các lập trình viên quên sử dụng thuộc tính save trên các biến cần thiết. Ban đầu điều này không gây ra vấn đề gì vì tất cả các biến đều có thuộc tính save một cách hiệu quả.Hầu hết các trình biên dịch hiện đại đặt biến cục bộ mà không lưu trên ngăn xếp và các chương trình này thường xuyên bị trục trặc vì một số biến cần "lưu" "quên" giá trị của chúng trong các cuộc gọi chương trình con. Điều này có thể được cố định bằng cách xác định các biến vấn đề và thêm lưu (công việc), thêm câu lệnh lưu vào mọi chương trình con (ít công việc), hoặc nhiều trình biên dịch có một tùy chọn (ví dụ, -fno-automatic in gfortran) để khôi phục lại hành vi cũ (dễ dàng).

Có vẻ như một câu hỏi đặc biệt - bạn sẽ không tìm hiểu về "Fortran 77" mà về một trình biên dịch cụ thể. Và tại sao sử dụng Fortran 77 thay vì Fortran 95/2003? Liệu các prof. nghĩ Fortran dừng lại năm 1977?

+1

Để thêm vào câu trả lời của tôi và Hiệu năng cao: những gì bạn đang khám phá là "không xác định" - khi bạn kiểm tra giá trị của biến cục bộ mà không lưu thuộc tính trên lần gọi thứ hai của chương trình con, mà không cần khởi tạo lại biến đó, bạn đã vi phạm tiêu chuẩn ngôn ngữ và hành vi không xác định. Bất cứ điều gì có thể xảy ra, tùy thuộc vào việc thực hiện các trình biên dịch cụ thể. Nếu các biến nằm trên ngăn xếp, bạn sẽ thấy một số giá trị "ngẫu nhiên". Nếu chúng được đặt ở vị trí bộ nhớ cố định, bạn sẽ thấy giá trị trước đó. –

5

Để khuếch đại trên một điểm mà @MSB đã thực hiện;

Tiêu chuẩn Fortran không nói cho các nhà biên dịch trình biên dịch cách triển khai các tiêu chuẩn, họ quan tâm đến hành vi của các chương trình hiển thị cho lập trình viên. Vì vậy, câu trả lời cho câu hỏi là 'tất cả đều phụ thuộc vào trình biên dịch'. Và OP không cho chúng tôi biết (các) trình biên dịch nào anh ta đang sử dụng.

Hơn nữa, nếu bạn trawl trở lại thông qua sương mù của thời gian để kiểm tra tất cả các trình biên dịch FORTRAN77 từng viết, tôi tin rằng bạn sẽ tìm thấy một loạt các triển khai khác nhau của các tính năng bạn quan tâm, nhiều người trong số họ gắn liền với các kiến ​​trúc phần cứng khá bí truyền.

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