2011-03-31 44 views
2

我寫在C的動態數組泛型編程

typedef struct __c_array { 
    void**_elem; 
    int cur_size; 
    int capacity; 
}c_array; 

我的界面是這樣的:

extern void push_back_c_array (c_array*, void *); 

現在,用戶將不得不爲元素分配內存以推進入陣列。有沒有什麼辦法可以避免使用void *。

我想用這個做以下

int a = 5; 
push_back_c_array (<ARRAY_PTR>, a); 

這是可能的。

+0

對typedef結構是有害的。它已經有了一個類型;所做的一切就是通過要求讀者引用並記住typedef的基本類型來使更多的代碼更復雜。 – 2011-03-31 06:57:25

+0

你能解釋一下嗎? – Avinash 2011-03-31 06:59:36

+7

我不同意'這是有害的typedef結構',在這種情況下,結構將是一個不透明的句柄,供他的用戶使用該數組。 – IanNorton 2011-03-31 07:02:10

回答

2

如果您提供將複製提供的值的push_back_c_array()版本,則可能會這樣。爲此,您將需要一個額外的參數,指定值的大小:

push_back_c_array(c_array* arr, void* val, unsigned int size); 

你堆了新的價值分配內存,然後做的memcpy。但之後,您需要將其解除分配。因此,您需要記住,哪些值由您分配,哪些值由調用者分配。相當討厭......所以,如果你這樣做 - 永遠這樣做,並在你的函數的文檔中描述這個約定。

+0

謝謝,但從可用性的角度來看,添加大小參數將成爲問題。 – Avinash 2011-03-31 07:05:05

+0

根本不是。對於許多C函數來說這是一個常見的情況。 (例如,採用相同的memcpy())。 – weekens 2011-03-31 07:07:10

+0

沒有大小,沒有calloc! – 2011-03-31 07:08:02

0

您的示例數組包含類型爲(void *)的項。它擁有指針。你似乎想要它保持任意類型。在這種情況下,int。你想存儲插入數據的副本還是簡單地存儲調用者給你的指針?

前一段時間,我想要一個簡單的數組像行爲爲我正在寫一個遊戲,並想出了xrlist。一段時間後,我想存儲它們並隨機訪問它們,所以想出了xrhash

xrlist和xrhash存儲用戶提供的指針,並期望所有元素是同一類型的(xrhash有一個哈希碼和比較的回調函數)

0

你可能會得到更好的服務分配的內存一小塊(或許舉行工會),並推回元素,直到你填補它。然後重新分配,或分配一個兩倍大小的數組並複製所有內容。

0

你的例子whit a = 5應該工作,只要你將使用整數或任何其他類型的大小與int相同。通用數組的用戶將需要推動結構,就像你一樣。但是,大元素不能/不應該被值傳遞,但它的指針應該被傳遞。

使用泛型和沒有被限制在sizeof(int)帶來一些額外的努力從用戶。我認爲最好的解決方案是你在函數中傳遞分配的指針(void *),並且任何想要取出這個元素的人都應該釋放()這個結構體。

+0

我同意你關於大型結構,這樣的指導方針可以發佈,但對於像int這樣的小型數據類型,要求用戶每次分配真的很不方便。 – Avinash 2011-03-31 07:46:16