[uylug-varios] Ayudita en programación

Francisco Castro fcr at adinet.com.uy
Thu Oct 20 20:31:21 PDT 2011


2011年 10月 20日 木曜日 16:50:17 UYSTに、Sylviaは書きました:
> Es una interfaz ASCII, estoy en primero recién, es todo muy
> sencillo.  El profesor usa conio.h pero yo lo sustituyo por ncurses
> porque no sé de que se pueda instalar conio en Linux.

La biblioteca ncurses es por lejos muchísimo más potente que aquel
conjunto de funciones declaradas en "conio.h". El tema está en que
ncurses es bastante más avanzada y compleja.

En principio hay varios puntos a tener en cuenta:

  * No todos los caracteres ocupan el mismo ancho en una terminal, un
    ejemplo es (con texto en japonés):
      -> Ancho normal (2 columnas por caracter): コンピューター
      -> Ancho medio (1 columna por caracter): コンピューター

  * No todos los caracteres entran en un solo char, por ejemplo el
    caracter ā (a con macrón) ocupa 2 bytes.

  * Existen los llamados caracteres de composición, entre otros, que
    ocupan ancho 0.

  * En el mundo UN*X existen las señales, y por tanto tu programa
    debería prepararse para que, por ejemplo al suspender (con ^Z), se
    restaure la terminal.

  * No todas las terminales soportan las mismas características, ni
    utilizan el mismo protocolo de comunicación.

Es por todo que:
  strlen(str) es distinto de mbstowcs(NULL, str, 0)
  strlen(str) es distinto de ancho(str)
  ancho(str) es distinto de mbstowcs(NULL, str, 0)

O sea, la cantidad de bytes puede ser distinto de la cantidad de
caracteres, y a su vez, estos dos pueden ser distintos del ancho en
columnas que ocuparían al mostrarse, más allá de los \n y \t.

donde:
int ancho(char * str) {
  int n = mbstowcs(NULL, str, 0);
  wchar_t buff[n + 1];
  mbstowcs(buff, str, n);
  return wcswidth(buff, n);
}

Sencillamente no es fácil hacer las cosas bien. Pero ese es el precio a
pagar por tener soporte a multiplataforma, tener soporte a UTF8 (con el
que se puede escribir en inmensa cantidad de idiomas), tener soporte a
multiprocesamiento en la misma terminal, tener soporte a terminales
redimensionables, etc...

Hay por la Internet una multitud de ejemplos que explican cómo
programar utilizando ncurses. ¿Es fácil? No, no lo es.

PD: Si buscás hacer una interfaz de consola en la que aparezcan campos
en donde ingresar texto, botones, checkboxes, radiobuttons, etc, puede
que te convenga revisar la biblioteca newt (que simplifica bastante la
vida en comparación con ncurses, y ni que hablar en comparación con
terminfo).

http://www.pd.infn.it/~saccarol/tutorial.html

-- 
Francisco Castro
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://listas.uylug.org.uy/pipermail/uylug-varios-uylug.org.uy/attachments/20111021/8926381d/attachment-0005.pgp>


More information about the Uylug-varios mailing list