MST
星途 面试题库

面试题:Fortran与C语言混合编程中的函数调用规范

在Fortran与C语言混合编程环境下,函数调用约定不同可能导致程序出错。请阐述Fortran和C语言各自常见的函数调用约定,以及如何确保在混合编程中正确地相互调用函数。假设要在Fortran程序中调用一个C语言编写的函数`add_numbers`,该函数接收两个整数并返回它们的和,给出完整的Fortran调用代码和C语言函数实现代码。
50.3万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

Fortran常见函数调用约定

  1. FORTRAN 固定格式调用约定:参数传递按照顺序,且实参与形参的数据类型、个数和顺序需严格匹配。对于数组参数,传递的是数组的起始地址。
  2. 现代Fortran(如Fortran 90及以后):同样遵循按顺序传递参数原则,支持更灵活的接口定义,可使用模块(module)来定义接口,增强了程序的可维护性和可读性。

C语言常见函数调用约定

  1. __cdecl:C语言默认调用约定。参数从右向左压入栈中,由调用者负责清理栈。这种方式允许函数接受可变参数列表。
  2. __stdcall:参数也是从右向左压入栈,但由被调用函数清理栈。常用于Windows API函数。

确保混合编程中正确相互调用函数的方法

  1. 接口定义:在Fortran中使用INTERFACE块来定义C函数的接口,明确参数类型和返回值类型。在C语言中,确保函数声明与Fortran调用时的期望一致。
  2. 数据类型匹配:保证Fortran和C语言中参数的数据类型一致。例如,Fortran的INTEGER对应C语言的int,Fortran的REAL对应C语言的float等。
  3. 调用约定匹配:如果Fortran和C语言使用不同的调用约定,可能需要在编译时指定,或通过编译器特定的语法来确保匹配。通常,Fortran与C语言混合编程时,C语言函数使用默认的__cdecl调用约定,Fortran可以适应这种约定。

Fortran调用代码

program call_c_function
    implicit none
    interface
        integer function add_numbers(a, b) bind(c, name='add_numbers')
            use iso_c_binding
            integer(c_int), value :: a
            integer(c_int), value :: b
        end function add_numbers
    end interface
    integer :: result
    result = add_numbers(3, 5)
    write(*,*) 'The sum is:', result
end program call_c_function

C语言函数实现代码

#include <stdio.h>
#include <stdint.h>

// 注意这里使用的是标准C的int类型,对应Fortran的INTEGER
int add_numbers(int a, int b) {
    return a + b;
}