我的 GTK 程序仍然有问题。
当我点击编码(或解码)按钮时,我收到错误消息:
Segmentation Fault
我认为问题出在函数:ret
和 encode
但找不到它。
//..
//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);
}
最佳答案
这一行没有意义:
g_signal_connect(but,"clicked",G_CALLBACK(encode(tx1,tx2)),NULL);
你正在调用带有一些参数的 encode()
,它返回一个 char
值,(顺便说一句未定义)然后你转换那个 char
进入 GCallback
,这是一个指向函数的指针。然后,当单击按钮时,Gtk+ 将尝试调用您的 char
,这显然不是有效函数,因此会出现段错误。
不确定你想做什么,但你必须玩by the rules , 并且规则规定 "clicked"
回调应该是一个指向这个原型(prototype)的函数指针:
void f(GtkButton *button, gpointer user_data);
除此之外,你玩得很危险。
前面的示例代码
例如,您想要调用函数 encode
并将 char*
作为参数。你可以这样做:
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
的成员函数。可能性是无限的!
我希望这会让你走上正确的轨道......
关于c++ - 为什么会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16658722/