Glib

De Wiki GNOME Chile
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Tipos de datos de GLib)
(Extracto del Libro GNOME)
 
(No se muestran 10 ediciones intermedias realizadas por un usuario)
Línea 1: Línea 1:
 
== Introducción ==
 
== Introducción ==
glib es una librería que contiene multitud de funcionalidad que es necesaria prácticamente en todos los programas, a la vez que incluye algunas funcionalidades de más alto nivel, como es, por ejemplo, el sistema de objetos. Se podría definir glib como una librería de ayuda para la programaci��n en C, aunque, como vamos a ver, no sólo se queda en ello.
+
glib es una librería que contiene multitud de funcionalidad que es necesaria prácticamente en todos los programas, a la vez que incluye algunas funcionalidades de más alto nivel, como es, por ejemplo, el sistema de objetos. Se podría definir glib como una librería de ayuda para la programación en C, aunque, como vamos a ver, no sólo se queda en ello.
  
 
Nos ofrece lo siguiente:
 
Nos ofrece lo siguiente:
Línea 12: Línea 12:
  
  
== Tipos de datos de GLib ==
+
== Extracto del Libro GNOME ==
  
Dentro de GLib™ está implementada una serie de tipos de datos que nos hace más fácil, si cabe, el tratamiento de los datos y además tiene la propiedad de mejorar la portabilidad de nuestros programas. Los tipos que se usan en GLib™ no son muy diferentes de los que usamos en el estándar de C™. Así que realmente no nos resultará nada complicado acostumbrarnos a usarlos.
+
# Glib
 +
## [[Tipos de datos de GLib]]
 +
## [[Mensajes de salida]]
 +
## [[Trabajar con cadenas]]
 +
## [[Jugando con el tiempo]]
 +
## [[Miscelánea de funciones]]
 +
## [[Bucles de ejecución]]
 +
## [[Tratamiento de archivos y canales de entrada/salida]]
 +
## [[Manejo de memoria dinámica]]
 +
## [[Estructuras de datos: listas enlazadas, pilas y colas]]
 +
## [[Estructuras de datos avanzadas]]
 +
## [[GLib avanzado]]
  
De momento, vamos a comenzar aprendiendo los tipos de GLib™ que corresponden con los del estándar de C™.
+
# Sistema de objetos de GLib.
 +
## [[GObject introducción]]
 +
## [[Gestión dinámica de tipos.]]
 +
## [[Señales]]
 +
## [[GObject, la clase base.]]
 +
## [[Parámetros y valores.]]
  
{| style="width: 80%; background=#cfd5dc; text-align:center"
+
== Ejemplos ==
|+ style="background:#eae8e3" | Tabla 1. Tipos de GLib™ que se corresponden con los del estándar C.
+
|- style="background:#ffefdb; text-align:center"
+
| Tipos GLib™. || Tipos estándar C™.
+
|-
+
| gchar || char
+
|-
+
| gint || int
+
|-
+
| gshort || short
+
|-
+
| glong || long
+
|-
+
| gfloat || float
+
|-
+
| gdouble || double
+
|}
+
  
 +
* Mensajes de Salida
 +
