मैंने देखा है कि हमारे कोड बेस में कई स्थानों पर हम गतिशील रूप से विस्तारित सरणी का उपयोग करते हैं, यानी एक तत्व सरणी और "अधिकतम तत्व" मान के साथ एक आधार सरणी।एसटीएल वेक्टर के एक अच्छा सी समकक्ष?
सामान्य ऑब्जेक्ट उन्मुख कारणों के लिए, मैं इन्हें एक सामान्य डेटा संरचना और उपयोगिता कार्यों के साथ प्रतिस्थापित करना चाहता हूं। सरणी तत्व या तो मूल डेटा प्रकार या structs हो सकते हैं, मुझे तत्वों के लिए तेज़ी से यादृच्छिक पहुंच की आवश्यकता है, और अधिमानतः एक प्रकार-सुरक्षित कार्यान्वयन।
तो, मूल रूप से, एक एसटीएल वेक्टर है कि मैं क्या उपयोग करना चाहते हैं है, लेकिन कोड बेस तो मैं कुछ और :-) साथ आने के लिए
मैं इसे कुछ सोचा दे दी है C89 के लिए प्रतिबंधित और मार पड़ी है है इस प्रारंभिक मसौदा अप, बस पता चलता है कि मैं क्या कर रहा हूँ पर निशाना:
/* Type-safe dynamic list in C89 */
#define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t
#define list(type) type##_list_t
#define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size }
#define list_free(list) free(list.base_array)
#define list_set(list, place, element) if (list.elements < list.max_size) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if (list.elements < list.max_size) { list.base_array[list.elements++] = element; } else { /* Expand array then add */ }
#define list_get(list, n) list.base_array[n]
/* Sample usage: */
list_declare(int);
int main(void)
{
list(int) integers = list_new(int, 10);
printf("list[0] = %d\n", list_get(integers, 0));
list_add(integers, 4);
printf("list[0] = %d\n", list_get(integers, 0));
list_set(integers, 0, 3);
printf("list[0] = %d\n", list_get(integers, 0));
list_free(integers);
return EXIT_SUCCESS;
}
... तथापि, वहाँ किसी और ने इस से पहले किया गया है किया जाना चाहिए। मुझे कुछ अलग-अलग कतारों के लिए एक समान अवधारणा के फ्रीबीएसडी sys/queue.h कार्यान्वयन के बारे में पता है, लेकिन मुझे एरे के लिए ऐसा कुछ नहीं मिल रहा है।
क्या कोई यहां कोई बुद्धिमान है?
कम से कम, या तो मैक्रो से छुटकारा पाने के लिए और उन्हें कार्यों के साथ बदल सकते हैं या इतना है कि वे की तरह काम उन्हें ठीक कार्य करता है। उत्तरार्द्ध में किसी भी मैक्रो को लपेटना शामिल है जो 'डू {...} के साथ एक अभिव्यक्ति/कथन से अधिक है (0) '। –
मै मैक्रोज़ से छुटकारा क्यों लेना चाहूंगा? उन्हें कार्यों के साथ बदलना स्वतंत्रता प्रकार को हरा देगा, यह अब एक सामान्य समाधान नहीं होगा। इसके अलावा, मैं क्यों करना चाहता हूं ... जबकि? इससे फ़ंक्शन-जैसी मैक्रोज़ से असंभव वापसी मूल्य बन जाएंगे। – Christoffer
@ क्रिस्टोफर: आर की टिप्पणी दोबारा पढ़ें। "या" के उपयोग पर ध्यान दें - उन फ़ंक्शन मैक्रोज़ भयानक हैं, आपको उन्हें "फिक्सिंग" करके सुधारना चाहिए, जैसा आर कहते हैं। यह एक समारोह मैक्रो कम आश्चर्यजनक का उपयोग कर बनाता है। अच्छे उपाय के लिए, फ़ंक्शन मैक्रोज़ को पूंजीकृत किया गया था, तो मैं व्यक्तिगत रूप से पसंद करूंगा। – Arafangion