2011-11-12 16 views
5

तो मैं एक कस्टम संपादन नियंत्रण कर रहा हूँ। संपादन नियंत्रण की सामग्री का ट्रैक रखने के लिए, मैं एक गतिशील आवंटित चार सरणी का उपयोग कर रहा हूं।पाठ संपादन नियंत्रण के लिए बफर को लागू करने का सबसे अच्छा तरीका क्या है?

  • अब, मुझे पता है कि मैं इस तरह के उपयोगकर्ता किसी विशेष बिंदु पर क्लिक करता है जब के रूप में कुछ स्थितियों, में सरणी के बीच में डालने की जरूरत है। तो, मैं एक चरित्र सरणी के बजाय सोच रहा था, मैं std :: वेक्टर का उपयोग कर सकता हूं, इसलिए मैं .insert फ़ंक्शन का उपयोग करने में सक्षम होगा, और को स्मृति प्रबंधन के बारे में अधिक ध्यान नहीं देना पड़ेगा।
  • मैं भी सोच रहा था कि इनपुट स्ट्रीम को सीधे सरणी/वेक्टर शब्द (निरंतर बफर रखने के बिना) में स्टोर करने के लिए शायद यह सोच रहा था, क्योंकि इसके साथ संपूर्ण उद्देश्य सिंटैक्स हाइलाइटिंग को कार्यान्वित करना है।

चीजों के बारे में जाने के लिए एक बेहतर तरीका कौन सा होगा? और क्यों?

उत्तर

4

आज कंप्यूटर आप वास्तव में बस एक ही सन्निहित बफर (जैसे एक सदिश) का उपयोग कर सकते क्योंकि सीपीयू काफी तेजी से (इस अनुभवहीन दृष्टिकोण के साथ एक o(n) आपरेशन) प्रविष्टि समय बनाने के लिए कर रहे हैं के साथ एक पाठ बफर के लिए अभी भी एक व्यवहार्य विकल्प।

अतीत में जब कंप्यूटर हजारों गुना धीमे होते थे, तो टेक्स्ट को बफर में रखने के बजाय, कर्सर की स्थिति से संबंधित "छेद" के साथ, o(1) ऑपरेशन और एक तरफ से चलने वाले वर्णों को सम्मिलित करने के लिए दूसरी ओर छेद का जब कर्सर पाठ में आगे बढ़ रहा था (मूल रूप से कर्सर आंदोलन को o(k) ऑपरेशन जहां k छोड़े गए वर्णों की संख्या है)।

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

+0

बहुत अच्छा स्पष्टीकरण है, धन्यवाद! हाँ, पाठ तार्किक रेखाओं में विभाजित किया जा रहा है, और मैं क्षैतिज स्क्रॉलिंग के साथ जा रहा हूँ। – devjeetroy

+2

संपादकों जो एक संगत बफर का उपयोग करते हैं, वे बड़ी फ़ाइलों को संपादित करते समय बहुत ही परेशान होते हैं (जैसे लॉग फ़ाइल)। स्रोत फ़ाइलों के लिए यह ठीक है, लेकिन लोग अनिवार्य रूप से अपने संपादक में _everything_ लोड करना चाहते हैं। इस प्रकार किसी प्रकार का विभाजन आवश्यक है। –

2

आपको दोहरी प्रतिनिधित्व की आवश्यकता हो सकती है, इसलिए दोनों के वेक्टर और शब्द के वेक्टर दोनों हैं (समस्या उन्हें सिंक में रखना है)।

मैं कुछ ग्राफिकल टूलकिट का भी उपयोग कर रहा हूं, और शायद यहां तक ​​कि इसका उपयोग भी कर रहा हूं जिसका स्रोत स्वतंत्र रूप से उपलब्ध है, और जिसे अनुकूलित किया जा सकता है। (मैं एक विंडोज लड़का नहीं हूं, लेकिन) मैं सोच रहा था उदा। Qt जो विंडोज, लिनक्स, मैकोज़क्स पर चल रहे सी ++ में एक ओपन-सोर्स ग्राफिकल लाइब्रेरी है ...

मैं और अधिक मदद नहीं कर सकता, क्योंकि मुझे नहीं पता और मैं विंडोज का उपयोग नहीं करता (मेरी सभी मशीनें हैं लिनक्स के तहत)।

+0

प्रतिक्रिया आदमी के लिए धन्यवाद! एक बार जब मेरी अपनी काम हो जाए तो मैं निश्चित रूप से उन पर ध्यान रखूंगा। मैं पहले "हुड के नीचे" सामानों को जानना चाहता हूं। मैं यह भी सोच रहा था कि दोहरी प्रतिनिधित्व की आवश्यकता हो सकती है। क्या प्रदर्शन/स्मृति उपयोग पर इसका हिट होगा? और वर्णों का वेक्टर रखने और प्रत्येक शब्द की स्थिति के वेक्टर को रखने के बारे में कैसे? प्रारंभ स्थिति और लंबाई (संरचना का उपयोग कर) की तरह? क्या यह बेहतर प्रदर्शन के रूप में होगा? – devjeetroy

