2016-02-03 35 views
0

GNU fortran手冊部分「10.5.2.126 Rename Intrinsic (function)」說:「由於本內在執行的副作用,不推薦函數形式。」重命名()內在函數的副作用?

另一方面,「8.11.9.213 Rename Intrinsic (subroutine)」部分說道:「Fortran的一些非GNU實現提供這種內在功能只是一種功能,而不是子程序,或者不支持(可選)狀態參數。

因此,有兩個問題:

  1. 什麼是重命名內在(功能)的副作用?
  2. 如果需要便攜性,哪種形式更適合使用?

回答

3

首先注意你引用的手冊是非常古老的。它是GCC 3,所以它適用於g77而不是gfortran。最近的版本在這裏https://gcc.gnu.org/onlinedocs/gfortran/RENAME.html

如果需要可移植性(從編譯器到編譯器),請不要使用此過程,而是調用操作系統來執行此操作。這在不同的操作系統上會有所不同。例如,在Linux上

call EXECUTE_COMMAND_LINE('mv ' // trim(old) // ' ' // trim(new)) 

SYSTEM(),而是如果EXECUTE_COMMAND_LINE()在舊的編譯器。

副作用是文件重命名本身的行爲。正常的內在函數是純粹的,他們將(大部分)爲相同的輸入返回相同的答案,並且它們不會更改任何外部狀態。副作用是除了返回函數返回值之外還可以改變某些外部狀態的任何操作。

請注意,子程序形式也有相同的副作用。但這不是問題。子程序預計會有副作用。

這與RANDOM_NUMBER()是子程序的原因是一樣的。它有改變隨機發生器狀態的副作用。非標準功能RAND()很醜,因爲它是一種帶有副作用的功能。

+0

謝謝!事實上,並不容易認識到副作用與「主效應」不是相反的。 :)) – Roux