Terminál programozása C-ben

 ( moravas | 2010. december 5., vasárnap - 23:57 )

Sziasztok!

Felvetődött egy olyan problémám, hogy szükségem lenne egy saját terminál programra, ami USB alól kezelget majdan különböző port-port-protokolokat. A segítséget a "megjelenítés"-hez szeretném kérni. Szeretnék úgy kiírni a terminálra, hogy be tudjam mindig állítani hogy hányadik sor és hányadik oszlopra tudjam kiírni az adott karakteremet.Ha jól tudom, ezt egy egyszerű printf() fgv-nyel nem lehetséges.

Előre is köszi
SYN + ACK

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

man ncurses

Lehet curses nélkül is sima printf-t használva escape szekvenciákkal, ha elég az, ha a saját gépen a kedvenc terminálban jól fut.

+1, ha csak kimenet kell. lasd pl itt.

printf("\033[%d;%dH", row, column); /* (1,1) == top left */
fflush(stdout);

azert egy curses vagy termcap ennel nem sokkal bonyolultabb

--
NetBSD - Simplicity is prerequisite for reliability

curses +1 és akkor komplett függvénycsomagod van terminálhoz.

Es meg hordozhato is.

De ha totalisan nem vagy hajlando megtanulni a curses programozasat (noha tenyleg nagyon egyszeru), akkor kezdd a kodot egy

system("tput clear") 

paranccsal, majd amikor pozicionalni akarsz, akkor

system( "tput cm OSZLOP SOR") 

formaban rakod a kurzort ahova akarod :-)

Megjegyzes 1: nem tomi66-nak szol
Megjegyzes 2: baromi ronda megoldas, en kivagnam a kodot, ha en lennek a megrendelo :-)
Megjegyzes 3: man terminfo termcap

Eseteleg 'tput cup 10 10' 'tput cm ...' helyett.

> Es meg hordozhato is.

Khm. Amikor nekem kellett pár éve egy becsületesen crossplatform cuccot írnom, végül arra jutottam, hogy írtam egy kicsi és egyszerű curses-replacementet.

Igaz, hogy akkoriban még AIX4, SunOS 5.2, és FreeBSD 2.2.8 voltak a játékosok, azóta lehet, hogy javult a helyzet...

pár éve
...
AIX4, SunOS 5.2, és FreeBSD 2.2.8

Volt az a "pár" vagy 10-15 is, de ennyi év után ki számolja már, ugye... :P

> Volt az a "pár" vagy 10-15 is, de ennyi év után ki számolja már, ugye... :P

igen, rémlik, hogy akkor még nem csókolomot köszöntek a 18 éves diáklányok... :(

Minden egyes kurzorpozicionáláshoz külső processz indítása (fork+exec+waitpid)? Lesz ám ennek teljesítménye! :)

Lásd b) pont a hozzászólásban.
Mellesleg én már láttam shell-scriptet, amelyik /bin/echo-val intézte a kiíratást (és dd-vel a karakterenkéni beolvasást), nem volt látványosan lassú :-)

valld be, hogy csak menozni akartal :)

--
NetBSD - Simplicity is prerequisite for reliability

moravas
hello!

játszottam kicsit az ncurses.h álltal kinált fgv-kkel, de faladtam amikor a példaprogram az X nélküli terminálban futott(ctrl+alt+F2) de a hagyományos X álltal kezelt terminálban nem.
A példaprogi:
#include

int main () {
initscr (); /* a curses mod inditasa */
printw ("Hello Vilag !!!"); /* kiirjuk a megfelelo szoveget */
refresh (); /* megjelenitjuk a szoveget a "valodi" kepernyon */
endwin (); /* Kilepes a curses modbol*/

return 0;
}
Ha esetleg valakinek van valami ötlete hogy miért nem megy, akkor azt megköszönném.
Üdv

Tettem 5 másodperc késleltetést az endwin() elé. Így szépen működik GNOME terminálban.

Fuszenecker Róbert

moravas
Köszönöm!
Tóth Norbert

Azt meg tudod szuntetni, hogy a nickeddel kezdodjon minden kommented? Halas lennek erte. Meg a szignod ele egy entert, de ez mar nagyon extra...
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Te az a Tóth Norbi vagy, akit ismerek? :-)

Fuszenecker Róbert

Miert, szerinted o ismer teged?
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Mint kiderült, igen :-)

Fuszenecker Róbert

Kukkold meg a minicom forrasat.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

screen-ét is...

Mivel o elsosorban soros portot es ncursest akar osszehozni, a minicom forrasa tobb segitseget tud nyujtani neki. Persze szigoruan SZVSZ.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

slang libraryt használtam ilyesmire régebben.

SLsmg_gotorc és társai valók erre, de még sokkal látványosabb dolgokat is könnyű vele összehozni. Például Midnight Commander felülete is slang.

> Például Midnight Commander felülete is slang.

Vagy ncurses, fordításkor dől el, így distribúció és csomagfüggő.

Igen, csak slang unicode.

Csak most kapcsolódtam be, sok mindent leírtatok, de még pár dolog:

  • Megjelenítéshez én ezt nézegettem annak idején: man console_codes
  • Különböztessük meg a parancssoros és az interaktív programokat; utóbbi esetben érdemes a terminál kanonikus módját kikapcsolni, hogy ne buffereljen enterig. termios.h, tcsetattr(), ICANON. Kilépéskor vissza. Ezt elvégzi az ncurses is, ha használod.
  • Funkcióbillentyűk, kurzornyilak, stb. nagyon máshogy jönnek xterm-ről, rxvt-ről, Linux konzolról - ezt vagy kezelni kell, vagy ncurses-t használni inkább. xterm miatt még az smkx/rmkx módot is kapcsolgatnom kellett, valami billentyű nem működött enélkül...

A conio.h (a bin86 csomag része) mennyire használható?
Egyáltalán van értelme használni?

Ha DOS alatt akarod a kódot futtatni, akkor mindenképpen.
Egyébként nem ér semmit.

"Egyáltalán van értelme használni?"
Nincs.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Linux alatt semmiképpen nem érdemes coniot használni, ez igaz.
De wines gépen karakteres felületen MinGW mellett, ott igenis van értelme. Persze inkább a conio2:

http://conio.sourceforge.net

Ezt persze alapból nem tartalmazza a MinGW, de itt egy kis segítség, ha valaki MinGW-re vetemedik és conio2-öt szeretne:

http://szit.hu/wiki/doku.php?id=c:mingw_conio#coniosfnet

De nekem tokeletes a stdio.h is.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal