Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Programovani v jazyku C pod linuxem - problem s getch()  (Přečteno 4488 krát)

XomboX

  • Aktivní člen
  • *
  • Příspěvků: 454
Programovani v jazyku C pod linuxem - problem s getch()
« kdy: 18 Dubna 2007, 19:57:00 »
Ve skole mame zaklady programovani v jazyku C, stahnul jsem si Anjutu. Avsak pri programovani jsem narazil na par problem. Funkce, ktere bezne pri programovani v Ccku pod Windows (vyvojove prostredi Dev- C++) pouzivam mi najednou v linuxu nejdou :-( Dokonce jsem zkousel zkopirovat i vsechny hlavickove soubory z win do slozky v /usr/include/ ale stejne mi anjuta pise error, ze funkci getch nezna.
Stejne tak nezna napriklad prikazy system("pause") apod.

Daji se tyto, z meho pohledu nedostatky, opravit?
Existuje nejaka tabulka ekvivalentnich funkci pro linux?

Dekuji za odpovedi!
Asus A6JC-Q003, Ubuntu
Jabber: xombox@jabbim.cz
Ubuntu User number is #12210  Monday, applications choke Tuesday, Wednesday, RAID set's broke Thursday, let out the magic smoke but on Friday, I patch bugs Monday, my xorg conf is toast Tuesday, Wednesday, CPU roasts Thursday, it won't even POST but on Friday, I patch bugs

zigi

  • Aktivní člen
  • *
  • Příspěvků: 389
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #1 kdy: 19 Dubna 2007, 13:31:26 »
nevim jak presne je to s fci getch(), ale system("pause") je windowsoidni zalezitost.. programy ktere pises ve windows se ti nemusi podarit zkompilovat pokud  vyuzivaji win32api ci jine windows zavisle funkce

system("pause") ~ scanf(...)
..:: be free - use kubuntu ::..

Adam Trhoň

  • Návštěvník
  • Příspěvků: 75
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #2 kdy: 19 Dubna 2007, 19:46:08 »
V Ubuntu funkce getch() vůbec není. Místo ní můžete použít getchar(). Ona totiž getch() ani není součást standartu: zkuste si ve win přidat do parametrů kompilátoru -Wall (zapne všechny warningy) a bude vám hlásit, že chybí prototyp getch(). Její deklarace se (v Dev C++) nachází v hlavičkovém souboru conio.h. Pokud by vám getchar() nevyhovoval, tak napište, pošku vám funkci z jedné knihy (Pavel Herout: Učebnice jazyka C, 2.díl, 2.vydání)

XomboX

  • Aktivní člen
  • *
  • Příspěvků: 454
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #3 kdy: 19 Dubna 2007, 22:33:19 »
Citace: "zigi"
system("pause") ~ scanf(...)
S funkci scanf funkci system("pause") nahradit neumim. Vim, ze existuje v linuxu system("clear") misto system("cls"), neni neco podobneho?
Zkousel jsem najit na netu rejstrik funkci v cecku pod linuxem, ale neuspesne :-(


Citace: adam2
V Ubuntu funkce getch() vůbec není. Místo ní můžete použít getchar(). Ona totiž getch() ani není součást standartu: zkuste si ve win přidat do parametrů kompilátoru -Wall (zapne všechny warningy) a bude vám hlásit, že chybí prototyp getch(). Její deklarace se (v Dev C++) nachází v hlavičkovém souboru conio.h. Pokud by vám getchar() nevyhovoval, tak napište, pošku vám funkci z jedné knihy (Pavel Herout: Učebnice jazyka C, 2.díl, 2.vydání)
Mate pravdu, funkce getchar() je skoro stejna jako getch(), akorat mi vadi, ze se po zadani znaku musi jeste zmacknout enter :-( Kazdopadne dekuji!! Alespon mi program uz jakztak funguje.

A neexistuje tedy nejaka prehledna tabulka, kde by byly vypsane windowske nestandartni funkce a k nim ekvivalentni standartni funkce?
Bojim se totiz, ze funkce getch() je jedna z mnoha, ktere me (po)trapi.

Jinak knihu Ucebnice jazyka C od P. Herouta mam, avsak zatim pouze prvni dil :-)
Asus A6JC-Q003, Ubuntu
Jabber: xombox@jabbim.cz
Ubuntu User number is #12210  Monday, applications choke Tuesday, Wednesday, RAID set's broke Thursday, let out the magic smoke but on Friday, I patch bugs Monday, my xorg conf is toast Tuesday, Wednesday, CPU roasts Thursday, it won't even POST but on Friday, I patch bugs

Michal Breškovec

  • Stálý člen
  • **
  • Příspěvků: 1185
  • skill :: aggressive-llama
    • MojeID
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #4 kdy: 19 Dubna 2007, 22:42:48 »
Pokud budeš psát podle ANSI C, mělo by ti všecko chodit. Všechny učebnice co jsem zatím viděl se drželi ANSI verze a nepoužívaly nestandardní, nebo platformově závislé funkce.

Pokud potřebuješ pauzu, jestli jsem tu funkci system("pause") správně pochopil, tak můžeš zkusit použít fukci sleep():
Kód: [Vybrat]
#include
using namespace std;

int main()
{
        cout << "Toto je pauza 5s:" << endl;
        sleep(5);
        cout << "Konec pauzy." << endl;

        return 0;
}
Kubuntu forever :-)

Adam Trhoň

  • Návštěvník
  • Příspěvků: 75
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #5 kdy: 21 Dubna 2007, 14:23:06 »
#include
#include
#include
#include

int kbhit (void)
{
  char c;
  static struct termios new_term;
  static struct termios old_term;
  static int handle;
  static int init = 0;

  fflush(stdout);

  if (init == 0) {
    init = 1;
    if ((handle = open("/dev/tty", O_RDWR | O_SYNC)) == 0) {
      fprintf(stderr, "Nelze cist z terminalu!\n");
      exit(1);
    } else {
      tcgetattr(handle, &old_term);
      new_term = old_term;
      new_term.c_lflag &= ~ICANON;
      new_term.c_lflag &= ~ECHO;
      new_term.c_cc[VMIN] = 0;
      new_term.c_cc[VTIME] = 1;
    }
  }

  tcsetattr(handle, TCSANOW, &new_term);
  if (read(handle, &c, 1) <= 0) {
    c = 0;
  } else {
    ungetc(c, stdin);
  }
  tcsetattr(handle, TCSANOW, &old_term);

  return c;
}

int main (void)
{
   int c;
   while (1) {
      putchar('>');
      if (( c = kbhit()) != 0) {
         printf ("Stisknuta klavesa %c\n", c);
         
         if (c == 'z') break;
      }
   }
   
   return 0;
}


Takto vypadá ta zmiňovaná funkce z knihy. Jak autor píše, je dost pomalá, ale je to možnost, kterou lze použít.
zigi psal o použití funkce scanf, vypadalo by to nějak takto: scanf ("%*c"); (hvězdička znamená, že se načtená hodnota zahodí a nebude se nikam ukládat), ale řekl bych, že je to jenom složitější alternativa k getchar()

Adam Trhoň

  • Návštěvník
  • Příspěvků: 75
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #6 kdy: 21 Dubna 2007, 14:28:15 »
Citace: corwin78
Pokud potřebuješ pauzu, jestli jsem tu funkci system("pause") správně pochopil, tak můžeš zkusit použít fukci sleep():
funkce pause ve win funguje tak, že pozastaví běh programu do stisku nějaké klávesy. Esi existuje něco takového v Linuxu by mě taky zajímalo, sám nevím....

Michal Breškovec

  • Stálý člen
  • **
  • Příspěvků: 1185
  • skill :: aggressive-llama
    • MojeID
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #7 kdy: 21 Dubna 2007, 14:32:39 »
Citace: adam2
Citace: corwin78
Pokud potřebuješ pauzu, jestli jsem tu funkci system("pause") správně pochopil, tak můžeš zkusit použít fukci sleep():
funkce pause ve win funguje tak, že pozastaví běh programu do stisku nějaké klávesy. Esi existuje něco takového v Linuxu by mě taky zajímalo, sám nevím....
V tom případě by měl stačil obyčejný getchar(), ne? V rychlosti na mě Google vyplivl toto.
Kubuntu forever :-)

