2013-04-28 2 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-ВАЖНЫЙ **: gtk_entry_get_text: утверждение `GTK_IS_ENTRY (запись)» не удалось ошибка сегментации (ядро Думпа d)

enter image description here

+0

'g_print (« Контрольная точка 1 \ n »); // чтобы помочь отладки ' ' input1 = gtk_entry_get_text (entry1); // выбор пользовательских данных из entry1' 'input2 = gtk_entry_get_text (entry2); // выбор пользовательских данных из entry2' 'g_print (« Контрольная точка 2 \ n »); // чтобы помочь debugging' по проверке вывода я смог найти: "Check Point 1" печатается, но не "Контрольная точка 2", это показывает, что есть некоторые проблемы в линии '" input1 = gtk_entry_get_text (entry1) ; // выбор пользовательских данных из entry1 "' – Jayzcode

+0

Я собирался написать, что вы объявляете 'GtkEntry * entry1', но на самом деле не получаете виджет от строителя. Теперь вы изменили свой код, чтобы перейти в 'entry1' в обратном вызове. Возможно ли это? – Mark

+0

Это была ошибка копирования-вставки. Я понял это позже. – Jayzcode

ответ

2

вы передаете 'NULL' для функции обратного вызова здесь:

gtk_builder_connect_signals(builder, NULL);

Также помните, чтобы освободить память, выделенную для * input1, * input2 и * результат.

+0

URL-адрес мертв. – tversteeg

0

Прототип сигнала кнопки нажат неправильно. Оно должно быть (Reference):

void user_function (GtkButton *button, gpointer user_data) 

Вероятно, лучшим вариантом было бы передать в конструктор обратного вызова и извлечения виджетов ввода оттуда (убрать ссылки на него после того, как gtk_main) или передать структуру с обоих виджетов.