Skocz do zawartości

Pare Prostych Funkcji W C


piterx

Rekomendowane odpowiedzi

Hey, wie ktos jak sie nazywaja i jak sie uzywa funkcje w C wykonujace (w trybie textowym B) );

:?: przy nacisnieciu wybranego klawisza program od razu cos robi konkretnego (tzn nie trzeba wciskac entera tylko np '1' i juz chodzi)

:?: czysci ekran

:?: losowo wybiera jakies dane (stringi czy liczby)

dzieki za info

Odnośnik do komentarza
Udostępnij na innych stronach

A poza tym google.pl u Ciebie biedaku nie działa, tak? Czy może po prostu łatwiej zapytać na forum i czekać na gotowe? Trochę powagi, bo Twoje pytania są rażąco banalne do rozwikłania jak się poszuka w sieci odpowiedzi.
Odnośnik do komentarza
Udostępnij na innych stronach

joł :D

 

To pod linem nie jest takie proste ale jak znasz się na programowaniu to powinieneś zczaić.

 

Napisze generalnie i wkleje programik który tak działa, sobie przeanalizujesz kod.

 

Generalnie aby (_linuks_ → Linux) ORT wykonywał coś zaraz po naciśnięci klawisz trzeba zmienić tryb konsoli z canonical na non-canonical. Uzykuje się to dzięki strukturze termios załączonej w <termios.h>

Nie wiem czy jest sens tłumaczyć ci tutaj o co chodzi... powiem tak tryb canonical jest domyślnym trybem konsoli, zaś w non-canonical możesz sobie ustawiać takie rzeczy jak to że gdy uzytkownik zostanie poproszony o wpisanie czegoś to program np. wczyta tylko 1 literkę albo 2 albo 3, albo że poczeka 3 sek i jak nic nie wpiszesz to też poleci dalej.

A do funkcji clear <term.h>

 

Dość skomplikowane to jest. Jeśli znasz angielski polecam książkę "Wrox Press - Beginning Linux Programming - 3rd Edition - 2004" (tytuł podaje w ten sposób żeby ci było łatwiej szukać w "księgarni" :)

 

Sposób który tu zamiezam nie jest najłatwiejszy ale ma tą przewagę że działa nawet na UNIX'ach :)

Jeśli chcesz łatwiej zainteresuj się biblioteką curses :) (tak przy okazji jeśli korzystasz z nowyego gcc to przy kompilacji musisz zrobić tak

#g++ -o menu menu.cc -lcurses )

 

KOD#

 

#include <iostream>

#include <stdlib.h>

#include <unistd.h>

#include <termios.h>

#include <term.h>

 

using namespace std;

 

char *menu[] = {

"Wybierz opcję:",

"h - hello",

"j - joł",

"q - papa",

NULL

};

//=======================================================================================

int wybor(char *m[])

{

char **wsk;

wsk = m;

int selected = 0, choose = 0;

 

while(*wsk) {

cout << *wsk << endl;

wsk++;

}

 

selected = getchar();

 

wsk = m;

while(*wsk) {

if(*wsk[0] == selected)

choose = 1;

wsk++;

}

 

if(choose == 1)

return selected;

else

return -1;

}

//==============MAIN=====================================================================

int main(int argc, char *argv[])

{

int choice = 0;

struct termios cti, nti;

 

tcgetattr(1, &cti); //pobiera aktualne ustawienia konsoli bo jak ich potem nie przywrócisz to zostajesz z tym co ustawiłeś

nti = cti;

nti.c_lflag &= ~ICANON; //tu ustawia tryb na non-canonical

nti.c_lflag &= ~ECHO; //wyłącza echo czyli nie zobaczysz co wpisałeś ale inne rzeczy tak

nti.c_cc[VMIN] = 1; //pobierze jeden znak

nti.c_cc[VTIME] = 0; //czas nieograniczony

tcsetattr(1, TCSANOW, &nti);//ustawia nowe atrybuty konsoli

 

do

{

choice = wybor(menu);

if(choice == -1)

cout << "Wybrałeś nieistniejącą opcję." << endl;

else

{

//do tych funkcji jest potrzebny <term.h> opis każdej z nich znajdziesz w man funkcja.

setupterm(NULL, 1, NULL);

char *escape_sequ;

escape_sequ = tigetstr("clear");

putp(escape_sequ);

 

char *position = tigetstr("cup");

escape_sequ = tparm(position, 10, 10);

putp(escape_sequ);

 

if(choice == 'h')

cout << "Hello!" << endl << endl << endl;

if(choice == 'j')

cout << "JOŁ!" << endl << endl << endl;

 

}

}while(choice != 'q');

 

tcsetattr(1, TCSANOW, &cti);

exit(0);

}

//=======================================================================================

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 months later...

A mógłbyś mi napisać, dlaczego przy próbie kompilacji dostaje coś takiego?

/tmp/cca2QF7g.o(.text+0x268): In function `main':
: undefined reference to `setupterm'
/tmp/cca2QF7g.o(.text+0x278): In function `main':
: undefined reference to `tigetstr'
/tmp/cca2QF7g.o(.text+0x28f): In function `main':
: undefined reference to `putp'
/tmp/cca2QF7g.o(.text+0x29f): In function `main':
: undefined reference to `tigetstr'
/tmp/cca2QF7g.o(.text+0x2ba): In function `main':
: undefined reference to `tparm'
/tmp/cca2QF7g.o(.text+0x2d1): In function `main':
: undefined reference to `putp'
collect2: ld returned 1 exit status

Odnośnik do komentarza
Udostępnij na innych stronach

Witam.

 

Ja również próbowałem skompilować ten kod i też sie to nie udało.

 

errory dotyczą braku nagłówka term.h. Możliwe że pod fedorką jest w innym katalogu.

 

Po krótkich poszukiwaniach pliku term.h uzyskałem następujący rezultat:

|13:50:12|~/cpp>find /usr -name "term.h"

/usr/include/ncurses/term.h

/usr/include/ncursesw/term.h

/usr/include/term.h

 

Niestety bez względu na to który z tych plików nagłówkowych wstawię do programu, to rezultat jest taki sam jak u lszk. Z tego wynika, że powód jest jednak inny.

 

Pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Panowie, no co mi pozostaje?

 

To jest właśnie jedna z wad Linuksa. Brak pełnej kombatybiloności między dystrybucjami. Rózne biblioteki w różnych wersjach itp. Z tego powodu powstają właśnie takie biblioteki jak ncurses, które ujednolicają pewne rzeczy.

 

Powiem tak. Program ten mozna napisac dużo prościej właśnie wykorzystując ncurses, jeśli natomiast ktoś bardzo chce się przekonac iż ten programik działa musi go skompilowac pod Debianem....

 

No trudno, to właśnie jesen z powodów dla których tak ciężko o dobre programy pod linuksa.... No ale to zaczyna się zmieniac :D

 

Pozdrawiam

 

[EDIT]

Przetestowałem na Knoppix'sie 3.6 i kod przekopiowany z postu działa, ale coś przy okazji przyszło mi do głowy. Jeśłi dodajecie -lcurses i wysakuje wam taki błąd (ja zapomniałem i włąśnie taki mi wyskoczył) spróbujcie z -lncurses.

 

Zrobie sobie miejsce na dysku i zainstaluje sobie ta Ggabajtożerną Fedorę i wam powiem dokładnie co jest :)

 

Pozdrawiam raz jeszcze.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...