2012-01-08 43 views
2

我在C中有一個預先寫好的函數,它用數據填充一維數組,例如,將多個1-D數組中的數據有效地收集到單個1-D數組中

int myFunction(myData **arr,...); 


myData *array; 
int arraySize; 
arraySize = myFunction(&arr, ...); 

我想調用函數n倍連續具有稍微不同的參數(n是依賴於用戶輸入),並且我需要在一個單一的陣列C收集之後的所有數據。返回數組的大小並不總是固定的。哦,myFunction在內部做內存分配。我想以一種有效的記憶方式做到這一點,但在每次迭代中使用realloc聽起來不是一個好主意。

我有所有可用C++功能(該項目爲C++,只使用一個C庫),但使用std::vector也是白搭,因爲採集的數據在以後發送到功能類似於一個定義:

void otherFunction(myData *data, int numData, ...); 

任何想法?只有我能想到的東西是realloc或使用std::vector並將數據複製到一個數組後,這些聽起來不太有希望。

+2

'vector'很好,因爲它連續存儲數據,你可以將'data()'傳遞給C函數。 – 2012-01-08 15:16:19

+0

從我讀過的,我要嘗試'std :: vector :: data()',它看起來像最簡單的方法:) – penelope 2012-01-08 15:27:08

+0

@Kerrek SB我試過使用'std :: vector: :data()函數,它可以完美地處理所有需要'mydData *'的函數。如果你想寫你的評論作爲答案,我會接受它。 – penelope 2012-01-08 22:18:08

回答

1

只需將所有數據複製到std::vector即可。您可以在一個矢量v調用otherFunction

otherFunction(&v[0], v.size(), ...) 

otherFunction(v.data(), v.size(), ...) 

至於你的效率要求:它看起來對我來說,你過早優化。首先嚐試這個選項,然後測量它的速度,如果速度太慢,只能尋找其他解決方案。

-1

我認爲最好的解決方案是用你需要的一些方法編寫你自己的一維數組類。

取決於你如何編寫該類,你會得到這樣的結果。 (對不起,語法錯誤)。

+0

thnx爲快速回復。不幸的是,我不能使用我自己的一維數組類 - 我使用的函數來自一個存在的庫,並且它們只與'myData *'和'int n'耦合 - 數據數組的大小。但即使我寫了我自己的類,我仍然必須處理_same_問題來處理類方法 – penelope 2012-01-08 15:13:25

+1

沒有必要實現一維數組類。標準庫中有一個;它被稱爲'std :: vector'。 – 2012-01-08 15:19:31

1

如果你知道你打算調用函數N次,並且返回的數組總是M long,那麼爲什麼不最初只分配一個數組M * N?或者,如果您不知道M或N中的一個,則設置最差情況最大值。還是M和N都依賴於用戶輸入?

然後,改變你如何調用你的用戶輸入獲取函數,使得你傳遞它的數組指針實際上是一個偏移量,以便它將數據存儲在正確的位置。然後,下一次迭代,進一步抵消,然後再次調用。

+0

我剛剛編輯了我的問題,事先都不知道N或M。而且,我不能改變輸入獲取函數,因爲它來自一個預先存在的'C'庫(我不是作者) – penelope 2012-01-08 15:21:22

3

在每次迭代中使用realloc()聽起來像是一個非常精細的想法對我來說,有兩個原因:

  1. 「聽起來不像是個好主意」,是當他們還沒有建立績效人們通常說他們的軟件需求,他們還沒有根據性能要求測試他們的軟件,看是否有任何需要改進它。

  2. 而不是每次重新分配一個新塊,realloc方法將簡單地繼續擴展您的內存塊,它可能會在內存堆的頂部,所以它不會浪費任何時間或者遍歷內存塊列表或者複製數據。只要在返回之前釋放由myFunction()分配的任何內存就可以獲得釋放。您可以通過查看由realloc()返回的指針並確認它始終(或幾乎總是(* 1))與您爲其重新分配的指針完全相同的指針來驗證它。

編輯(* 1)一些C++運行時實現兩個堆,一個用於小分配和一個大的分配,因此,如果您的塊被在堆中分配的小塊,然後將其變大,它有可能會被移動到大堆的堆中。所以,別指望指針總是一樣的;只是大部分時間。

+0

非常真實,但實際上使用'realloc' *是一個壞主意,因爲這是一個C++程序。使用'std :: vector'是一個更好的主意。 – 2012-01-08 15:18:57

+0

'realloc' *可能會繼續擴大。或者它可能只是每次都複製它。 – 2012-01-08 15:36:26

+0

'realloc()'最可能會繼續擴展。無論如何,我向佩內洛普提供了驗證realloc做什麼的方法。所以,如果它不繼續擴大,她可以拋棄這個想法。但無論如何,如果她喜歡'std :: vector',並且她可以實際使用'std :: vector',那麼我認爲這是一個好主意,所以我通過了。我只說'realloc',因爲我認爲'std :: vector'不是一個選項,因爲它需要修改'MyFunction()'。 – 2012-01-08 15:40:13

相關問題