2011-07-15 46 views
3

C函數需要一個緩衝區數組在運行時處於作用域中。例如
如何在C函數中使用std :: vector

char values[x][y] 

C函數將填充
我想用一個動態數組緩衝區,於是我就不必硬編碼的尺寸
如何使用一個std ::向量在這種情況下, ?

要說清楚,我正在使用C++。 C函數包含在我無法修改的庫中。

+0

你想知道如何傳遞'STD :: vector'到C函數,或者如何在C函數中模擬* std :: vector? –

+0

@Chris。前者。我想將緩衝區呈現在動態數組中(因爲我使用C++ std :: vector是我的想法)。 – user754425

+0

@ user754425。那不是那*後者嗎? – shinkou

回答

0

你不能。

根據定義,C一無所知的任何一個std::vector,包括所需的組件,包括但不限於:

  • C沒有命名空間,所以它無法理解std命名空間。

  • C沒有模板,所以不能理解std::vector<T>類型。

從本質上講,你需要什麼看起來像 C函數,但是,對於所有意圖和目的,一個C++函數。

實現此目的最簡單的方法可能是使用C++編寫看起來像C函數的內容,並通過C++編譯器而不是C編譯器運行整個混亂。

+0

C函數在庫中。我只能按原樣使用它。我想如果有可能傳遞一個向量到C函數(&v [0]),那麼我想要做的事情可能是可行的,我只是不知道如何 – user754425

7

如果只是想通過在std::vector封裝到c例程動態數組可以將指針傳遞到底層陣列的頭部:

std::vector<char> myvector; 
// size-up myvector as needed 
foo(&myvector[0]); // pass a pointer to start of myvector to function foo 

c++標準確保了基礎數組在std::vector總是連續的。

希望這會有所幫助。

編輯:雖然聲明char values[x][y]創建一個「陣列陣列」values的內存實際上只是一個連續的塊,本質上是char linear_values[x * y]

如果您將您的尺寸設置爲std::vector以包含x * y個元素,則它應該爲您提供相同的基礎動態分配數組空間。

c該函數將訪問行主順序的數組,所以元件的第一行會第一,其次是第二全行等...

+0

它做它的一個字符類型,你可以只轉發declare函數或方法原型和鏈接器將把調用鏈接到c obj文件中。 – Chad

+0

@Jesus:據說我們正在處理一個'C++'編譯器。我假設我們試圖獲得一些'C++'代碼來調用一個'c'庫,但是一切都編譯爲'C++'。這是這種情況嗎? –

+0

我認爲他說這是一個C函數,這意味着它將被編譯爲一個.c文件中的gcc,這就是爲什麼他問你是否可以通過向量直接c函數 –

1

C沒有標準的數據結構的庫。

如果你真的想要一個向量的所有功能,而且它的東西的關鍵,你也許可以在網上找到個C語言載體的某人的寵物實施,只是使用它。

如果它危急,請自己寫。這並不難,而且可能非常有用。

如果您只是想要一個動態增長的數組,可以很容易地使用realloc函數來模擬向量的行爲,該函數擴展了堆分配數組的維度。從一個小陣列開始,當你到達最後時根據需要增長。以大塊形式增長效率更高,但如果您對數據看起來像是有一些瞭解,則可以通過其他方式進行增長。每次用完時,常用的方法是將數組大小加倍。

你可以得到的realloc的細節:

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

,或者在* nix系統上:

人的realloc

相關問題