2012-01-21 8 views
7

enter image description herePostacie nakładających kiedy zmieniły kolor i są drukowane w tył

Jak widać górne ciemne X. są cięte, chociaż nie ma miejsca dla nich.

Dzieje się tak, ponieważ zmieniły kolor i są drukowane wstecz (od prawej do lewej).

Czy to błąd, wadliwy kod, złe ustawienie w moim systemie lub (wątpię w to), tak jak powinno być?

Oto kod, który generuje ten wyjściowe:

#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

Skąd wiesz, że to dlatego, że są do tyłu? Może powinieneś użyć litery, która wygląda inaczej po napisaniu wstecz, np. 'F' –

+0

@Seth: Zalastax oznacza, że ​​znaki są wyświetlane sekwencyjnie od prawej do lewej. To wygląda jak błąd w kodzie wyświetlania konsoli do mnie. – TonyK

+0

Mogę odtworzyć to zachowanie, używając g ++ w wersji 4.5.2 na Windows 7. Dziwne! – TonyK

Odpowiedz

4

Jest to błąd w systemie Windows.

Jak wspomniano w errata przez Hans Passant:

I powtórzenia błędu też VS2008 na Win7. Fajny błąd. Zmiana czcionki konsoli naprawia ją.

Użyjmy izolacji tego błędu. Rozpoznaję tę czcionkę jako PetiteTerminal, co oznacza, że ​​najprawdopodobniej skonfigurowałeś ten projekt jako aplikację Win32 Console. Dodatkowa repro z GCC potwierdza tę hipotezę i przyjmujemy, z praktycznego punktu widzenia, że ​​wszyscy otrzymaliście 32-bitową aplikację konsolową działającą w terminalu Windows.

Kwestia staje dlaczego to pisanie dokładnie jedną dodatkową kolumnę pikseli w kontekście czcionki domyślnej terminali, kolor 8 i do tyłu piśmie do console screen buffer.

Zwłaszcza Złammy tego problemu aż do jego składowej sztuk:

  1. Gdy zapis jest wydawane, postać jest napisane na miejscu w tablicy terminala
  2. Kiedy (7) jest wybrany domyślny kolor pikseli nie zrobić przelew do innych buforów withi n Tablica
  3. Gdy wybrano kolor 8, dodatkowa kolumna pikseli są zapisywane do następnej strefy bufora, który jest widoczny tylko wtedy, gdy tekst odmawia tyłu

powodu obecności przelaniem w (3), to jest błąd.

Quoting Raymond Chen:

Konsola renderowania modelu zakłada każda postać pasuje do wnętrza swojej stałej wielkości komórki. Kiedy nowa litera jest zapisana w komórce, stara komórka jest nadpisywana nowym znakiem, ale jeśli stary znak ma zwis lub zwis, te dodatkowe piksele pozostawiają je za "przelane" wymaganą komórkę i zainfekowane. sąsiednie komórki. Podobnie, jeśli sąsiednia postać "przelała się", te "piksele spillover" zostaną usunięte.

Zestaw czcionek, których można użyć w oknie konsoli, został przycięty do czcionek, które zostały przetestowane i działają prawidłowo w oknach konsoli . W przypadku systemów angielskich doprowadziło to do konsoli Lucida Console i Terminal.

...

„Dobrze, że to głupie. Powinieneś zatrzymał mnie od wyboru czcionki że tak wyraźnie skutkuje nonsensu”.

I to właśnie zrobiliśmy.

Nie dlatego, że obwiniam Raymonda za to, ale autorytatywnie ilustruje to jako "nie może się zdarzyć".

Wybór i testowanie czcionek konsolowych dla systemu Windows powinno zostać wykryte. Fakt, że w ogóle jest to problem, to aberracja.

Powiązane problemy