Fórum Ubuntu CZ/SK
Ostatní => Archiv => Téma založeno: XomboX 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!
-
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(...)
-
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í)
-
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 :-(
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 :-)
-
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():
#include
using namespace std;
int main()
{
cout << "Toto je pauza 5s:" << endl;
sleep(5);
cout << "Konec pauzy." << endl;
return 0;
}
-
#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()
-
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....
-
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 (http://cpp.codenewbie.com/articles/cpp/1437/systemPAUSE-Page_1.html).
-
getchar() funguje trochu jinak - nečeká na stisk libovolné klávesy, ale na stisk enteru.
-
Vsem dekuji za reakce.
Jeste jsem trochu hledal na netu.
man getch:
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:
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").
-
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