abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 0
včera 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 4
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 27
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 790 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: getch() a linux

14.11.2006 22:59 tomas
getch() a linux
Přečteno: 1874×
Ahoj. Viem ze to tu uz bolo spominane, ale s tych clankov som to nepochopil. neviete niekto aka je pod pod linuxom funkcia v C nieco ako je v win funkcia getch() ?

Odpovědi

14.11.2006 23:03 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: getch() a linux
Co dělá getch()?
14.11.2006 23:18 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: getch() a linux
Tady je popis.
14.11.2006 23:04 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: getch() a linux
Těžko říct, záleží na tom, co znamená "nieco ako je v win funkcia getch()" (hint: raději napište, co má dělat). Nějaká funkce getch() je např. v ncurses.
14.11.2006 23:15 tomas
Rozbalit Rozbalit vše Re: getch() a linux
no napr ked stlacim klaves 'a' tak to ma vyvolat polozku v menu bez nutnosti stlacenia klavesy enter
14.11.2006 23:17 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: getch() a linux
V jakém menu? Jestli to chápu dobře, pak ncurses jsou asi právě tím, co hledáte.
14.11.2006 23:20 pasmen | skóre: 45 | blog: glob | Praha
Rozbalit Rozbalit vše Re: getch() a linux
getc() (viz. man 3 getc)
14.11.2006 23:31 tomas
Rozbalit Rozbalit vše Re: getch() a linux
tak ze takto
switch (getch()){
               case 'a' : vypis();
                 break;
             }
tak ze v dose ked stlacim klaves a, tak sa mi tato funkcia vypis hned vyvola, bez toho aby som zadaval za 'a' este 'enter'
Josef Kufner avatar 15.11.2006 00:26 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
To co chceš je knihovna ncurses pomocí které vypneš bufferování na terminálu a pak budeš volat to getch, které v té knihovně je. Není to nijak složité a vyšel tu o tom seriál.
Hello world ! Segmentation fault (core dumped)
15.11.2006 01:54 tomas
Rozbalit Rozbalit vše Re: getch() a linux
a mozes mi napisat prosim link na ten serial, alebo to napisat ako to spravit?
Josef Kufner avatar 16.11.2006 08:21 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
Aha, tak seriál není. Nojo. Takže man nodelay. Mělo by stačit něco takového:
initscr();
nodelay();
getch();
Hello world ! Segmentation fault (core dumped)
15.11.2006 08:56 podlesh | skóre: 37 | Praha
Rozbalit Rozbalit vše Re: getch() a linux
Ještě bych doplnil: přenastavování chování stadardního vstupu/výstupu lze samozřejmě dělat i bez (n)curses, ale bude to hodně složité a málo přenositelné.
15.11.2006 10:45 tomas
Rozbalit Rozbalit vše Re: getch() a linux
moze mi tu niekto napisat ako by vyzral potom tento kuskodu
switch (getch()){
               case 'a' : vypis();
                 break;
             }
16.11.2006 00:01 tomas
Rozbalit Rozbalit vše Re: getch() a linux
niek nevie ?
16.11.2006 08:37 rastos | skóre: 60 | blog: rastos
Rozbalit Rozbalit vše Re: getch() a linux

	initscr();
	cbreak();
	switch(getch())
	{
		case 'a': printf("hallo");
			break;
	}
16.11.2006 22:40 Petr Šobáň | skóre: 79 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: getch() a linux
Čili nějak takto:

