목록 저장소 트리 뷰가 있습니다. 해당 항목을 클릭하면 "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);
....................
}
너무 많은 코드를 제거했기 때문에 실제로 무엇을하고 있는지 파악하기가 어렵습니다. – liberforce