2013-12-15 8 views
5

क्या सी में कई लाइनों को साफ़ करना और उदाहरण के लिए दूसरों को रखना संभव है।एकाधिक लाइनें साफ़ करें

कोड:

Displaysenrsordata 
    loop 
    printf("This info stays"); <-stay on screen 
    printf("This info stays"); <-stay on screen 
    printf("This info Refreshes"); <-update redraw 
    printf("This info Refreshes"); <-update redraw 
    printf("This info Refreshes"); <-update redraw 

अनिवार्य रूप से मैं कुछ पाठ एक ही स्थान पर रहते हैं और पूरे स्क्रीन को साफ किए बिना अपडेट करना डेटा पुनः बनाने का करना चाहते हैं।

+2

आपको अपने पर्यावरण (यूनिक्स टर्मिनल/विंडोज कंसोल ऐप/...) को निर्दिष्ट करने की आवश्यकता है क्योंकि यह आईएसओ सी – ninjalj

उत्तर

0

आप स्क्रीन के लिए सीधी लिख सकते हैं Brendan के अनुसार:

भाग 1

वर्ष वीजीए मोड के लिए, वहाँ एक निश्चित प्रदर्शन स्मृति क्षेत्र (विरासत) में लिखने के लिए पता है । टेक्स्ट मोड के लिए यह क्षेत्र 0x000B8000 से शुरू होता है। ग्राफिक्स मोड के लिए यह 0x000A0000 से शुरू होता है।

उच्च संकल्प वीडियो मोड के लिए

(जैसे VESA/VBE इंटरफ़ेस द्वारा निर्धारित होता है) इस वजह क्षेत्र 64 KiB और सबसे उच्च संकल्प वीडियो मोड के लिए सीमित है विरासत प्रदर्शन स्मृति के आकार एक की जरूरत है काम नहीं करता है बहुत अधिक जगह (जैसे 1024 * 768 * 32-बीपीपी = 2.25 एमआईबी)। प्राप्त करने के लिए कि VBE द्वारा समर्थित 2 अलग-अलग विधियां हैं।

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

दूसरी विधि "रैखिक फ्रेमबफर" (या बस "LFB"), जहां वीडियो कार्ड के पूरे प्रदर्शन स्मृति क्षेत्र किसी भी गन्दा बैंक स्विचिंग बिना पहुँचा जा सकता है कहा जाता है। आपको वीईएसए/वीबीई इंटरफेस से पूछना है जहां यह क्षेत्र है (और यह आमतौर पर 0xC0000000 और 0xFFF00000 के बीच "पीसीआई छेद" में है)। इसका मतलब है कि आप वास्तविक मोड में इसका उपयोग नहीं कर सकते हैं, और संरक्षित मोड या लंबे मोड या "अवास्तविक मोड" का उपयोग करने की आवश्यकता है।

जब आप एलएफबी मोड का उपयोग कर रहे हों तो पिक्सेल का पता ढूंढने के लिए, आप "pixel_address = display_memory_address + y * bytes_per_line + x * bytes_per_pixel" जैसे कुछ करेंगे। "bytes_per_line" वीईएसए/वीबीई इंटरफ़ेस से आता है (और "horizontal_resolution * bytes_per_line" जैसा नहीं हो सकता है क्योंकि क्षैतिज रेखाओं के बीच पैडिंग हो सकता है)।

के लिए "बैंक बंद" VBE/VESA मोड, यह हो जाता है कुछ अधिक की तरह:

pixel_offset = y * bytes_per_line + x * bytes_per_pixel; 
bank_number = pixel_offset/bank_size; 
pixel_starting_address_within_bank = pixel_offset % bank_size; 

कुछ पुराने वीजीए मोड के लिए (उदाहरण के लिए 256 रंग "मोड 0x13") यह बहुत LFB के समान है, सिवाय इसके कि लाइनों के बीच कोई पैडिंग नहीं है और आप कर सकते हैं "pixel_address = display_memory_address + (y * horizontal_resolution + x) * bytes_per_pixel"। टेक्स्ट मोड के लिए यह मूल रूप से वही बात है, सिवाय इसके कि 2 बाइट प्रत्येक वर्ण को निर्धारित करते हैं और इसकी विशेषता - उदा। "char_address = display_memory_address + (y * horizontal_resolution + x) * 2"। अन्य पुराने वीजीए मोड (मोनोक्रोम/2-रंग, 4-रंग और 16-रंग मोड) के लिए वीडियो कार्ड की मेमोरी पूरी तरह से व्यवस्थित होती है। यह "विमान" में विभाजित है जहां प्रत्येक विमान में पिक्सेल का एक बिट होता है, और (उदाहरण के लिए) 16-रंग मोड में एक पिक्सेल अपडेट करें, आपको 4 अलग विमानों को लिखने की आवश्यकता है। प्रदर्शन कारणों से वीजीए हार्डवेयर अलग-अलग लिखने के तरीके और विभिन्न पठन मोड का समर्थन करता है, और यह जटिल हो सकता है (यहां तक ​​कि पर्याप्त रूप से वर्णन करने के लिए जटिल)।

