2013-04-28 61 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它進入主循環之後)或通過結構既部件。