gpt4 book ai didi

c++ - 为什么会出现段错误?

转载 作者:行者123 更新时间:2023-11-28 07:36:41 25 4
gpt4 key购买 nike

我的 GTK 程序仍然有问题。

当我点击编码(或解码)按钮时,我收到错误消息:

Segmentation Fault

我认为问题出在函数: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);
}

最佳答案

这一行没有意义:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com