在回调

时间:2017-11-22 17:53:29

标签: c linux list gtk

我有一个列表存储树视图。单击其中的一个项目调用“replace_tab”并添加一个后退按钮进行显示。单击后退按钮调用Back.Back。处理程序传递指向列表的指针实例。我在调用后处理程序之前和之后都打印了指针的值。

struct BTDeviceDetails
{
    char*addr;
    char*name;
};

struct node
{
    struct node* next;
    struct BTDeviceDetails * data;
};

struct param
{
    GtkWidget* backbutton;
    GtkWidget* Okbutton;
    GtkWidget* scrolledwindow;
    GtkWidget*newChild;
    GtkWidget*oldChild;
    struct node** start;
};

static void Back (GtkButton *button, gpointer   user_data)
{
      struct param* parameters = (struct param*)user_data;
      printf("\nreplacetab=%p\n",(void*)*(parameters->start)); // prints-> "replacetab=0x7fffcd8b1320"
      ............
}

static void replace_tab(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
{
    struct node * start = 0;
      deviceDiscovery(&start);
    .............
    parameters->start = &start;
    printf("\n replacetab=%p \n",(void*)*(parameters->start)); // prints-> "replacetab=(nil)"
    g_signal_connect(parameters->newChild,"row-activated", G_CALLBACK( registerDevice ) ,&start);
    g_signal_connect(parameters->backbutton, "clicked", G_CALLBACK(Back), (gpointer) parameters);
}

int main()
{
    ....................
    g_signal_connect(treeview, "row-activated", G_CALLBACK(replace_tab), (gpointer) parameters);
    ....................
}

2 个答案:

答案 0 :(得分:1)

你的问题来自于parameters->start = &start;无法在该功能之外工作的事实。您应该通过g_new0g_malloc分配一些内存并将其填充deviceDiscovery,或者deviceDiscovery应该返回一个已分配的节点。因为需要node **,所以更有可能是第二种选择。

然后在你的参数中,不要存储node **start,你只需要内容,而不是我想的存储位置,所以node *start就足够了。然后你就可以写下:

struct node *start = NULL;
deviceDiscovery(&start); // Allocates structure memory and initializes it
// You may want to check if start != NULL to avoid errors later.
parameters->start = start;

答案 1 :(得分:0)

通过将start作为静态变量来解决问题 static struct node * start = 0;