Estoy creando un programa que genere sentencias SQL con GTK y C, pero me he topado con algo que creo que es una tontería y aún no lo soluciono:
En la interfaz gráfica tengo un GtkBox que contiene otros contenedores (GtkPaned, GtkBox, GtkBox, GtkBox y GtkScrolledWindow). Estos últimos contienen los widgets con los cuales hago la "magia" en las funciones. Los widgets que necesito son; un GtkTextEntry, un GtkRadioButton y un GtkTextView.
Lo que tengo es lo siguiente:
void generar_sentencia (GtkContainer *caja_principal) {
GList *hijos = gtk_container_get_children (caja_principal);
GtkContainer *panel = g_list_nth_data (hijos, 1);
GtkEntry *entrada = g_list_nth_data (gtk_container_get_children (panel), 1);
GtkEntryBuffer *entrada_buffer = gtk_entry_get_buffer (entrada);
GtkRadioButton *empleos = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 1);
GtkRadioButton *productos = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 2);
GtkRadioButton *servicios = g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 1)), 3);
GtkTextBuffer *texto_buffer = gtk_text_view_get_buffer (g_list_nth_data (gtk_container_get_children (g_list_nth_data (gtk_container_get_children (caja_principal), 3)), 0));
const gchar *separador = ",";
const gchar *espacio = " ";
gchar **nombres = g_strsplit (gtk_entry_buffer_get_text (entrada_buffer), separador, 0);
gchar *campos_cotejamiento;
gchar *sentencia_sql;
GtkTextIter iter_final;
int i = 0;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (empleos))) {
campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Categoría varchar(50), Salario int(12), Modalidad varchar(50), Comuna varchar(50), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (productos))) {
campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Precio int(12), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";
}
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (servicios))) {
campos_cotejamiento = "(Id int(30) not null auto_increment primary key, Título varchar(100), Descripción varchar(300), Categoría varchar(50), Precio int(12), Nombre varchar(200), Correo_electrónico varchar(100), Teléfono int(8), Fecha timestamp, Ip varchar(12)) character set latin1 collate latin1_spanish_ci;";
}
while (nombres[i] != NULL) {
sentencia_sql = g_strjoin (espacio, g_strchug (nombres[i]), campos_cotejamiento, NULL);
gtk_text_buffer_get_end_iter (texto_buffer, &iter_final);
gtk_text_buffer_insert (texto_buffer, &iter_final, sentencia_sql, -1);
i++;
}
}
Cuando lo ejecuto en la terminal me aparece lo siguiente:
EXECUTING:
/home/pablo/creasent-sql/Debug/src/creasent_sql
(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_entry_get_buffer: assertion `GTK_IS_ENTRY (entry)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_container_foreach: assertion `GTK_IS_CONTAINER (container)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_text_view_get_buffer: assertion `GTK_IS_TEXT_VIEW (text_view)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_entry_buffer_get_text: assertion `GTK_IS_ENTRY_BUFFER (buffer)' failed
(creasent_sql:3267): GLib-CRITICAL **: g_strsplit: assertion `string != NULL' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed
(creasent_sql:3267): Gtk-CRITICAL **: gtk_toggle_button_get_active: assertion `GTK_IS_TOGGLE_BUTTON (toggle_button)' failed
Program has been terminated receiving signal 11 (Segmentation fault)
Press the Enter key to close this terminal ...
No entiendo a que se refieren estos errores, pues no veo que esté mezclando "peras con manzanas".
No sé si me puedan ayudar, ya que es una pregunta bien específica, de antemano gracias.