2015-03-18 82 views
-2

我需要從第三方來源調用一個函數。函數需要以下類型的一個參數:如何初始化一個變量,該變量是指向結構指針數組的指針?

StructureName *(*parameterName)[] 

在一個實例中它被定義爲指針的數組:

StructureName * MagneticModels[1] 

它被傳遞給函數與「&」操作符。不幸的是在Visual Studio 2013年無法編譯:

Error C2664: (...) cannot convert argument (...) from 'StructureName *(*)[1]' to 'StructureName *(*)[]'

因此,要獲得它來編譯我添加了一個新的變量,並將其傳遞給函數:

StructureName *(*variableName)[]; 

現在編譯沒有錯誤,但然後我得到一個運行時錯誤,「變量名」使用未經初始化。

我嘗試了很多方式來初始化,但我不是一個C++開發人員,所以這是真正的折磨,一天後我沒有得到任何地方。因此,我將不勝感激任何幫助或建議。

+2

你能提供任何實際的代碼片段,而不是提示嗎? – 2015-03-18 23:07:36

+0

您正在使用哪種語言? (在某些情況下,C和C++對不完整的數組類型有不同的規則)。 – 2015-03-18 23:26:40

回答

1

在C下面的代碼是合法的(其中T是你的結構名稱或其他):

void foo(T *(*ptr)[]) 
{ } 

int main() 
{ 
    T *arr[1]; 
    foo(&arr); 
} 

但是,這種函數原型是用C++違法(更不用說通話)。

如果您正在嘗試編寫C代碼,請確保您正在調用C編譯器,而不是C++編譯器。

如果您正在嘗試編寫C++,但調用此函數(其頭文件必須用C語言編寫,並且大概該函數也是用C語言實現的),那麼您需要編寫一個存根函數,該函數在C++中具有合法原型。

例如:

// stub.h 
void foo2(T **ptr); // preferably use "extern C" guards around this 

// stub.c 
#include "foo.h"   // the troublesome function 

void foo2(T **ptr) 
{ 
    foo((T *(*)[]) ptr); 
} 

這存根將通過將第一個元素的地址,而不是整個陣列的地址被調用:

T * MagneticModels[1]; 
foo2(MagneticModels); 
+0

非常感謝!我認爲C始終與C++兼容。很好學習新的東西。現在它工作:) – Bartek 2015-03-19 15:00:59

1

如果函數需要一個StructureName *(*parameterName)[]參數,那麼唯一的方式將指針傳遞到一個StructureName * MagneticModels[1]陣列以這樣的功能是用一個&操作者用顯式轉換

foo((StructureName *(*)[]) &MagneticModels); 

(它可以由更可通過使用typedef來讀取數組類型)。

另一個漏洞是基於以下事實:一個陣列可以是聲明具有未知大小,然後具有特定尺寸限定。只要只有「大小未知」的聲明是衆所周知的在調用點,編譯器,它可以讓你通過它沒有投

extern StructureName * MagneticModels[]; // declaration 

void foo(StructureName * MagneticModels[]); 

int main() 
{ 
    foo(&MagneticModels); 
} 

StructureName * MagneticModels[1] = { ... }; // definition 

這個漏洞的適用性,當然,很有限。