Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何编写类似于这些内在函数的函数?_Fortran - Fatal编程技术网

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

Fortran 如何编写类似于这些内在函数的函数?,fortran,Fortran,我刚开始学习Fortran,我发现一些内在函数对我来说很神秘。 其中一个是ALLOCATE:ALLOCATE(数组(-5:4,1:10))。如果我想写一个类似的函数,它会是什么样子?它的论点是什么?会有哪种类型?因为我不清楚什么是数组(-5:4,1:10)数组仍然没有分配,那么这个表达式是什么意思?它是什么类型的?!array(10)和array(-5:4,1:10)作为一种类型有什么区别?它是一个隐藏的预先分配的“元对象”吗?它有一些内部属性,比如“维度”?至少它看起来不像C中的数组指针 下一

我刚开始学习Fortran,我发现一些内在函数对我来说很神秘。 其中一个是ALLOCATE:
ALLOCATE(数组(-5:4,1:10))
。如果我想写一个类似的函数,它会是什么样子?它的论点是什么?会有哪种类型?因为我不清楚什么是
数组(-5:4,1:10)
<代码>数组仍然没有分配,那么这个表达式是什么意思?它是什么类型的?!
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本身。这是真的吗?他们是怎么写的

正如@dave_thompson_085所指出的,
分配
不是一个库函数。不仅如此,还有一些类型的实际内在函数无法由用户编写。例如
min()
max()
transfer()
。它们不仅仅是“库”函数,它们是“本质的”,是核心语言的一部分,因此可以做用户代码无法做的事情。它们是用任何用于编写编译器的语言编写的。主要是C语言,但也可以用Fortran语言实现——只是不像普通的Fortran函数,而是编译器插入的一种功能


当涉及到接受掩码的函数时,比如
PACK
,但是还有许多其他函数在可选参数中接受掩码,那么掩码就是一个
逻辑
数组。编译器可以自由实现任何优化以避免分配这样的数组,但这些优化无法保证。它不仅仅是一个以简单方式调用的库函数,编译器还可以插入任何执行函数应该执行的操作的代码。

ALLOCATE是一个语句,而不是一个函数;因为它不在表达式(或CALL语句)中,所以可以判断。PACK是一个函数,它的作用就好像掩码(第二个参数)是完全创建的,即存储然后应用的,但由于它是固有的,编译器可以根据需要对其进行优化(通常取决于您选择的选项);即使在C语言中也不能复制。您可以(在F90+中)使用函数指针,但这会增加间接每次调用的成本,这可能远远超过存储临时数组的成本。您需要阅读一个(或多个)Fortran语言教程。在万维网上有几个是可用的。那么,下一个事实是:语义上
m/=0
是一个布尔值列表,作为参数传递,但编译器将其优化为lambda,它只是一个语义上的列表,在机器代码中的位可能是其他一些不需要消耗这么多内存的东西?是吗?@evets是的,我读了很多书,但我有其他语言的背景,如果不问问自己,我就不能读普通的Fortran——这与其他语言有什么关系,这是如何做到的。。。例如,当您看到某个库的函数时,您假设某个用户能够编写类似的函数,这里没有任何魔力。这就是我问这个问题的原因