+0

** समय से पहले अनुकूलन बुराई तो पहले कोड एक सही कार्यान्वयन, बेंचमार्क यह एक प्रोफाइलर उपयोग कर रहा है **, और फिर इसे अनुकूलन –

+0

वास्तव में, मैं सिर्फ मैं कहाँ कोड के साथ जा रहा किया जाना चाहिए का एक दृश्य प्राप्त करना चाहते हैं, ताकि मैं डॉन – devjeetroy

4

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

दो सिस्टम नियंत्रण बहुत सारे एक्सटेंशन पॉइंट प्रदान करते हैं जो आपको अधिकतर लक्ष्यों को प्राप्त करने की अनुमति दे सकते हैं। जब तक आप वास्तव में एक शब्द प्रक्रिया या स्रोत कोड संपादक नहीं बना रहे हैं, तो आपको प्रदान किए गए लोगों के साथ रहना चाहिए। और कस्टम संपादन नियंत्रण बग का एक बड़ा स्रोत हैं। मैं शायद ही कभी एक ऐसे व्यक्ति को देखता हूं जो केवल बुनियादी मामलों के लिए सही काम करता है।

मार्टिन

+0

मैं एक स्रोत कोड संपादक बना रहा हूँ। मैंने पहले से ही धनवान और उपclassing की कोशिश की है जितना तेज़ नहीं है जितना मैं चाहता हूं। मैंने ओवर-राइट और सेटचरफॉर्मेट विधि का इस्तेमाल किया, लेकिन वे बोलने के लिए बहुत साफ नहीं थे। मैंने अपने कस्टम संपादन नियंत्रण पर शुरुआत की है, और मैंने पहले ही कर्सर और बहु-लाइन इनपुट लागू कर लिया है। तो, अब मैं इसे पाठ चयन और बहु-पंक्ति चयन और सामान – devjeetroy

+0

के लिए तैयार करने की कोशिश कर रहा हूं यदि आप वास्तव में एक स्रोत कोड संपादक बना रहे हैं, तो अपने स्वयं के बफर को लागू करना सही विचार है। अधिकांश स्रोत कोड संपादकों को बहुत बड़ी फ़ाइलों (जैसे सर्वर लॉग) लोड करने के लिए कहा जाता है, इसलिए सुनिश्चित करें कि आप मूल संचालन की बड़ी ओ स्केलेबिलिटी के बारे में कठिन सोचते हैं। –

+0

हाँ, धन्यवाद आदमी!मेरे प्रमुख विचारों में से एक है – devjeetroy

3

आप एक स्रोत कोड दर्शक की तरह कुछ (संदर्भ: "वाक्य रचना हाइलाइटिंग लागू करने के लिए") विचार कर रहे हैं एक अस्थायी समर्थन की दुकान के साथ, आप std::list<std::string> मिल सकता है एक अच्छा प्रारंभिक बिंदु है, और यह overkill अगर हो सकता है स्ट्रिंग छोटा है।

अपने पाठ (जैसे एक बड़ा std::string या std::vector) के लिए एक सन्निहित बफर के साथ

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

std::list<std::string> में कुछ अच्छी संपत्तियां हैं क्योंकि यह तारों के संग्रह के रूप में बढ़ती है और उत्परिवर्तित होती है (उदाहरण के लिए प्रत्येक पंक्ति या अनुच्छेद के लिए) अच्छी तरह से।

यह अवलोकन सूची की ताकत का विवरण और अच्छी तरह से अन्य कंटेनरों के लिए यह तुलना: http://www.cplusplus.com/reference/stl/list/

आप, स्ट्रिंग/लाइन के लिए कुछ डेटा संबद्ध करने के लिए तो बस इन की एक सूची बना चाहते हैं:

namespace MON { 
class t_line { 
public: 
    /* ... */ 
private: 
    std::string d_string; 
    t_lexer_stuff d_lexerStuff; 
}; 
} 
2
सरल संपादन

के लिए

Gap buffer: एक ही पतली के लिए खोज करते समय

मैं दो विकिपीडिया पृष्ठों है कि बहुत मददगार जहां में आए

Rope (data structure) के लिए जटिल पाठ संपादन

+0

सीपीपी में एक अंतर बफर पर मेरा प्रयास: https://github.com/cmaughan/gapbuffer – cmaughan

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

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