2012-01-21 16 views
7

enter image description hereवर्ण अतिव्यापी जब वे रंग बदल दिया है और पीछे की ओर

मुद्रित कर रहे हैं आप देख सकते हैं ऊपरी अंधेरे एक्स के काटा जाता है, भले ही उनके लिए अंतरिक्ष।

ऐसा इसलिए होता है क्योंकि उन्होंने रंग बदल दिया है और पीछे से मुद्रित हैं (दाएं से बाएं)।

क्या यह एक बग, दोषपूर्ण कोड, मेरे सिस्टम पर एक खराब सेटअप है या (मुझे शक है) जैसा कि यह माना जाता है?

#include <Windows.h> 
#include <iostream> 
void moveTo(int x,int y){ 
    COORD kord={x,y}; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),kord); 
} 
void setColor(WORD attributes){ 
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attributes); 
} 

void main(){ 
    for(int i=9;i+1;i--) 
    { 
     moveTo(i,0); 
     std::cout.put('X'); 
    } 
    for(int i=-10;i;i++) 
    { 
     moveTo(i+10,1); 
     std::cout.put('X'); 
    } 
    setColor(8); 
    for(int i=9;i+1;i--) 
    { 
     moveTo(i,2); 
     std::cout.put('X'); 
    } 
    for(int i=-10;i;i++) 
    { 
     moveTo(i+10,3); 
     std::cout.put('X'); 
    } 
    setColor(7); 
    for(int i=9;i+1;i--) 
    { 
     moveTo(i,4); 
     std::cout.put('X'); 
    } 
    for(int i=-10;i;i++) 
    { 
     moveTo(i+10,5); 
     std::cout.put('X'); 
    } 
    std::cin.get(); 
} 
+1

आप इसे कैसे जानते हैं क्योंकि वे पीछे हैं? हो सकता है कि आपको एक अक्षर का उपयोग करना चाहिए जो पीछे लिखा गया हो, जैसे 'एफ' –

+0

@ सेठ: ज़लास्टैक्स का अर्थ है, वर्ण क्रमशः दाएं से बाएं से प्रदर्शित होते हैं। यह मुझे कंसोल डिस्प्ले कोड में एक बग की तरह दिखता है। – TonyK

+0

मैं विंडोज 7 पर जी ++ संस्करण 4.5.2 का उपयोग करके इस व्यवहार को पुन: उत्पन्न कर सकता हूं। अजीब! – TonyK

उत्तर

4

यह विंडोज में एक बग है:

यहाँ कोड है कि इस उत्पादन उत्पन्न करता है।

Hans Passant द्वारा शुद्धिपत्र में उल्लेख किया है:

मैं Win7 पर भी repro, VS2008। कूल बग कंसोल फ़ॉन्ट बदलना इसे ठीक करता है।

चलिए इस बग अलगाव का उपयोग करते हैं। मैं इस फ़ॉन्ट को PetiteTerminal के रूप में पहचानता हूं, जो आपको इंगित करता है कि यह संभवतः Win32 कंसोल एप्लिकेशन के रूप में इस प्रोजेक्ट को कॉन्फ़िगर किया गया है। जीसीसी के साथ अतिरिक्त रेपो इस परिकल्पना की पुष्टि करता है, और हम एक व्यावहारिक दृष्टिकोण से, मान लेंगे कि आप सभी को विंडोज टर्मिनल के अंदर 32-बिट कंसोल एप्लिकेशन चल रहा था।

सवाल क्यों यह पिक्सल के ठीक एक अतिरिक्त स्तंभ डिफ़ॉल्ट टर्मिनल फॉन्ट के संदर्भ में रंग 8 लिख रही है, और पीछे की ओर एक console screen buffer.

विशेष रूप में लिख रहा हो जाता है, के अपने घटक में इस समस्या को तोड़ने जाने टुकड़े:

  1. जब एक लिखने जारी किया जाता है, एक चरित्र टर्मिनल सरणी
  2. जब डिफ़ॉल्ट रंग (7) चयन किया जाता है में एक स्थान पर लिखा है, पिक्सल नहीं अतिप्रवाह ढंग से अन्य बफ़र्स में करना n सरणी
  3. जब रंग 8 चुना जाता है, पिक्सल के एक अतिरिक्त स्तंभ बफर के अगले क्षेत्र है, जो केवल दिख रहा है जब पाठ में overspill की उपस्थिति की वजह से पीछे की ओर पाठ किया

लिखा है (3), यह एक बग है।

Quoting रेमंड चेन:

सांत्वना प्रतिपादन मॉडल हर किरदार के अंदर अपने तय आकार सेल फ़िट बैठ मान लिया गया है। जब किसी कक्ष में एक नया अक्षर लिखा जाता है, तो पुराना सेल नए चरित्र के साथ अतिप्रकाशित होता है, लेकिन यदि पुराने चरित्र को ओवरहैंग या अंडरहैंग किया गया है, तो उन अतिरिक्त पिक्सेल पीछे छोड़ दिए गए हैं क्योंकि वे आवश्यक सेल "संक्रमित" हैं और संक्रमित हैं पड़ोसी कोशिकाएं। इसी प्रकार, यदि एक पड़ोसी चरित्र "spilled", उन "spillover पिक्सेल" मिटा दिया जाएगा।

कंसोल विंडो में इस्तेमाल किए जा सकने वाले फोंट का सेट को फोंट पर ट्रिम किया गया था जिसे कंसोल विंडोज़ में स्वीकार्य रूप से काम करने के लिए जाना जाता था। अंग्रेजी प्रणालियों के लिए, यह हमें लुसीडा कंसोल और टर्मिनल में लाया।

...

"ठीक है, कि मूर्ख है। तुम मुझे एक फ़ॉन्ट कि इतने स्पष्ट रूप से बकवास में जो परिणाम को चुनने से बंद कर दिया है चाहिए।"

और यही हमने किया है।

नहीं कि मैं इस पर रेमंड को दोषी ठहरा रहा हूं, लेकिन वह आधिकारिक रूप से इसे "ऐसा नहीं कर सकता" के रूप में दिखाता है।

विंडोज के लिए कंसोल फोंट के चयन और परीक्षण को इसे पकड़ा जाना चाहिए था। तथ्य यह है कि यह भी एक मुद्दा है एक विचलन है।