** [[Mensajes_de_salida#Ejemplo_1._Mensajes_de_salida. | Ejemplo 1. Mensajes de salida.]]
 +
** [[Mensajes_de_salida#Ejemplo_2._Personalizaci.C3.B3n_de_mensajes_de_salida. | Ejemplo 2. Personalización de mensajes de salida.]]
 +
** [[Mensajes_de_salida#Ejemplo_3._Depuraci.C3.B3n_de_programas_con_g_assert. | Ejemplo 3. Depuración de programas con g_assert.]]
 +
** [[Mensajes_de_salida#Ejemplo_4._Depuraci.C3.B3n_de_programas_con_g_return_if_fail_y_g_return_val_if_fail. | Ejemplo 4. Depuración de programas con g_return_if_fail y g_return_val_if_fail.]]
 +
** [[Mensajes_de_salida#Ejemplo_5._Uso_de_mensajes_de_registro. | Ejemplo 5. Uso de mensajes de registro.]]
  
Como podemos observar en la tabla, estos tipos no son muy diferentes de los que usamos cuando programamos con los tipos del estándar de C™, aunque es altamente recomendable poner un poco de esfuerzo para acostumbrarse a estos tipos si se va a trabajar con la plataforma GNOME.
+
* Trabajar con cadenas
 +
** [[Trabajar_con_cadenas#Ejemplo_6._Crear_una_cadena_con_GString. |  Ejemplo 6. Crear una cadena con GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_7._A.C3.B1adir_cadena_a_un_GString. |  Ejemplo 7. Añadir cadena a un GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_8._Insertar_una_cadena_a_un_GString. |  Ejemplo 8. Insertar una cadena a un GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_9._Borrar_una_cadena_a_un_GString. |  Ejemplo 9. Borrar una cadena a un GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_10._Crear_texto_preformateado_con_GString. | Ejemplo 10. Crear texto preformateado con GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_11._A.C3.B1adir_texto_preformateado_con_GString. |  Ejemplo 11. Añadir texto preformateado con GString.]]
 +
** [[Trabajar_con_cadenas#Ejemplo_12._A.C3.B1adir_e_insertar_caracteres_a_un_GString. |  Ejemplo 12. Añadir e insertar caracteres a un GString.]]
  
GLib™ también posee una serie de tipos que nos hacen más sencillo el tratamiento de datos. Algunos tienen su correspondencia en C, pero nos hacen más sencillo su uso; otros nos sirven para mantener el mismo tamaño de datos de una plataforma a otra y, finalmente, hay otros que no tienen correspondencia con el estándar de C, pero que nos resultarán bastante útiles.
+
* Jugando con el tiempo
 +
** [[Jugando_con_el_tiempo#Ejemplo_13._Ejemplo_de_uso_de_GTimer |  Ejemplo 13. Ejemplo de uso de GTimer]]
  
 +
* Estructuras de datos: listas enlazadas, pilas y colas
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_14._Insertar_un_nuevo_dato_en_una_posici.C3.B3n_determinada. | Ejemplo 14. Insertar un nuevo dato en una posición determinada.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_15._Par.C3.A1metro_GCompareFunc_para_insertar_en_orden_creciente. |  Ejemplo 15. Parámetro GCompareFunc para insertar en orden creciente.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_16._Insertar_elementos_en_orden_creciente.  | Ejemplo 16. Insertar elementos en orden creciente.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_17._Elimina_un_elemento_de_la_lista. |  Ejemplo 17. Elimina un elemento de la lista.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_18._Funci.C3.B3n_que_imprime_una_lista. | Ejemplo 18. Función que imprime una lista.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_19._Insertar_un_nuevo_dato_en_una_posici.C3.B3n_determinada. | Ejemplo 19. Insertar un nuevo dato en una posición determinada.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_20._Insertar_elementos_en_orden_creciente. | Ejemplo 20. Insertar elementos en orden creciente.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_21._Eliminar_un_elemento_de_la_lista. |  Ejemplo 21. Eliminar un elemento de la lista.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_22._Busca_un_valor_dado_en_la_lista. |  Ejemplo 22. Busca un valor dado en la lista.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_23._Creando_una_nueva_cola. |  Ejemplo 23. Creando una nueva cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_24._Funci.C3.B3n_que_comprueba_si_una_cola_est.C3.A1_vac.C3.ADa. |  Ejemplo 24. Función que comprueba si una cola está vacía.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_25._Funci.C3.B3n_que_consulta_el_frente_de_la_cola. |  Ejemplo 25. Función que consulta el frente de la cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_26._Funci.C3.B3n_que_consulta_el_final_de_la_cola. |  Ejemplo 26. Función que consulta el final de la cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_27._Introducir_un_nuevo_elemento_en_la_cola. |  Ejemplo 27. Introducir un nuevo elemento en la cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_28._Saca_un_elemento_de_la_cola. |  Ejemplo 28. Saca un elemento de la cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_29._Vac.C3.ADa_la_cola. |  Ejemplo 29. Vacía la cola.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_30._Creando_una_nueva_pila. |  Ejemplo 30. Creando una nueva pila.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_31._Funci.C3.B3n_que_comprueba_si_una_pila_est.C3.A1_vac.C3.ADa. |  Ejemplo 31. Función que comprueba si una pila está vacía.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_32._Funci.C3.B3n_que_consulta_la_cima_de_la_pila. |  Ejemplo 32. Función que consulta la cima de la pila.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_33._Introducir_un_nuevo_elemento_en_la_pila. |  Ejemplo 33. Introducir un nuevo elemento en la pila.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_34._Saca_un_elemento_de_la_pila. |  Ejemplo 34. Saca un elemento de la pila.]]
 +
** [[Estructuras_de_datos:_listas_enlazadas%2C_pilas_y_colas#Ejemplo_35._Vac.C3.ADa_la_pila |  Ejemplo 35. Vacía la pila]]
  
 
+
== Enlaces externos ==
{| style="width: 80%; background=#cfd5dc; text-align:left"
+
|+ style="background:#eae8e3" | Tabla 2. Tipos de GLib™ que facilitan el uso de tipos del estándar C.
+
|- style="background:#ffefdb; text-align:center"
+
| Tipos de GLib™ || Tipos del C estándar. || Definición
+
|-
+
| gpointer || rowspan="2" | void * || gpointer es un puntero sin tipo, que luce mejor que escribir void *.
+
|-
+
| gconstpointer || gconstpointer es un puntero a una constante. Los datos a los que apuntan no deberían ser cambiados. Este tipo suele usarse en los prototipos de funciones para indicar que el valor al que apunta la función no debería ser cambiado en el interior de la función.
+
|-
+
| guchar || unsigned char || rowspan="4" | Como se puede observar, estos tipos son idénticos a los tipos de C que carecen de signo, pero con la ventaja de que son más visuales y fáciles de usar.
+
|-
+
| guint || unsigned int
+
|-
+
| gushort || unsigned short
+
|-
+
|gulong || unsigned long
+
|}
+
 
+
 
+
 
+
{| style="width: 80%; background=#cfd5dc; text-align:left"
+
|+ style="background:#eae8e3" | Tabla 3. Tipos de GLib™ que aseguran el tamaño del dato entre plataformas.
+
|- style="background:#ffefdb; text-align:center"
+
| Tipo || Rango de tamaño del dato.
+
|-
+
| gint8 || -128 a 127
+
|-
+
| guint8 || 0 a 255
+
|-
+
| gint16 || -32.768 a 32.767
+
|-
+
| guint16 || 0 a 65535
+
|-
+
| gint32 || -2.147.483.648 a 2.147.483.647
+
|-
+
| guint32 || 0 a 4.294.967.295
+
|-
+
| gint64 || -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
+
|-
+
| guint64 || 0 a 18.446.744.073.709.551.615
+
|}
+
 
+
 
+
{| style="width: 80%; background=#cfd5dc; text-align:left"
+
|+ style="background:#eae8e3" | Tabla 4. Tipos de GLib™ nuevos que no están en el estándar de C.
+
|- style="background:#ffefdb; text-align:center"
+
| Tipos de GLib™ || Definición
+
|-
+
| gboolean || Este tipo es booleano y sólo contendrá los valores TRUE o FALSE.
+
|-
+
| gsize || Es un entero de treinta y dos bits sin signo que sirve para representar tamaños de estructuras de datos.
+
|-
+
| gssize || Es un entero de 32 bits con signo, que sirve para representar tamaños de estructuras de datos.
+
|}
+
 
+
 
+
Quizás, nuestro lector más novato haya saltado de su asiento al ver algunos tipos como gint8, gint16, gsize, etc. Para aliviarle esta posible preocupación, es interesante denotar que cuando se programa con GLib™, los tipos más usados son los char, int, double, etc., aunque ahora usará los mismos, pero con una ge delante del tipo.
+
 
+
 
+
== Mensajes de salida ==
+
 
+
== Trabajar con cadenas ==
+
 
+
== Jugando con el tiempo ==
+
 
+
== Miscelánea de funciones ==
+
 
+
== Bucles de ejecución ==
+
 
+
== Tratamiento de archivos y canales de entrada/salida ==
+
 
+
== Manejo de memoria dinámica ==
+
 
+
== Estructuras de datos: listas enlazadas, pilas y colas ==
+
 
+
== Estructuras de datos avanzadas ==
+
 
+
== GLib™ avanzado ==
+

Última revisión de 22:48 4 ago 2006

Contenido

[editar] Introducción

glib es una librería que contiene multitud de funcionalidad que es necesaria prácticamente en todos los programas, a la vez que incluye algunas funcionalidades de más alto nivel, como es, por ejemplo, el sistema de objetos. Se podría definir glib como una librería de ayuda para la programación en C, aunque, como vamos a ver, no sólo se queda en ello.

Nos ofrece lo siguiente:

  • Tipos de datos portables: debido a las diferencias entre sistemas operativos/arquitecturas en cuanto a los tamaños de los tipos de datos se refiere, se vuelve a veces complejo el hacer que los programas funcionen sin cambios al cambiar de S.O o hardware. Así, glib ofrece una serie de tipos de datos propios (gchar, gint, gint32, guint, guint32, guchar, etc) que permiten al programador abstraerse completamente de esas diferencias.
  • Gestión de memoria: la gestión de memoria es una tarea especialmente delicada, por lo que glib ofrece su ayuda tambien en este campo. Para ello, se ofrecen funciones equivalentes a las funciones de asignación de memoria de la libc que ofrecen un control más exhaustivo de lo que se hace con la memoria.

    Una característica interesante es que las funciones de asignación de memoria de glib (g_malloc, g_malloc0, g_new, g_new0) siempre devuelven un puntero válido, pues siempre intentan varias veces la operación de asignación de memoria si fallara, terminando el programa si, tras un número determinado de intentos, no tiene éxito. Esto nos evita el tener que llenar el código de nuestro programa de comprobaciones.

  • Estructuras de datos: en glib no podían faltar funciones para el tratamiento de estructuras de datos, algo extremadamente comun en la programación en C. Así, tenemos a nuestra disposición funciones para tratar con listas enlazadas (simple y doblemente enlazadas), arrays dinámicos (GArray, GPtrArray...), tablas de "hash" (GHashTable), y otras más, menos comunes, pero que vendrán de maravilla en muchas situaciones.
  • Bucle de ejecución: una de las cosas más interesantes de glib es el bucle de ejecución (GMainLoop) que incluye, que nos permite convertir nuestras aplicaciones en asíncronas, de forma que permanezcan a la escucha de determinados eventos, actuando sólo cuando se produzcan esos eventos, permaneciendo en espera el resto del tiempo. Esto es algo especialmente útil para aplicaciones con interfaz gráfica, como vermos más adelante, pero puede ser muy útil tambien en otras situaciones.

    El tipo de eventos que se pueden usar son alarmas (temporizadores), momentos de inactividad de la aplicación, y, el más interesante de todos, eventos de E/S en ficheros (o tuberías, sockets, etc)

  • Sistema de objetos: el sistema de objetos que, a partir de la versión 2.0 de glib/GTK+, está disponible en glib fue creado inicialmente como parte de GTK+. Pero, durante todo este tiempo, se ha visto que este sistema de objetos, que, básicamente no tiene absolutamente nada que ver con el interfaz gráfico, puede ser muy útil en todo tipo de aplicaciones. Por ello, se ha decidido traspasarlo todo a glib, eso si, manteniendo la compatibilidad, a nivel de código fuente, con las aplicaciones GTK+.
    Este sistema de objetos nos permite usar programación orientada a objetos en C, ofreciéndonos así todas las bondades de esta técnica de programación. Al estar implementado en C, evidentemente el soporte POO no es tan completo como puede serlo en otro lenguaje realmente orientado a objetos, pero esto, más que una desventaja, en ocasiones se convierte en una ventaja, pues nos aleja de algunas de las complejidades de la POO. Aun así, el soporte POO es bastante completo, y nos permite cosas como la herencia de clases, los métodos virtuales.


[editar] Extracto del Libro GNOME

  1. Glib
    1. Tipos de datos de GLib
    2. Mensajes de salida
    3. Trabajar con cadenas
    4. Jugando con el tiempo
    5. Miscelánea de funciones
    6. Bucles de ejecución
    7. Tratamiento de archivos y canales de entrada/salida
    8. Manejo de memoria dinámica
    9. Estructuras de datos: listas enlazadas, pilas y colas
    10. Estructuras de datos avanzadas
    11. GLib avanzado
  1. Sistema de objetos de GLib.
    1. GObject introducción
    2. Gestión dinámica de tipos.
    3. Señales
    4. GObject, la clase base.
    5. Parámetros y valores.

[editar] Ejemplos

[editar] Enlaces externos

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas