2013-10-30 50 views
6

有没有办法从Fortran声明C可变参数函数? 我需要调用此函数来计算用字符串标记的向量之间的点积。 我的想法是声明如下所示,其中变量列表包含字符串文字。如果参数的变量列表为空,那么我将在标准标签中进行查找并执行计算。如果用户指定两个标签,我想找回这两个向量,并得到他们的点积:C可变参数函数和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个参数大小写)。我宁愿避免这个解决方案。

+0

它需要在两边声明为cdecl。你的运行时错误可能是因为一方是stdcall而另一方是cdecl。 – cup

回答

3

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

您可以使C函数的定义仅包含两个参数(因此它不再可变 - 对该函数的现有引用将需要修改),C函数中的第二个参数是一个指针,可以是NULL以表明没有其他的东西被传递,或者指向一个指针数组(或许是NULL终止)或者其他任何东西。在F201X中,这种函数的接口体可能能够为第二个参数使用OPTIONAL属性。

+0

这是一个可变参数函数。请参阅:http://stackoverflow.com/a/19171063/1162141 – technosaurus

+0

@technosaurus我没有看到评论或链接答案的相关性。 – IanH

+0

可变参数函数中的“...”基本上是一个指针数组(尽管它们可以是整型)链接显示了这些强制类型从第一个指针开始获取正确类型的复杂方法。因此,您的答案对于替换“...”+1是有意义的。 (*) – technosaurus