c++, konsola
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
c++, konsola
Jak wiemy, przy robieniu programu aka konsola mamy do czynienia z ekranikiem 80x25 (no można przestawić, ale o takowy mi akurat chodzi ) i w momencie kiedy na przykład walnę w pozycji (80,25) putchar(), to ekran idzie w dół. Jakiś pomysł jak to zatrzymać ? I nie chodzi mi tu o funkcje wscroll z Borlanda bo na Borlandzie nie robię. Z góry dzięki za pomysły.
-
- Użytkownik
- Posty: 852
- Rejestracja: 23 paź 2004, o 10:17
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Pomógł: 28 razy
c++, konsola
a mozesz jasniej? tzn co chcesz osignac gdy kursor jest na koncu ekranu i nastapi putchar ?
-
- Użytkownik
- Posty: 971
- Rejestracja: 27 wrz 2005, o 22:56
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 11 razy
- Pomógł: 75 razy
c++, konsola
Pamiętam ten problem, jeszcze z czasów grzebania się w dosie - o ile się nie mylę, (a mogę się mylić, bo było to jakieś 40 lat temu), to trzeba użyć innej funkcji do wywalania tekstu na ekran - takiej, która nie rusza kursora (kursor chce być widoczny, więc przewija ekran).
Bezpośredni zapis do pamięci ekranu też załatwia sprawę.
Jest także możliwe, że wystarczy ukryć kursor przed wywołaniem funkcji putch.
Bezpośredni zapis do pamięci ekranu też załatwia sprawę.
Jest także możliwe, że wystarczy ukryć kursor przed wywołaniem funkcji putch.
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
c++, konsola
A jak sie odwołać do pamięci ekranu ? Myślę, że to rozwiąże problem, wszak nie wiem na czym to polega ... co do zapytania arigo - chcę żeby kursor nie poszedł dalej, bo jak wstawiam znak w pozycji [x,y] to kursor zaraz potem ląduje w [x+1,y], a jak sie konczy zakres x-ow ( czyli walę putchar dla x=80 ) to leci dopozycji [1,y+1] i dlatego wszystko mi sie wtedy przesuwa ...
-
- Użytkownik
- Posty: 852
- Rejestracja: 23 paź 2004, o 10:17
- Płeć: Mężczyzna
- Lokalizacja: Lublin
- Pomógł: 28 razy
c++, konsola
teraz mniej wiecej rozumiem o co chodzi.
przenosnym rozwiazaniem tego problemu (chociaz nie jakims optymalnym) jest "zmapowanie" ekranu do macierzy znakowej 80x25 i napisanie wlasnych funkcji "putchar" etc ktora dziala na takich tablicach i wykrywa "nielegalne" przejscia kursorai odpowiednio zmienia ta macierz wg naszych zalecen a potem po kazdym takim wywolaniu zrzucac zawartosc tej tablicy na ekran.
ad wypowiezdi Fibika
bezposredni dostep do pamieci ekranu zalatwi sprawe tylko ze takiej funkcjonalnosci nie uzyskasz na poziomie linuxa freebsd windowsa etc gdyz wszystko dziala w trybie chronionym uP wiec magiczne czasy 16bitowego dosa w real mode sie skonczyly
pozdrawiam
przenosnym rozwiazaniem tego problemu (chociaz nie jakims optymalnym) jest "zmapowanie" ekranu do macierzy znakowej 80x25 i napisanie wlasnych funkcji "putchar" etc ktora dziala na takich tablicach i wykrywa "nielegalne" przejscia kursorai odpowiednio zmienia ta macierz wg naszych zalecen a potem po kazdym takim wywolaniu zrzucac zawartosc tej tablicy na ekran.
ad wypowiezdi Fibika
bezposredni dostep do pamieci ekranu zalatwi sprawe tylko ze takiej funkcjonalnosci nie uzyskasz na poziomie linuxa freebsd windowsa etc gdyz wszystko dziala w trybie chronionym uP wiec magiczne czasy 16bitowego dosa w real mode sie skonczyly
pozdrawiam
-
- Użytkownik
- Posty: 971
- Rejestracja: 27 wrz 2005, o 22:56
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Podziękował: 11 razy
- Pomógł: 75 razy
c++, konsola
I. Borland ma funkcję putch() w conio.h, która to załatwia - może jest coś podobnego w console.h lub czymś takim.
II. Ekran (tryb kolorowy) jest zapisany w tablicy pod adresem: 0xB8000000 (segment 0xB800). Jest jeszcze 0xB000 - mono, i 0xA000 - CGA albo coś tam.
char *e = (char*)0xB8000000;
e[0] = 'A'; // litera A jest już w górnym lewym rogu ekranu.
e[1] = 2; // kolor (atrybut) litery A
e[2] = 'B'; // na ekranie widać AB
e[(x+80*y)*2] = 'Q'; // mamy Q w punkcie (x,y) ekranu, x, y
W programie dla DOS to działa (uruchamianym w okienku sys. Windows także).
III. Można jeszcze użyć funkcji z BIOS:
przerwanie 10H
- funkcja 0A - wpisanie znaku w pozycji kursora (bez ruszania kursora)
- funkcja 09 - wpisanie znaku i jego atrybutu w pozycji kursora
II. Ekran (tryb kolorowy) jest zapisany w tablicy pod adresem: 0xB8000000 (segment 0xB800). Jest jeszcze 0xB000 - mono, i 0xA000 - CGA albo coś tam.
char *e = (char*)0xB8000000;
e[0] = 'A'; // litera A jest już w górnym lewym rogu ekranu.
e[1] = 2; // kolor (atrybut) litery A
e[2] = 'B'; // na ekranie widać AB
e[(x+80*y)*2] = 'Q'; // mamy Q w punkcie (x,y) ekranu, x, y
W programie dla DOS to działa (uruchamianym w okienku sys. Windows także).
III. Można jeszcze użyć funkcji z BIOS:
przerwanie 10H
- funkcja 0A - wpisanie znaku w pozycji kursora (bez ruszania kursora)
- funkcja 09 - wpisanie znaku i jego atrybutu w pozycji kursora