对大型阵列正确使用FORTRAN INTENT()

对大型阵列正确使用FORTRAN INTENT(),fortran,parameter-passing,Fortran,Parameter Passing,我试图找出使用FORTRAN子程序处理大数据数组的最佳方法。 我有一个可以在3,4或5维数组上运行的代码。 我正在处理许多子例程,我想知道通过引用调用这些数组的最佳方式是什么,同时又能保证它们不会被写入(显然,输出数组除外) 我在[this related intent()question]中读到:我应该使用intent(out)通过引用调用所有输出数组,但是如果我对输入数组也这样做,那么我可能需要一个类似C的常量使其具有写保护 因此,底线是: 1.我应该如何根据输入和输出变量的INTENT()

我试图找出使用FORTRAN子程序处理大数据数组的最佳方法。 我有一个可以在3,4或5维数组上运行的代码。 我正在处理许多子例程,我想知道通过引用调用这些数组的最佳方式是什么,同时又能保证它们不会被写入(显然,输出数组除外)

我在[this related intent()question]中读到:我应该使用intent(out)通过引用调用所有输出数组,但是如果我对输入数组也这样做,那么我可能需要一个类似C的常量使其具有写保护

因此,底线是: 1.我应该如何根据输入和输出变量的INTENT()声明伪变量?
2.如何用引用变量调用子程序的写保护?

实际上,C++类const引用与ItAuto(in)< />代码非常类似,但更重要的是假设形状、假设大小、显式大小数组哑参数之间的区别。 对于显式大小和假定大小数组,Fortran规则有几个要求(结合隐式接口的可能性),这使得有必要使用指向第一个元素的指针的经典逐引用传递

但是,编译器不必传递指向原始数组的指针,它可以传递指向临时副本的指针

对于需要显式接口的更复杂的传递机制,将传递描述符(或指向描述符的指针)。同样,描述符实际上可以是数组的临时副本。但是这些高级的传递机制,如假定的形状数组、可分配数组和指针数组参数,使得它不太可能需要临时数组

使用
属性时,始终会创建临时值。传递指向临时对象的指针(或描述符)

如果你使用了任何一种意图,在不需要临时的情况下,都不会有太大的改变。这只是一个承诺,传递机制不会改变


当需要临时文件时,如果指定了
intent(in)
intent(out)
,编译器可以避免临时文件的其中一个副本。如链接问题中所述,接受的答案是错误的:
intent(in)
不是传递值。一般来说,您(几乎)没有办法在Fortran中强制通过引用调用,但您不需要这样做,因为编译器选择了最佳模式。使用
intent
,您可以提示编译器这样做,并简化对编程错误的检测。因此,如果我想从子例程中修改大型三维数组,最佳做法是使用intent(inout)并让编译器处理它?如果我想让它通过引用,那是怎么做的?你可能误解了答案。试着再读一遍。通过引用传递是一个内部事物,而不是Fortran术语。我用了这个术语,因为你在问题中用了其他C语言术语。关键是,
意图
对传球机制影响不大。避免某些类型的编程错误对您更有用。更重要的是假设大小、表达式大小或假定形状数组参数。如果你不知道这意味着什么,我强烈建议你学习Fortran的任何一本书来学习它。我现在明白你的意思了。