2013-05-20 66 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