2013-10-30 54 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