• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Ajuda a perceber algumas funções da biblioteca ncurses.h (em inglês)

7 mensagens neste tópico

Inicialmente coloquei esta dúvida num forum internacional, por isso vou deixar aqui uma citação do meu post nesse fórum (em inglês, pois estou com pouco tempo para o traduzir, mas penso que isso não será problema).

Alguém que tivesse um tempinho e tiver conhecimentos desta biblioteca, agradecia imenso uma ajudazinha a entender algumas das suas funções que estou a usar, mas não tenho a certeza que as esteja a usar correctamente...

Citação
I'm coding this project for university and I started to use just standard header files and code but I then decided to give ncurses a test and I asked the instructor and it was ok with him... Everything seems to be working just fine using the ncurses code and there seems to be plenty of info on the this library on the internet. But there are some things that I haven't yet understood correctly...

By the way, I'm coding this under Gentoo Linux using GCC 4.x.x (can't really remember the exact version number and I'm on Windows right now).

Citação
2.2.2. The mysterious refresh()

The next line printw prints the string "Hello World !!!" on to the screen. This function is analogous to normal printf in all respects except that it prints the data on a window called stdscr at the current (y,x) co-ordinates. Since our present co-ordinates are at 0,0 the string is printed at the left hand corner of the window.

This brings us to that mysterious refresh(). Well, when we called printw the data is actually written to an imaginary window, which is not updated on the screen yet. The job of printw is to update a few flags and data structures and write the data to a buffer corresponding to stdscr. In order to show it on the screen, we need to call refresh() and tell the curses system to dump the contents on the screen.

The philosophy behind all this is to allow the programmer to do multiple updates on the imaginary screen or windows and do a refresh once all his screen update is done. refresh() checks the window and updates only the portion which has been changed. This improves performance and offers greater flexibility too. But, it is sometimes frustrating to beginners. A common mistake committed by beginners is to forget to call refresh() after they did some update through printw() class of functions. I still forget to add it sometimes :-)

1) I didn't understand this explanation for the use of refresh() can anyone give me a better explanation? If possible, with 2 different examples and their behaviors using refresh() and without using it... Cause I don't seem to see any difference. In the same link for that quote, I copied the simple code to print "Hello World" with ncurses and it worked fine, I then removed the refresh() just after the printw() and it also worked fine, so, I don't understand when I should use refresh() and when I should not.

Citação
4.2. raw() and cbreak()

Normally the terminal driver buffers the characters a user types until a new line or carriage return is encountered. But most programs require that the characters be available as soon as the user types them. The above two functions are used to disable line buffering. The difference between these two functions is in the way control characters like suspend (CTRL-Z), interrupt and quit (CTRL-C) are passed to the program. In the raw() mode these characters are directly passed to the program without generating a signal. In the cbreak() mode these control characters are interpreted as any other character by the terminal driver. I personally prefer to use raw() as I can exercise greater control over what the user does.

Citação
7.1. getch() class of functions

These functions read a single character from the terminal. But there are several subtle facts to consider. For example if you don't use the function cbreak(), curses will not read your input characters contiguously but will begin read them only after a new line or an EOF is encountered. In order to avoid this, the cbreak() function must used so that characters are immediately available to your program. Another widely used function is noecho(). As the name suggests, when this function is set (used), the characters that are keyed in by the user will not show up on the screen. The two functions cbreak() and noecho() are typical examples of key management. Functions of this genre are explained in the key management section .

2) I also don't understand this cbreak() thing (and raw()??), I'm using getch() on some functions and I tried to enable cbreak() and not and I don't seem to notice any difference. Also, 2 examples here with their differences would be nice too so I can easily see what's happening cause I can't understand if I should use the cbreak() mode or not in the function I'm using to input strings from the user.

3) For raw() and cbreak() is any of theses modes already enabled at the start when using ncurses? If not, what's the mode enabled by default and what's his behavior?

I would really appreciate some explanations on this subject so I can optimize my project and strip unnecessary code, that I believe it has... And there's a chance I am not using theses functions 100% correctly...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É por estar em inglês ou ninguém sabe o que dizer? :thumbsup:

Deve ser das duas coisas. :P Também não tenho tempo de estar a traduzir e isto é um fórum português por isso acho que devias por isso em português.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então porquê que 80% das noticias estão em inglês? E outros 15% em brasileiro? Deviam ser português... :thumbsup:

Não estou com paciência para traduzir e duvido que mais de 20% do pessoal não saiba inglês...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não experimentei nada do que digo em seguida, estou a responder baseado nas definições que apresentaste (posso portanto estar errado  :thumbsup: )

1. refresh()

conheces o conceito de double buffering? aqui é mais ou menos a mesma coisa, o printw imprime texto num buffer nas coordenadas que lhe deres, e o refresh passa esse buffer para o ecrã. Vantagens disto? se alterares o buffer 100 vezes e só fizeres refresh no fim, a informação só é imprimida no ecrã uma vez, enquanto que se usares um print normal é escrita 100 vezes.

2. raw() e cbreak()

estas são usadas para desactivar o buffering. quando usas o scanf por exemplo o texto que escreves só é lido quando carregas no enter. E se precisares de saber exactamente que letra está a ser escrita assim que ela é escrita?

a diferença entre elas é que o raw distingue caracteres de controlo (CTRL-Z) das outras enquanto que o cbreak não

Isto já é especulação, mas penso que ao alterar do modo raw para cbreak e vice-versa, o getch só varie de comportamento quando utilizares caracteres de controlo.

3. penso que o cbreak esteja por omissão por causa desta passagem na descrição do getch:

For example if you don't use the function cbreak(), curses will not read your input characters contiguously but will begin read them only after a new line or an EOF is encountered.

Visto que não é isto que acontece quando utilizamos o getch sem especificar cbreak nem raw, suponho que seja o cbreak que esteja por omissão

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então porquê que 80% das noticias estão em inglês? E outros 15% em brasileiro? Deviam ser português... :P

Não estou com paciência para traduzir e duvido que mais de 20% do pessoal não saiba inglês...

Estás a exagerar um bocado, mas já que falas nisso até sou da opinião que as noticias deviam estar todas em português. Não vou continuar com off-topic, apenas tenho essa opinião. Porque num fórum inglês também não chegas lá e dizes: "Aqui está este texto em português para quem me quiser ajudar, não importa que só 1% compreenda porque estou com preguiça de traduzir". :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas é completamente diferente chegares a um forum e postares um texto ou uma dúvida numa língua que apenas 1% da comunidade do forum entende, e noutra onde é provavel que prai 90% entenda, no caso do inglês aqui no P@P. Ms deixa lá lol...

@Kyu

Obrigado, acho que já estou a enteder isto... tou a gostar de brincar com o ncures, dá para fazer coisas muito fixes  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora