C可变函数与Fortran的互操作性

时间:2013-10-30 02:21:15

标签: c fortran fortran90 fortran-iso-c-binding

有没有办法声明一个C variadic函数并从Fortran调用它? 我需要调用此函数来计算用字符串标记的向量之间的一些点积。 我的想法是声明类似下面的内容,其中变量参数列表包含字符串文字。如果变量参数列表为空,那么我将在标准标签之间进行查找并执行计算。如果用户指定了两个标签,我将检索这两个向量并获得它们的点积:

extern "C" void compute_dot_product(double * dot_product, ...)
{
    va_list args;
    va_start(args, NULL);
    char * label1 = va_arg(args, char *);
    if (!label1)
    {
       // Do standard label lookup and compute dot product
    }
    else
    {
       // Compute dot product between the vectors with the specified labels
       char * label2 = va_arg(args, char *);
    }
    va_end(args);
}

唯一的问题是我可以编译我的C库并将其链接到Fortran可执行文件,但是当我尝试访问变量参数列表时出现运行时错误。 知道我想做什么是可能的吗? 一个可能的解决方案是分成两个函数:一个执行标准标签查找(0参数情况),另一个执行非标准标签查找(2参数情况)。我宁愿避免使用这个解决方案。

1 个答案:

答案 0 :(得分:3)

无法以标准符合(即便携式)的方式调用可变参数函数。

你可以让C函数的定义只取两个参数(所以它不再是变量 - 需要修改现有的函数引用),C函数中的第二个参数是一个指针,要么为NULL指示没有其他东西被传递,或指向一个指针数组(可能是NULL终止)或任何其他东西。在F201X中,这种函数的接口体可能能够使用OPTIONAL属性作为第二个参数。