如何编写类似这些内在函数的函数?

时间:2020-08-09 04:35:49

标签: fortran

我刚开始学习Fortran,发现一些内在函数对我来说看起来很神秘。 其中之一是分配:ALLOCATE(array(-5:4, 1:10))。如果我想编写类似的函数,它将看起来如何?它的论点是什么?它将具有哪种类型?因为对我来说并不明显,array(-5:4, 1:10)是什么? array仍未分配,那么此表达式是什么意思?它是什么类型? array(10)array(-5:4, 1:10)作为一种类型会有什么区别?它是否是一些具有诸如“维度”之类的内部属性的隐藏的预分配“元对象”?至少它看起来不像C中的数组指针。

下一个神秘的函数示例是PACK:pack(m, m /= 0)。首先,我认为m /= 0就像一个函数指针,即lambda,就像在Python pack(m, lambda el: el != 0)或Haskell pack m (\el -> el /= 0)中一样。但是后来我在网络上的某个地方读到,它不是一个lambda而是一个布尔值列表,每个m项目一次。但这意味着这是非常低效的代码-如果m大,它将占用大量内存!因此,我无法理解这些内在函数是如何工作的,甚至我感觉用户无法编写此类函数-它们是用C编写的,而不是用Fortran本身编写的。是真的吗他们是怎么写的?!

1 个答案:

答案 0 :(得分:1)

Allocate不是库函数,如@ dave_thompson_085所指出。不仅如此,还有某些类型的实际内部函数无法由用户编写。像min()max()transfer()一样。它们不仅是“库”函数,它们是“隐式”函数,是核心语言的一部分,因此可以执行用户代码无法完成的工作。它们以用于编写编译器的任何语言编写。主要是C语言,但也可能在Fortran中实现-就像不像普通的Fortran函数一样,而是编译器插入的功能。

对于接受掩码的函数(例如PACK),但是在可选参数中有许多其他函数接受掩码时,掩码是logical数组。编译器可以自由地执行任何优化以避免分配这样的数组,但是不能保证这些优化。不仅是直接调用库函数的方法,编译器还可以插入执行该函数应做的任何代码。