#include <ncurses.h>
int main()
{
    initscr();
    cbreak ();
    noecho (); 
    switch(getch())
	{
		case 'a': printfw("hallo"); 
                        refresh();
			break;
	}
    
    endwin();
    return 0;
}
16.11.2006 12:55 tomas
Rozbalit Rozbalit vše Re: getch() a linux
vypise mi to ze
/tmp/ccVbJu1B.o: In function `main':
1.c:(.text+0x573): undefined reference to `initscr'
1.c:(.text+0x578): undefined reference to `cbreak'
1.c:(.text+0x57d): undefined reference to `stdscr'
1.c:(.text+0x585): undefined reference to `wgetch'
collect2: ld returned 1 exit status
16.11.2006 13:53 rastos | skóre: 60 | blog: rastos
Rozbalit Rozbalit vše Re: getch() a linux
Chýba ti prepínač linkera -lcurses
16.11.2006 21:53 tomas
Rozbalit Rozbalit vše Re: getch() a linux
tak toto mi sice skompilovalo, ale zato sa mi nic nezobrazi, ziadne menu programu. a navyse ked program nasilne ukoncim skratkou ctrl+c tak na konzolu sa neda nic pisat!
16.11.2006 22:32 Petr Šobáň | skóre: 79 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: getch() a linux
Jednoduše při ukončení to zase musíš vrátit do pořádku :-)

1.) Skus okno obnovit pomocí refresh ();

2.) Po ukončení musíš zrušit ncurses endwin ();

Příklad:
#include <curses.h>             /* stdio.h neni nutne je v curses.h */
#include <ctype.h>

#define COLOR2      1            /* barvicka 1. */
#define COLOR1      2            /* barvicka 2. */

int main () {
   int      c;
   char      *s;

   initscr ();            
   cbreak ();
   noecho ();                  /* vypnuti echa */
   start_color ();                  /* chceme barvy */
   keypad (stdscr, TRUE);            /* chceme klavesy pod makry KEY_neco */
   curs_set(0);                  /* at tam ta mrska neblika */

   if (!has_colors ()) {            /* umi terminal barvy ? */
       endwin ();
       fputs ("Hmm.. tady barvy nejdou !", stderr); 
       exit (1);
   }
   /*         barva - popredi   -       pozadi            */ 
   init_pair (COLOR1, COLOR_RED,       COLOR_BLUE);      /* barvicka 1. */
   init_pair (COLOR2, COLOR_YELLOW, COLOR_BLACK);      /* a druha */

   attron (COLOR_PAIR( COLOR1 ));                  /* pouzivat barvu 1. */
   mvaddstr (2, 5, "Cervene na modrem");

   attron (COLOR_PAIR( COLOR2 ));
   mvaddstr (3, 5, "Zlute na cernem");

   attron (A_BOLD);                        /* od ted vse BOLD */
   mvaddstr (4, 5, "Zlute na cernem a tucne");

   attroff (COLOR_PAIR( COLOR2 ));                  /* vypne barvu */
   mvhline(LINES-2, 0, ACS_HLINE, COLS);            /* nakresli caru */
   mvaddstr (LINES-1, COLS-15, "F10 - konec");
   mvaddstr (10, 5, "Jmeno klavesy:");

   while ( (c=getch()) != KEY_F(10)) {
           s = (char *) keyname(c);            /* jmeno klavesy ? */
           mvhline(10, 20, ' ', COLS);            /* smaz */
           if (s)
                 mvprintw (10, 20, "'%s'", s);
           else       
                 mvprintw (10, 20, "'%c'", (isprint(c) ? c : '.'));
   }
   erase ();                        /* smaz nase vytvory */      
   refresh ();                        
   endwin ();                        /* konec curses */
   exit (0);                        /* ....bye */
}

Josef Kufner avatar 16.11.2006 22:51 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
Při překladu doporučuju používat -Wall. Pak se nezapomene na #include <stdlib.h> ;-)
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 16.11.2006 22:47 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
initscr();
atexit((void(*)(void))endwin);
cbreak();
refresh();
switch(getch())
{
	case 'a':
		printw("hallo");
		sleep(1);
		break;
}
... nakonec je potřeba zavolat endwin(), jinak ti to nenavrátí terminál do původního stavu. Na psaní a kreslení je potřeba pak používat funkce z knihovny ncurses (např. printw() místo printf()).
Hello world ! Segmentation fault (core dumped)
16.11.2006 22:54 tomas
Rozbalit Rozbalit vše Re: getch() a linux
tak ze spravil som to takto
int main(void){
	int *p_pole = NULL;
	initscr();
	atexit((void(*)(void))endwin);
	cbreak();
	refresh();
	
	while (1){
		printf("\tmenu\n1. obrazok\n2. vypis\n3. vypocitaj\n4. nacitaj hodnoty\n5. usporiadaj\n6. koniec");
    		printf("\n\nzadajte svoju volbu > ");
    		
    		switch (getch()){
      			case '1' : system("clear"); obrazok();
        			break;
      			case '2' : system("clear"); vypis();
      				break;
      			case '3' : system("clear"); vypocitaj();
      				break;
      			case '4' : system("clear"); nacitaj_hodnoty(&p_pole);
      				break;
      			case '5' : system("clear"); usporiadaj(p_pole);
      				break;
      			case '6' : return 0;
    		}
    		//system("clear");
  	}
  	endwin();
}
a po spusteni programu je cista obrazovka
16.11.2006 23:01 Petr Šobáň | skóre: 79 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: getch() a linux
Musí obnovit obrazovku :-) po výpisu.

refresh();
16.11.2006 23:03 Petr Šobáň | skóre: 79 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: getch() a linux
A ještě jsem zapoměl pro výstup použít printw(); :-) a né printf :-)
Josef Kufner avatar 16.11.2006 23:02 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
Kdyz na ni nic nenakreslis... printf() => printw()
system("clear") => clear() ...a jakmile nakreslis vsecko, tak refresh().
Hello world ! Segmentation fault (core dumped)
16.11.2006 23:27 tomas
Rozbalit Rozbalit vše Re: getch() a linux
a nieaka ina funkcia v nieakej inej kniznici nieje? taka aby som mohol pouzivat funkcie zo stdio.h!
Josef Kufner avatar 16.11.2006 23:30 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
man 3 termios ;-)
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 16.11.2006 23:37 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
#include <stdio.h>
#include <termios.h>
 
int main (void) {
	struct termios term;
        tcgetattr(0, &term);
        term.c_lflag &= ~ICANON;
        tcsetattr(0, TCSANOW, &term);
        setbuf(stdin, NULL);
	printf("Press any key to continue...\n");
	getc(stdin);
	return 0;
}
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 16.11.2006 23:39 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: getch() a linux
Jo, ještě pak je dobré to bufferování zase zapnout. Podrobnosti tu.
Hello world ! Segmentation fault (core dumped)
Bluebear avatar 16.11.2006 23:50 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
Rozbalit Rozbalit vše Re: getch() a linux
Pokud v terminálu vypneš bufferování řádků (za normálních okolností terminál nejdřív přečte celou řádku až po enter a teprve potom ji odešle ke zpracování), měla by funkce getc() vracet znak okamžitě poté, co je napsán.

No... aspoň doufám, že to tak nějak je.

Ale opravdu bude myslím jednodušší použít knihovnu ncurses. Mrkni na tenhle howto, tam by měla být popsána většina věcí.

Pokud bys trval na tom to mít v čistém Cčku bez použití externích knihoven, musel bys napsat nějakou takovouhle hrůzu - POZOR, NEZKOUŠEL JSEM TO, JE TO JEN NÁVRH!
    // Přečti nastavení terminálu.
    struct termios terminal_settings, original_terminal_settings;
    if (tcgetattr(input_fd, &terminal_settings) != 0) {
        perror("could not read terminal settings");
        return false;
    }

    // Zapamatuj si je, aby je šlo obnovit na konci programu.
    original_terminal_settings = new struct termios;
    memcpy(
        original_terminal_settings,
        &terminal_settings,
        sizeof(struct termios)
    );

    // Nová nastavení terminálu.
    terminal_settings.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
                    | INLCR | IGNCR | ICRNL | IXON);
    terminal_settings.c_oflag &= ~OPOST;
    terminal_settings.c_oflag |= ONLCR;     // Překlad LF -> CRLF.
    terminal_settings.c_lflag &= ~ECHO;     // Nevypisovat stisknuté klávesy.
    terminal_settings.c_lflag &= ~ECHONL;   // Nevypisovat klávesu Enter.
    terminal_settings.c_lflag &= ~ICANON;   // Vypnout kanonický režim.
    terminal_settings.c_lflag &= ~IEXTEN;   // Vypnout rozšířené zpracování znaků.
    terminal_settings.c_cflag &= ~PARENB;   // Žádná parita.
    terminal_settings.c_cflag &= ~CSIZE;
    terminal_settings.c_cflag |= CS8;       // Osmibitové znaky.

    // Pošli změněná nastavení do terminálu.
    if (tcsetattr(input_fd, TCSADRAIN, &terminal_settings) != 0) {
        perror("could not change terminal settings");
        return false;
    }
Ale pokud budeš chtít kreslit menu, tak musíš ještě řídit pohyb kurzoru, barvy, atd., to znamená posílat správné řídící sekvence (jejich seznam najdeš například zde), a to bude taky slušné maso :-(
To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.