2013-07-18 5 views
6

मैंने शून्य पॉइंटर्स का उपयोग कर सी में एक बुनियादी कतार संरचना लागू की है। प्रक्रिया इस प्रकार है:सी कतार कार्यान्वयन शून्य * - अच्छा या बुरा अभ्यास का उपयोग कर?

  • संरचना आरंभ - मैं सेट वैरिएबल प्रकार का आकार कतार में संग्रहीत करने के लिए
  • धक्का - मैं पारित चर सूचक संग्रहीत करने के लिए, कतार तो पकड़ लेता है खुद के लिए एक प्रति
  • सामने - संरचना सामने के तत्व के लिए एक शून्य * लौटाती है। मैं सिर्फ स्थानीय प्रतिलिपि रखने के लिए पॉइंटर, या memcpy() पकड़ सकता हूं।

struct ही इस तरह दिखता है:

struct queue 
{ 
    void* start; //pointer to the beginning of queue 
    void* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    void* initial_pointer;  //position of the start pointer before pop() operations 
}; 

आरंभ और अंत में सिर्फ शून्य संकेत है कि वर्तमान में आबंटित स्मृति ब्लॉक के भीतर कुछ स्थान को इंगित कर रहे हैं। अगर मैं कतार पर तत्वों को धक्का देता हूं, तो मैं varsize द्वारा अंत सूचक को बढ़ाता हूं। अगर मैं पॉप(), मैं केवल varsize द्वारा एंड पॉइंटर को भी कम करता हूं।

मुझे नहीं लगता कि मुझे यहां फ़ंक्शन कोड पोस्ट करना चाहिए, यह 100 से अधिक पंक्तियां हैं।

प्रश्न: क्या यह एक अच्छा या बुरा अभ्यास माना जाता है? क्यों नहीं)?

नोट: मुझे पता है कि सी में कतार के लिए कई अन्य विकल्प हैं। मैं सिर्फ इस की गुणवत्ता के बारे में पूछ रहा हूं।

संपादित करें: कार्यान्वयन यहाँ उपलब्ध है: http: यदि आप प्रकार और आकार पता नहीं है // 89.70.149.19 /stuff/queue.txt (space निकालें)

+2

मेमोरी आकारों के लिए size_t का उपयोग करें –

+0

मुझे लगता है कि 'शून्य * ' –

+0

@RanEldan का उपयोग करके जेनेरिक कोड लिखना अच्छा है, धन्यवाद। इसे यहाँ ठीक किया गया। – szczurcio

उत्तर

8

यह void * उपयोग करना ठीक है कतार में संग्रहीत वस्तुओं की (वास्तव में, सी मानक पुस्तकालय एक ही दृष्टिकोण का पालन करता है, कुछ उदाहरणों के लिए memcpy() और qsort() फ़ंक्शंस देखें)। हालांकि, कतार में संग्रहीत तत्वों के आकार को निर्दिष्ट करने के लिए size_t (या ssize_t यदि आपको हस्ताक्षरित डेटा प्रकार की आवश्यकता है) का उपयोग करना बेहतर होगा।

+1

रण एल्डन ने उल्लेख किया कि पहले से ही, मैंने इसे सही किया है। ठीक है, आपकी राय के लिए धन्यवाद। मुझे वास्तव में लगता है कि ऐसा करने के लिए सहज है, केवल मैंने देखा है कि कुछ लोगों का दावा है कि यह "बदसूरत" है। – szczurcio

+2

@szczurcio बात यह है कि यदि आप पहले से नहीं जानते हैं तो आप वास्तव में कुछ भी नहीं कर सकते हैं। यदि आप करते हैं, तो बेहतर प्रकार की सुरक्षा के लिए किसी भी माध्यम से 'शून्य *' का उपयोग न करें। –

2

आप वास्तव में हमें अपने कार्यान्वयन के बारे में सुनिश्चित करने के लिए पर्याप्त नहीं दिखाते हैं। उपयोगकर्ता डेटा मदों के लिए void* ठीक है, आप सी

में ज्यादा नहीं तो ऐसा नहीं कर सकते

लेकिन मैं दृढ़ता से संदेह है कि आप एक आंतरिक सूची तत्व प्रकार है कि आप अलग-अलग आइटम का प्रबंधन करने के लिए उपयोग,

struct list_item { 
    struct list_item* next; 
    void* data; 
}; 
की तरह कुछ है कि

अगर ऐसा है और अपने start और end संकेत ऐसे तत्वों की ओर इशारा करते हैं, तो आप निश्चित रूप से अपने तत्व प्रकार struct queue घोषणा में उपयोग करना चाहिए:

struct queue 
{ 
    struct list_item* start; //pointer to the beginning of queue 
    struct list_item* end;  //-||- to the end 
    size_t memsize; //size of allocated memory, in bytes 
    size_t varsize; //size of a single variable, in bytes 
    struct list_item* initial_pointer;  //position of the start pointer before pop() operations 
}; 

इस काम के लिए आपको struct list_item की परिभाषा को struct queue के उपयोगकर्ता को परिभाषित करने की भी आवश्यकता नहीं है।

+0

मुझे यकीन नहीं है कि आपका क्या मतलब है। प्रारंभ और अंत केवल शून्य पॉइंटर्स हैं जो वर्तमान में आवंटित स्मृति ब्लॉक के भीतर कुछ स्थान पर इंगित करते हैं। अगर मैं कतार पर तत्वों को धक्का देता हूं, तो मैं varsize द्वारा अंत सूचक को बढ़ाता हूं। अगर मैं पॉप(), तो मैं varsize द्वारा अंत सूचक भी कम कर देता हूं। – szczurcio

+0

संपादित करें: मैंने अपने प्रश्न में कोड के लिए एक लिंक जोड़ा है। – szczurcio

+0

@szczurcio, कतार का एक बहुत ही अपरंपरागत कार्यान्वयन है, सामान्य रूप से गतिशील तत्वों के साथ कुछ ऐसा होगा जैसा कि मैंने यहां वर्णन किया है। संदर्भ के लिए, आपको प्रश्न में अपनी टिप्पणी में जो विवरण है, उसे जोड़ना चाहिए। मैं फिर यह जवाब हटा दूंगा, जो आपको बहुत ज्यादा सेवा नहीं करता है। –

संबंधित मुद्दे