Fortran数组元素传递给数组的机制疑问——以SMOOTH函数为例
Fortran数组参数传递机制解析(基于SMOOTH/SETUPQ示例)
背景与代码示例
我不熟悉Fortran,正试图理解Fortran函数向子例程传递参数的机制,以便在C#中实现类似功能(涉及Carl de Boor《实用样条指南》中的SMOOTH函数,已简化问题)。
SMOOTH函数定义
real function SMOOTH (x, y, dy, n, s, V, A) integer n, i, m real A(n, 4), dy(n), s, V(n, 7), x(n), y(n) call SETUPQ(x, dy, y, n, V, A(1, 4)) ...
SETUPQ子例程定义
subroutine SETUPQ (x, dy, y, n, V, QTY) integer n, i, m real dy(n), QTY(n), V(n, 7), x(n), y(n) ...
疑问
我认为A和V是多维数组,各有n行,分别为4列和7列。调用SETUPQ时,似乎将A的第1行第4列元素A(1,4)作为最后一个参数传递。在SETUPQ中,后续会对QTY数组的n个元素进行赋值。
我的疑问是:为何要将SMOOTH中的A(1,4)传递给SETUPQ的QTY?A(1,4)不只是A中的单个值吗?QTY的赋值会作用到A(1,4)上吗?希望能理解该调用语句的原理。
解答
这是Fortran数组存储和参数传递的核心特性导致的:
- 列优先存储规则:Fortran的多维数组默认按列连续存放。对于
A(n,4),内存中先存第1列的n个元素,接着是第2、3列,最后是第4列的所有元素(A(1,4), A(2,4), ..., A(n,4)),这一列的元素在内存里是连续的。 - 传递的是内存地址:当传递
A(1,4)时,Fortran并没有传单个值,而是传了这个元素所在的内存起始地址。SETUPQ里的QTY(n)被声明为一维数组,它会从这个起始地址开始,连续操作n个内存单元——正好对应A数组第4列的全部n个元素。 - 直接修改原数组:所以SETUPQ中对
QTY的所有赋值操作,本质都是直接修改A数组第4列的对应元素,而非只改动A(1,4)这一个值。
这种写法相当于把二维数组的某一列“伪装”成一维数组传递,利用Fortran的存储特性省去了额外定义临时一维数组的步骤。
内容的提问来源于stack exchange,提问作者OrangeWombat
相关产品推荐
相关产品推荐

