2013-05-20 242 views
0

我在我的GTK程序中仍然有問題。爲什麼會出現分段錯誤?

當我點擊編碼(或解碼)按鈕,我得到錯誤信息:

分段錯誤

我認爲這個問題是來自功能:retencode,但無法找到它。

//.. 
    //gets the first argument(buf) 
    tx1=gtk_entry_get_text(GTK_ENTRY(entry)); 
    //... 
    //gets the second argument(pass) 
    tx2=gtk_entry_get_text(GTK_ENTRY(entry)); 
    //.... 
    //signal to callback function encode when button clicked 
    g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL); 
    // ... 
    //convert const char* to char* 
    char* ret (const char *bd){ 
    char *c = new char[12]; 
    strcpy(c,bd); 
    return c; 
} 

//encode function 
char encode(const char ebuf[],const char epass[]) { 
    //This is the complete function I wrote and I am still having the error. 
    char *buf=ret(ebuf); 
    char *pass=ret(epass); 
} 
+2

什麼是ebuf和EPASS的strlens?爲什麼不使用'std :: string'? – user93353

+0

爲什麼不使用調試器? – kotlomoy

+0

它看起來像我在GTK根據什麼rodrigo說 – afr0ck

回答

0

如果你不希望有更多的動態調整大小的字符串,使用strncpy()函數來限制要複製的字符數。

+0

真的錯誤...我可以將其限制爲12個字符 – afr0ck

1

此行是沒有意義的:

g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL); 

要調用encode()一些參數,它返回一個char值,(順便說未定義),你投的是charGCallback,這是一個指針-to-功能。然後,當按鈕被點擊時,Gtk +會嘗試打電話給你的char,這顯然不是一個有效的功能,因此是分段錯誤。

不知道你想要做什麼,但你必須發揮by the rules,規則說,"clicked"回調應該是一個指針到函數的原型如下:比

void f(GtkButton *button, gpointer user_data); 

其他與你打得很危險。

示例代碼AHEAD

說,例如,你想調用函數encodechar*作爲參數。你可以做這樣的:

void clicked_encode(GtkButton *button, gpointer user_data) 
{ 
    char *d = static_cast<char*>(user_data); 
    encode(d); 
} 

並註冊回調

g_signal_connect(but, "clicked", G_CALLBACK(clicked_encode), text); 

這假設內存text生命指着至少只要回調。如果不是的話,你犯了一個副本,但你必須記住釋放它:

char *d = strdup(text); 
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_text, 0); 

//and the deleter function 
void free_text(gpointer *data, GClosure *) 
{ 
    char *d = static_cast<char*>(data); 
    free(d); 
} 

當然,你可能需要在你的功能不止一個參數,但你只能傳遞一個指針。解決方案是定義一個結構(或一個類,你正在使用C++)與其中的一切:

FancyClass *d = new FancyClass(...); 
g_signal_connect_data(but, "clicked", G_CALLBACK(clicked_encode), d, free_fancy_class, 0); 

void clicked_encode(GtkButton *button, gpointer user_data) 
{ 
    FancyClass *d = static_cast<FancyClass*>(user_data); 
    encode(d); 
} 

void free_fancy_class(gpointer *data, GClosure *) 
{ 
    FancyClass *d = static_cast<FancyClass*>(data); 
    delete d; 
} 

嘿!你甚至可以使encode()成爲FancyClass的成員函數。可能性是無止境!

我希望thit會將你在正確的軌道上......

+0

亞兄弟...即時通訊新的GTK ...我讀了約2天..並開始在Linux上編寫應用程序...你能幫我做到這一點? – afr0ck

+0

@ user2355950:我很樂意提供幫助,但您應該澄清您想要做的事情。它也有助於查看一些教程...無論如何看看更新的答案。 – rodrigo

+0

我認爲這足以讓我走上正確的軌道... Thnx非常多的兄弟.. – afr0ck