2012-08-23 5 views
0

GTK +를 배우기 때문에이 간단한 응용 프로그램을 실행할 때마다 충돌이 발생합니다.GTK gtk_label_set_text 분할 오류

주 창에 레이블을 만들고 단추를 클릭 할 때마다 (key_press_event) 레이블과 제목을 바꿔야합니다.

change_title 함수에서 gtk_label_set_text을 주석 처리하면 제목이 올바르게 바뀌고 응용 프로그램이 충돌하지 않습니다. gtk_label_set_text이 내 앱을 왜 크래킹합니까?

#include <gtk/gtk.h> 
#include <string.h> 

const gchar first[]="FIRST"; 
const gchar last[]="LAST"; 

static void destroy(GtkWidget *window,gpointer data) 
{ 
    gtk_main_quit(); 
} 

static gboolean change_title(GtkWidget *widget,GtkLabel *data) 
{ 
    if(strcmp(last,gtk_window_get_title(GTK_WINDOW(widget)))){ 
    gtk_window_set_title(GTK_WINDOW(widget),last); 
    gtk_label_set_text(data,first); 
    } else { 
    gtk_window_set_title(GTK_WINDOW(widget),first); 
    gtk_label_set_text(data,last); 
    } 
    return FALSE; 
} 

int main(int argc,char **argv) 
{ 
    GtkWidget *window, *label; 
    gtk_init(&argc,&argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window),last); 
    gtk_widget_set_size_request(window,300,100); 
    g_signal_connect(window,"destroy_event",G_CALLBACK(destroy),NULL); 

    label = gtk_label_new("caasdasdjadnjadjahadjad"); 
    gtk_container_add(GTK_CONTAINER(window),label); 

    g_signal_connect(window,"key_press_event",G_CALLBACK(change_title),GTK_LABEL(label)); 

    gtk_widget_show_all(window); 

    gtk_main(); 
    return 0; 
}   

편집는 : 나는 GDB를 사용하여 문제를 발견, 라벨 포인터는 change_title 기능이 제대로 전달되지 않습니다. 나는 이유를 모른다. (예는 : change_title() 레이블 main() 라벨 = 0xb6406608 = 0x807bda8에서)

+0

예를 들어 확인해 보셨습니까? 디버거에서 모든 변수가 괜찮습니까? 'NULL' 포인터가 없습니까? –

답변

2

key_press_event에 간단한 구글 검색을 수행 한 후 그 이벤트에 콜백 위젯과 사용자 데이터 포인터 사이의 또 다른 인수를 가지고 보았다. 이것에

gboolean key_event_handler(GtkWidget *widget,GdkEventKey *event, gpointer data); 

그래서 간단한 변경 함수를 : 프로토 타입이있다

static gboolean change_title(GtkWidget *widget, GdkEventKey *event, GtkLabel *data) 

그것은 작동합니다.

+0

감사합니다. 일부 자습서에는 GdkEvent 매개 변수가 포함되지 않았으므로 잊었습니다. 나는 묻기 전에 프로토 타입을 확인 했어야했다. –

1

change_title 함수의 프로토 타입이 잘못되었습니다.

적절한 프로토 타입은 the documentation을 참조하십시오. 대부분 *-event 신호는 처리기 함수에서 인수로 실제 이벤트를 전달합니다. 일반적으로 처리기는 실행하기 위해 이벤트를 검사해야하기 때문입니다. 예를 들어 GdkEventKey 이벤트에는 어떤 키가 눌려 졌는지 (릴리스되었는지)에 대한 정보가 포함됩니다.