2013-04-28 57 views
2

我试图创建一个简单的应用程序,接受两个整数并单击显示的两个和“求和”按钮Glade3和C编程

而且我是新来Glade3,所以你可以期待的失误

/* 
* Compile me with: 
* gcc -o test test.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0) 
*/ 

#include <gtk/gtk.h> 

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 

GtkBuilder *builder; 

GtkWidget *window; 

GError  *error = NULL; 

void on_button1_clicked(GtkButton *button1, GtkEntry *entry1, GtkEntry *entry2, GtkEntry *entry3) 
{ 

    const char *input1 = (const char *)malloc(20); 
    const char *input2 = (const char *)malloc(20); 
    char *result = (char *)malloc(20); 
    int input1_int, input2_int, result_int; 

    g_print ("Check point 1\n"); //to help debugging 
    input1 = gtk_entry_get_text(entry1); //fetching user data from entry1 
    input2 = gtk_entry_get_text(entry2); //fetching user data from entry2 
    g_print ("Check point 2\n"); //to help debugging 

    input1_int = atoi(input1); // String to Integer Conversion 
    input2_int = atoi(input2); 

    result_int = input1_int + input2_int; //Sum operation 

    sprintf(result, "%d", result_int); 

    gtk_entry_set_text(entry3, result); //Pushing result of Sum operation into Entry3 
} 

void on_window1_destroy (GtkObject *object, gpointer user_data) 
{ 
    gtk_main_quit(); 
} 

int main(int argc, char **argv)` 
{ 

    /* Init GTK+ */ 
    gtk_init(&argc, &argv); 

    /* Create new GtkBuilder object */ 
    builder = gtk_builder_new(); 

    /* Load UI from file. 
    * Replace "sum.glade" with your saved project. */ 
    if(! gtk_builder_add_from_file(builder, "sum.glade", &error)) 
    { 
     g_warning("%s", error->message); 
     g_free(error); 
     return(1); 
    } 

    /* Get main window pointer from UI */ 
    window = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 

    /* Connect signals */ 
    gtk_builder_connect_signals(builder, NULL); 

    /* Destroy builder, since we don't need it anymore */ 
    g_object_unref(G_OBJECT(builder)); 

    /* Show window. All other widgets are automatically shown by GtkBuilder */ 
    gtk_widget_show(window); 

    /* Start main loop */ 
    gtk_main(); 

    return(0); 

} 

输出: 检查点1

(测试:10082):GTK的CRITICAL **:gtk_entry_get_text:断言`GTK_IS_ENTRY(项)”失败分段故障(核心dumpe d)

enter image description here

+0

'g_print(“Check point 1 \ n”); //帮助调试' 'input1 = gtk_entry_get_text(entry1); //从entry1获取用户数据' 'input2 = gtk_entry_get_text(entry2); //从入口2获取用户数据' 'g_print(“Check point 2 \ n”); //帮助debugging' 上检查输出我能找到的:“检查点1”打印,但不是“检查点2”,这说明存在一些线问题 '“输入1 = gtk_entry_get_text(取值范) ; //从entry1获取用户数据“' – Jayzcode 2013-04-28 13:17:55

+0

我打算写出你正在声明'GtkEntry * entry1',但从未真正从构建器获取该构件。现在你已经改变了你的代码在回调中传入'entry1'。这甚至有可能吗? – Mark 2013-04-28 14:47:38

+0

这是一个复制粘贴错误。我后来意识到它。 – Jayzcode 2013-04-28 17:31:00

回答

2

你逝去的 'NULL' 的回调函数在这里:

gtk_builder_connect_signals(builder, NULL);

还记得分配给*输入1*输入2可用内存*结果

+0

该URL已死。 – tversteeg 2017-03-23 09:12:09

0

按钮点击信号的原型是错误的。它应该是(Reference):

void user_function (GtkButton *button, gpointer user_data) 

也许是最好的办法是制造商进入回调和检索从那里进入小部件(UNREF它进入主循环之后)或通过结构既部件。