2010-09-22 13 views
6

मैं जावा और सी # जैसी भाषाओं में काफी आरामदायक कोडिंग कर रहा हूं, लेकिन मुझे एक परियोजना के लिए सी (निम्न स्तर की ओएस एपीआई कॉल के कारण) का उपयोग करने की आवश्यकता है और मुझे पॉइंटर्स से निपटने में कुछ कठिनाई हो रही है और मेमोरी मैनेजमेंट (जैसा कि here देखा गया है)प्रबंधित ओओ भाषाओं से सीखना सी

अभी मैं मूल रूप से कोड टाइप कर रहा हूं और यह देखने के लिए कंपाइलर को खिला रहा हूं कि यह काम करता है या नहीं। यह सिर्फ मेरे लिए सही नहीं लगता है। क्या कोई मुझे प्रबंधित भाषाओं से आने वाले पॉइंटर्स और मेमोरी प्रबंधन को समझने के लिए मेरे लिए अच्छे संसाधनों को इंगित कर सकता है?

+5

जब मैंने सी पर काम किया - जो कई सालों पहले था, सी - केर्निगन रिची के लिए मेरा पसंदीदा संदर्भ - http://www.amazon.com/gp/product/images/0131103628/ref=dp_image_0?ie=UTF8&n = 283155 और एस = किताबें – InSane

+1

भयानक दुनिया में आपका स्वागत है। अभूतपूर्व प्रदर्शन और लचीलापन के लिए तैयार! –

+0

मैं आपके जैसे ही नाव में हूं, जावा और सी # को पायथन और सी ++ के साथ छोड़कर। मैंने उपरोक्त में दिए गए कोड की समीक्षा करके और पॉइंटर्स पर अनुभाग की समीक्षा करके और मेरी सी ++ पुस्तकों में रहने के दौरान इसका सामना किया है, जबकि मैं रिची की "सी प्रोग्रामिंग भाषा" की अपनी प्रतिलिपि के लिए प्रतीक्षा करता हूं। – xnine

उत्तर

3

अच्छे संसाधन आप पहले से ही पाया में से एक, अतः।

बेशक आप सभी चेतावनियों के साथ संकलित कर रहे हैं, है ना?

बड़े पैमाने पर सीखकर सीखना आपके कंपाइलर की गुणवत्ता और चेतावनियों/त्रुटियों पर निर्भर करता है जो वह आपको खिलाता है। लिनक्स/पॉज़िक्स दुनिया में मिले उस सम्मान में सबसे अच्छा clang है। अच्छी तरह से त्रुटियों की उत्पत्ति का पता लगाता है और आपको हेडर फाइलों को खोने के बारे में बताता है।

+0

++ "सभी चेतावनियों के साथ संकलित" के लिए। – AlcubierreDrive

1

कुछ युक्तियां:

  • डिफ़ॉल्ट varibles करके ढेर में संग्रहीत हैं।
  • वैरिबल्स मूल्य
  • द्वारा कार्यों में पारित किया गया है स्मृति आवंटित करने और मुक्त करने के लिए एक ही प्रक्रिया पर चिपकाएं। जैसे समारोह
  • Integer i = new Integer(); 
    
    i=5; 
    

की सी बराबर

int *p; 

p=malloc(sizeof(int)); 

*p=5; 
  • मेमोरी आवंटन है (malloc) असफल हो सकता है और एक ही आवंटित में नि: शुल्क है, तो अशक्त के लिए सूचक की जाँच इससे पहले कि आप इसका इस्तेमाल करें।
  • ओएस फ़ंक्शन विफल हो सकते हैं और यह वापसी मानों द्वारा पता लगाया जा सकता है।
1

अपने कोड के माध्यम से चरणबद्ध करने के लिए जीडीबी का उपयोग करना सीखें और चर वैल्यू प्रिंट करें (डीबगिंग प्रतीकों को सक्षम करने के लिए संकलित करें)।

मेमोरी लीक और अन्य संबंधित समस्याओं (जैसे ढेर भ्रष्टाचार) की जांच के लिए वालग्रिंड का उपयोग करें।

1

सी भाषा ऐसी कुछ भी नहीं करती है जिसे आप स्पष्ट रूप से करने के लिए नहीं बताते हैं।

आपके लिए स्वचालित रूप से बुलाए जाने वाले कोई भी विनाशक नहीं हैं, जो दोनों अच्छे और बुरे हैं (क्योंकि विनाशकों में कीड़े दर्द हो सकती हैं)।

कुछ हद तक स्वचालित विनाशक व्यवहार प्राप्त करने का एक आसान तरीका चीजों को बनाने और नष्ट करने के लिए स्कोपिंग का उपयोग करना है। यह बदसूरत हो सकता है क्योंकि नेस्टेड स्कॉप्स चीजों को आगे और आगे ले जाते हैं।