भाग 2

मैं/हे बंदरगाहों के लिए (80x86 पर, "पीसी compatibles"), वहाँ 3 सामान्य श्रेणियों। पहला "वास्तविक तथ्य" विरासत डिवाइस है जो निश्चित I/O बंदरगाहों का उपयोग करता है। इसमें पीआईसी चिप्स, आईएसए डीएमए कंट्रोलर, पीएस/2 कंट्रोलर, पीआईटी चिप, सीरियल/समांतर बंदरगाह इत्यादि जैसी चीजें शामिल हैं। लगभग कुछ भी जो इन उपकरणों में से प्रत्येक को प्रोग्राम करने का वर्णन करता है आपको बताएगा कि कौन से I/O बंदरगाह डिवाइस का उपयोग करता है।

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

तीसरी श्रेणी "& खेलने प्लग", जहाँ उपकरण है जो मैं/हे बंदरगाहों का उपयोग करता है (और ज्यादातर मामलों में, मैं/हे बंदरगाहों डिवाइस का उपयोग करता बदलते) पूछ करने के कुछ तरीके वहाँ है। इसका एक उदाहरण पीसीआई है, जहां एक "पीसीआई कॉन्फ़िगरेशन स्पेस" है जो आपको प्रत्येक पीसीआई डिवाइस के बारे में बहुत सारी जानकारी बताती है। इस श्रेणी के लिए, कोई भी तरीका नहीं है कि कौन से डिवाइस रनिंग समय पर किए बिना I/O बंदरगाहों का उपयोग कर रहे हैं, और कुछ BIOS सेटिंग्स को बदलकर 0/इन डिवाइसों को I/O बदलने के लिए कोई भी कारण हो सकता है बंदरगाहों।

यह भी ध्यान दें कि एक इंटेल सीपीयू केवल एक सीपीयू है। "CPU संगत" कंप्यूटर से मूल रूप से भिन्न कुछ ऐसी चीजों में उपयोग होने से उन CPUs को कुछ भी नहीं रोकता है।इंटेल के सीपीयू मैनुअल आपको कभी भी हार्डवेयर के बारे में कुछ भी नहीं बताएंगे जो CPU के बाहर मौजूद है ( चिपसेट या डिवाइस सहित)।

भाग 3

अधिक जानकारी के लिए जाने के लिए शायद सबसे अच्छी जगह (कि ओएस डेवलपर्स/शौक रखने वालों के लिए इरादा है) http://osdev.org/ (उनके विकि और उनके मंचों) है।

यहाँ एएसएम रंग डॉट्स आकर्षित करने के लिए में उदाहरण के लिए, drawn from here:

यह निर्दिष्ट ग्राफिक्स निर्देशांक में स्क्रीन पर एक रंग डॉट बनाता है।

इनपुट:

AH = 0Ch 
AL = Color of the dot 
CX = Screen column (x coordinate) 
DX = Screen row (y coordinate) 

उत्पादन: स्क्रीन पर पिक्सेल को छोड़कर

कुछ भी नहीं।

नोट: यह फ़ंक्शन नए रंग मान के साथ अनन्य OR (XOR) निष्पादित करता है और AL के बिट 7 के पिक्सेल के वर्तमान संदर्भ को सेट किया गया है।

यह प्रोग्राम दर्शाता है कि पिक्सल को कैसे प्लॉट करना है। इसे स्क्रीन के बीच में चार लाल पिक्सेल प्लॉट करना चाहिए।

.model tiny 
.code 
org 100h 
start: 

mov ax,13  ; mode = 13h 
int 10h ; call bios service 

mov ah,0Ch ; function 0Ch 
mov al,4 ; color 4 - red 
mov cx,160 ; x position = 160 
mov dx,100 ; y position = 100 
int 10h ; call BIOS service 