Adam Trhoň

  • Návštěvník
  • Příspěvků: 75
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #8 kdy: 21 Dubna 2007, 14:50:31 »
getchar() funguje trochu jinak - nečeká na stisk libovolné klávesy, ale na stisk enteru.

XomboX

  • Aktivní člen
  • *
  • Příspěvků: 454
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #9 kdy: 22 Dubna 2007, 10:07:47 »
Vsem dekuji za reakce.
Jeste jsem trochu hledal na netu.
man getch:
Kód: [Vybrat]
NAME
       getch, wgetch, mvgetch, mvwgetch, ungetch, has_key - get (or push back)
       characters from curses terminal keyboard

SYNOPSIS
       #include

       int getch(void);
       int wgetch(WINDOW *win);
       int mvgetch(int y, int x);
       int mvwgetch(WINDOW *win, int y, int x);
       int ungetch(int ch);
       int has_key(int ch);

DESCRIPTION
       The getch, wgetch, mvgetch and mvwgetch, routines read a character from
       the window.  In no-delay mode, if no input is waiting, the value ERR is
       returned.  In delay mode, the program waits  until  the  system  passes
       text  through to the program.
Zkousel jsem tedy getch() s danym includovanym hlavickovym souborem, ale Anjuta mi hlasi chybu:
Kód: [Vybrat]
undefined reference to "stdscr"
undefined reference to "wgetch"
Pokud se nam podari zprovoznit ekvivalent k fuknci getch() ve windows, mame tim padem i funkci system("pause").
Asus A6JC-Q003, Ubuntu
Jabber: xombox@jabbim.cz
Ubuntu User number is #12210  Monday, applications choke Tuesday, Wednesday, RAID set's broke Thursday, let out the magic smoke but on Friday, I patch bugs Monday, my xorg conf is toast Tuesday, Wednesday, CPU roasts Thursday, it won't even POST but on Friday, I patch bugs

Michal Breškovec

  • Stálý člen
  • **
  • Příspěvků: 1185
  • skill :: aggressive-llama
    • MojeID
Programovani v jazyku C pod linuxem - problem s getch()
« Odpověď #10 kdy: 22 Dubna 2007, 21:08:50 »
To je vážně oříšek, asi to budeš muset dělat pro Windows tak jak jsi zvyklý a pro Linux pomocí curses. Viz: http://www.phim.unibe.ch/comp_doc/c_manual/C/FUNCTIONS/getchar.html
Kubuntu forever :-)

 

Provoz zaštiťuje spolek OpenAlt.