if (var = malloc(SIZE)) { // try to keep this line 
    use_var(var); 
    free(var); // and this line close and with easy to comprehend code between them 
} else { 
    error_action(); 
} 
return; // try to limit the number of return statements so that you can ensure resources 
     // are freed for all code paths 

अपना कोड जितना संभव हो उतना दिखने की कोशिश कर रहा है, हालांकि यह हमेशा संभव नहीं होता है।

मैक्रोज़ या इनलाइन फ़ंक्शंस का एक सेट बनाना जो आपकी ऑब्जेक्ट्स को प्रारंभ करना एक अच्छा विचार है। साथ ही उन कार्यों का एक और सेट भी बनाएं जो आपकी ऑब्जेक्ट्स मेमोरी आवंटित करें और इसे अपने प्रारंभिक कार्यों में पास करें। यह स्थानीय और गतिशील रूप से आवंटित वस्तुओं दोनों को आसानी से प्रारंभ करने की अनुमति देता है। विनाशक-जैसे कार्यों के लिए इसी तरह के संचालन भी एक अच्छा विचार है।

ओओ तकनीकों का उपयोग कई मामलों में अच्छा अभ्यास है, और सी में ऐसा करने के लिए थोड़ा और टाइपिंग की आवश्यकता होती है (लेकिन अधिक नियंत्रण के लिए अनुमति देता है)। पुटर, गेटर्स और अन्य सहायक फ़ंक्शन लगातार राज्यों में ऑब्जेक्ट्स रखने में मदद कर सकते हैं और जब आपको कोई त्रुटि मिलती है तो आपके द्वारा किए गए परिवर्तनों को कम कर सकते हैं, यदि आप इंटरफ़ेस को समान रख सकते हैं।

आपको perror फ़ंक्शन और errno "variabl" में भी देखना चाहिए।

आमतौर पर आप सी में अपवादों जैसे कुछ भी उपयोग करने से बचना चाहते हैं। मैं आम तौर पर उन्हें सी ++ में से बचने की कोशिश करता हूं, और केवल उन्हें वास्तव में खराब त्रुटियों के लिए उपयोग करता हूं - जो ऐसा नहीं होने चाहिए। उनसे बचने के मुख्य कारणों में से एक यह है कि सी में जादुई रूप से कोई विनाशक कॉल नहीं होता है, इसलिए गैर-स्थानीय GOTO अक्सर कुछ प्रकार के संसाधन को रिसाव (या अन्यथा खराब कर देते हैं)। ऐसा कहा जा रहा है कि सी में चीजें हैं जो समान कार्यक्षमता प्रदान करती हैं।

सी में तंत्र जैसे मुख्य अपवाद setjmp और longjmp फ़ंक्शंस हैं। setjmp को कोड में एक स्थान से बुलाया जाता है और एक (अपारदर्शी) चर (jmp_buf) पारित किया जाता है जिसे बाद में longjmp पर भेज दिया जा सकता है। जब longjmp पर कॉल किया जाता है तो यह वास्तव में कॉलर पर वापस नहीं आता है, लेकिन उस jmp_buf के साथ पहले setjmp कहा जाता है। setjmp कॉल द्वारा निर्दिष्ट मान को longjmp पर वापस कर देगा। नियमित कॉल setjmp वापसी 0

कार्यक्षमता जैसे अन्य अपवाद अधिक प्लेटफ़ॉर्म विशिष्ट हैं, लेकिन सिग्नल (जिनमें उनके स्वयं के गॉचेस हैं) शामिल हैं।

अन्य बातों पर गौर करने के लिए कर रहे हैं:

assert मैक्रो, जो कार्यक्रम बाहर निकलने के कारण करने के लिए जब पैरामीटर (किसी प्रकार की कोई तार्किक परीक्षण) में विफल रहता है इस्तेमाल किया जा सकता। assert पर कॉल करें जब आप #include <assert.h> से पहले जाते हैं, तो परीक्षण के बाद आप आसानी से दावे को हटा सकते हैं। यह उन सभी संदर्भों के साथ-साथ कई अन्य स्थितियों से पहले नल पॉइंटर्स के परीक्षण के लिए वास्तव में अच्छा है। यदि कोई शर्त assert विफल फ़ाइल के स्रोत फ़ाइल नाम और लाइन नंबर को मुद्रित करने का प्रयास करती है।

abort फ़ंक्शन प्रोग्राम को exit पर कॉल करने वाले सभी साफ़ किए बिना विफलता से बाहर निकलने का कारण बनता है। यह कुछ प्लेटफॉर्म पर सिग्नल के साथ किया जा सकता है। assert कॉल abort

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