inc dx  ; plot pixel downwards 
int 10h ; call BIOS service 
inc cx  ; plot pixel to right 
int 10h ; call BIOS service 
dec dx  ; plot pixel up 
int 10h ; call BIOS service 

xor ax,ax  ; function 00h - get a key 
int 16h ; call BIOS service 

mov ax,3 ; mode = 3 
int 10h ; call BIOS service 

mov ax,4C00h ; exit to DOS 
int 21h 

end start 

कुछ अनुकूलन इस विधि बहुत तेजी से नहीं है और हम इसे एक बहुत तेजी से बना सकते हैं। कैसे? वीडियो मेमोरी को सीधे लिखकर। यह काफी आसानी से किया जाता है।

वीजीए सेगमेंट 0 ए000h है। काम करने के लिए जहां प्रत्येक पिक्सेल जाता है आप ऑफसेट प्राप्त करने के लिए इस सरल सूत्र का उपयोग करते हैं।

Offset = X + (Y * 320) 

हमें बस इस स्थान पर एक नंबर डाल करने के लिए है और वहाँ अब स्क्रीन पर एक पिक्सेल है। संख्या यह है कि यह रंग क्या है। दो निर्देश हैं जिनका उपयोग हम स्क्रीन पर पिक्सेल डालने के लिए कर सकते हैं, सबसे पहले हम मूल्य को AL से ES में रखने के लिए stosb का उपयोग कर सकते हैं: DI या हम एमओवी निर्देश के नए रूप का उपयोग कर सकते हैं:

mov es:[di], color 

हमें किस का उपयोग करना चाहिए? जब हम स्क्रीन पर पिक्सल लिखने जा रहे हैं, तो हमें जितना तेज़ हो सके उतना तेज़ करने की आवश्यकता है।

Instruction  Pentium 486 386 286 86 

STOSB     3  5  4  3 11 
MOV AL to SEG:OFF  1  1  4  3 10 

आप MOV विधि का उपयोग करें यदि आप डि (जो STOSB करता है) को बढ़ाने के लिए आवश्यकता हो सकती है।

यदि हमारे पास एक प्रोग्राम था जो स्प्राइट्स का उपयोग करता था जिसे लगातार ड्रॉ करने की आवश्यकता होती है, मिटा दी जाती है और फिर आपको फिर से फेंकने में समस्या होती है। से बचें इससे बचें आप 'डबल बफर' का उपयोग कर सकते हैं। यह मेमोरी का एक और हिस्सा है जिसे आप लिखते हैं और फिर सभी जानकारी को स्क्रीन पर कॉपी करें।

+0

स्रोत के लिए लिंक प्रदान करने के अलावा, आपको किसी अन्य स्रोत से कॉपी किए गए किसी भी शब्द को ठीक से ब्लॉक करने की आवश्यकता है। मैंने उत्तर में, साथ ही कॉपी किए गए टेक्स्ट के दूसरे खंड के लिए भी ऐसा किया है। कृपया सुनिश्चित करें कि आप भविष्य में यह स्वयं करते हैं। –

-4

नहीं, आप कंसोल विंडो का केवल एक हिस्सा साफ़ नहीं कर सकते हैं।

+0

से परे है, आप मानक सी ++ में पूर्ण स्क्रीन को भी साफ़ नहीं कर सकते हैं। –

+0

@ बेंजामिनबैनियर मानक का हिस्सा नहीं है, लेकिन आप सिस्टम ("सीएलएस") या सिस्टम ("स्पष्ट") कर सकते हैं जो रीफ्रेश दर बहुत अधिक नहीं होने पर ठीक काम करता है। –

2

यदि आप लिनक्स पर काम कर रहे हैं तो ncurses का उपयोग करें।

उदाहरण:

#include <stdio.h> 
#include <ncurses.h> 
    int main (void) 
    { 
    int a = 0; 
    initscr(); 
    printw("This info stays \n"); 
    printw("This info stays\n"); 
    curs_set (0); 
    while (a < 100) { 
      mvprintw (3, 4, "%d", a++); 
      mvprintw (3, 8, "%d", a++); 
      mvprintw (3, 12, "%d", a++); 
      refresh(); 
      sleep (1); 
    } 
    endwin(); 
    return 0; 
} 
2

आप अधिलेखित कर सकते हैं वर्तमान पंक्ति एक \r, या एक \b मुद्रण द्वारा वर्तमान लाइन पर अंतिम वर्ण को प्रिंट हो।

+0

क्या गलत है, कृपया? '\ R' का उपयोग कर सरल समाधान के लिए – alk

+0

+1। – sujin

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