我遇到了一些Fortran 90代码,其中68个参数传递给一个函数。 在搜索网络时,我发现一些关于传递256字节的限制,用于某些CUDA Fortran相关内容(http://www.pgroup.com/userforum/viewtopic.php?t=2235&sid=f241ca3fd406ef89d0ba08a361acd962)。
所以我想知道:对于Intel / Visual / GNU fortran编译器可以传递给函数的参数数量是否有限制?
答案 0 :(得分:3)
我遇到了对Fortran 90标准的讨论:
http://www.nag.co.uk/sc22wg5/Guidelines_for_Bindings-b.html
相关部分的斜体字如下:
3.4声明
对Fortran语句长度的约束对过程调用的长度施加了上限。虽然它不太可能是一个严重的强加,但是自由格式的单个Fortran语句的上限为5241个字符,包括可能的标签(F90第3.3.1节,3.3.1.4节);在固定格式中,上限为1320个字符加上可能的标签(F90第3.3.2节)。这些限制取决于字符是"默认类型",实际上是单字节字符;对于双字节字符,例如用于表意文字,限制是依赖于处理器的,但可能具有相同的大小顺序。
Fortran标准对程序的最大参数数没有限制 。
我有一个安全工具,我正在研究分析二进制文件。我知道C语言对参数的数量有限制(C90标准中有31个,C99标准中有127个),所以我认为我可以对向量进行维数以保存与传入参数有关的128个项目。我遇到了一个FORTRAN派生的二进制文件,它传递了290个参数,这引发了我的讨论。二进制文件来自SPEC CPU2006基准测试套件,基准测试481.wrf,其中我看到一个名为(在二进制文件中)" solve_interface _"它在堆栈上设置290个参数,然后调用" solve_em _"实际上处理这些论点。毫无疑问,您可以在线找到这些程序的FORTRAN源代码。二进制文件是由用于x86 / Linux / ELF系统的GNU编译器工具生成的。
答案 1 :(得分:2)
我不相信Fortran标准明确规定了这样的限制。但是,它们确实限制了一行代码的长度(132个字符)和可以一起形成单个语句的行数(256)。我会留给你一个常规调用中可以使用的参数。
市场上的许多编译器对语句长度和可以使用的延续行数都有更宽松的限制。但是,如果编译器为任何例程强加了最大数量的参数,但这个数字可能高于任何实际需要,那么我不会感到惊讶。