对大型阵列正确使用FORTRAN INTENT()
我试图找出使用FORTRAN子程序处理大数据数组的最佳方法。 我有一个可以在3,4或5维数组上运行的代码。 我正在处理许多子例程,我想知道通过引用调用这些数组的最佳方式是什么,同时又能保证它们不会被写入(显然,输出数组除外) 我在[this related intent()question]中读到:我应该使用intent(out)通过引用调用所有输出数组,但是如果我对输入数组也这样做,那么我可能需要一个类似C的常量使其具有写保护 因此,底线是: 1.我应该如何根据输入和输出变量的INTENT()声明伪变量?对大型阵列正确使用FORTRAN INTENT(),fortran,parameter-passing,Fortran,Parameter Passing,我试图找出使用FORTRAN子程序处理大数据数组的最佳方法。 我有一个可以在3,4或5维数组上运行的代码。 我正在处理许多子例程,我想知道通过引用调用这些数组的最佳方式是什么,同时又能保证它们不会被写入(显然,输出数组除外) 我在[this related intent()question]中读到:我应该使用intent(out)通过引用调用所有输出数组,但是如果我对输入数组也这样做,那么我可能需要一个类似C的常量使其具有写保护 因此,底线是: 1.我应该如何根据输入和输出变量的INTENT()
2.如何用引用变量调用子程序的写保护?实际上,C++类const引用与
值
属性时,始终会创建临时值。传递指向临时对象的指针(或描述符)
如果你使用了任何一种意图,在不需要临时的情况下,都不会有太大的改变。这只是一个承诺,传递机制不会改变
当需要临时文件时,如果指定了
intent(in)
或intent(out)
,编译器可以避免临时文件的其中一个副本。如链接问题中所述,接受的答案是错误的:intent(in)
不是传递值。一般来说,您(几乎)没有办法在Fortran中强制通过引用调用,但您不需要这样做,因为编译器选择了最佳模式。使用intent
,您可以提示编译器这样做,并简化对编程错误的检测。因此,如果我想从子例程中修改大型三维数组,最佳做法是使用intent(inout)并让编译器处理它?如果我想让它通过引用,那是怎么做的?你可能误解了答案。试着再读一遍。通过引用传递是一个内部事物,而不是Fortran术语。我用了这个术语,因为你在问题中用了其他C语言术语。关键是,意图
对传球机制影响不大。避免某些类型的编程错误对您更有用。更重要的是假设大小、表达式大小或假定形状数组参数。如果你不知道这意味着什么,我强烈建议你学习Fortran的任何一本书来学习它。我现在明白你的意思了。