2010-07-12 8 views
1

Je reçois une erreur de segmentation en essayant de compiler le code suivant. Ma question est, Est-ce la bonne façon d'obtenir du texte à partir d'un GtkEntry? Si c'est le cas, pourquoi ai-je le défaut de segmentation? Si ce n'est pas le cas, quelle est la bonne façon de récupérer du texte à partir d'un GtkEntry?Obtenir du texte à partir d'un GtkEntry

void dialogoIngresarDados(GtkWidget *window){ 
GtkWidget *dialog; 
GtkWidget *vbox, *button; 
GtkWidget *hBoxDado1, *hBoxDado2, *label1, *label2; 
struct textEntries dados; 

dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
gtk_container_set_border_width(GTK_CONTAINER(dialog),5); 
gtk_widget_set_size_request(dialog ,200, 100); 
gtk_window_set_title(GTK_WINDOW(dialog), "Dados"); 
gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); 

vbox = gtk_vbox_new(FALSE, 0); 

label1 = gtk_label_new("Dado1"); 
label2 = gtk_label_new("Dado2"); 
button = gtk_button_new_from_stock(GTK_STOCK_APPLY); 

dados.entryDado1 = gtk_entry_new_with_max_length(10); 
dados.entryDado2 = gtk_entry_new_with_max_length(10); 

hBoxDado1 = gtk_hbox_new(TRUE,0); 
hBoxDado2 = gtk_hbox_new(TRUE,0); 

gtk_box_pack_start_defaults (GTK_BOX (vbox), hBoxDado1); 
gtk_box_pack_start_defaults (GTK_BOX (vbox), hBoxDado2); 
gtk_box_pack_start_defaults (GTK_BOX (vbox), button); 

gtk_box_pack_start_defaults (GTK_BOX (hBoxDado1), label1); 
gtk_box_pack_start_defaults (GTK_BOX (hBoxDado1), dados.entryDado1); 

gtk_box_pack_start_defaults (GTK_BOX (hBoxDado2), label2); 
gtk_box_pack_start_defaults (GTK_BOX (hBoxDado2), dados.entryDado2); 

gtk_container_add (GTK_CONTAINER(dialog), vbox); 

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados); 
g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(gtk_main_quit), NULL); 

gtk_widget_show_all (dialog); 
} 

Rappel du signal de signal.

void applyIngresarDados(GtkButton *button, struct textEntries *dados){ 
const gchar *dado1; 
const gchar *dado2; 

dado1 = gtk_entry_get_text(GTK_ENTRY(dados->entryDado1)); 
dado2 = gtk_entry_get_text(GTK_ENTRY(dados->entryDado2)); 
} 

Structure contenant les entrées de texte.

struct textEntries{ 
GtkWidget *entryDado1; 
GtkWidget *entryDado2; 
}; 
+0

Avez-vous exécuté le code dans un débogueur? Quelle ligne provoque exactement le segfault? – zdav

+0

La fonction gtk_entry_get_text() provoque le segfault. –

Répondre

4

Dans cette ligne:

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(applyIngresarDados), &dados); 

vous passez un pointeur vers une structure de Dados, qui est pile alloué:

struct textEntries dados; 

Ceci est faux, parce que quand la structure est utilisée dans un rappel , la structure de pile contenant cette structure est détruite et est probablement écrasée par d'autres données. Vous essayez d'accéder aux données garbage dans un gestionnaire de rappel.

+1

Alors, quelle est la bonne façon de le faire? Il est utile de mentionner ici la bonne façon. – inckka

1

signature Vous de rappel doit être comme ça

gboolean appCallBack(GtkWidget*,gpointer); 

Vous pouvez transtyper les gpointer à la structure de votre type. Veuillez créer une entrée en utilisant l'API gtk_entry_new(). Je n'ai trouvé aucune référence dans la documentation de gtk + 2.0 pour gtk_entry_new_with_max_length.

GtkWidget *entry; 
entry = gtk_entry_new(); 

Maintenant, dans votre AppCallback, la fonction peut obtenir le texte d'entrée comme suit.

GtkWidget *entry = (GtkWidget *) callback_data; //data passed in signal connect. 

Ensuite, vous pouvez obtenir le texte de cette entrée à l'appel

gchar *text; 
text = gtk_entry_get_text(GTK_ENTRY(entry)); 

font également les contrôles d'erreur appropriés.

Ou vous pouvez déclarer la structure textentries comme un pointeur.

+0

gtk_entry_new_with_max_length existe, mais il est obsolète depuis Gtk-2.0 et ne devrait pas être utilisé dans un code nouvellement écrit. –

+0

@ Dmitry-Well dans ce cas je pense que le problème existe avec la signature de rappel et le pointeur pour tenir les widgets. –

+0

Changer le pointeur gpointer à un autre type de pointeur comme je l'ai fait fonctionne également. –

Questions connexes