2017-11-22 2 views
0

목록 저장소 트리 뷰가 있습니다. 해당 항목을 클릭하면 "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); 
    .................... 
} 
+0

너무 많은 코드를 제거했기 때문에 실제로 무엇을하고 있는지 파악하기가 어렵습니다. – liberforce

답변

1

parameters->start = &start;은 그 기능 외에서는 작동하지 않을 수 있다는 점에서 문제가 발생합니다. g_new0 또는 g_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; 
0

정적 변수 정적 구조체 노드를 시작함으로써 문제 해결 * 시작 = 0;

+0

이것은 가장 좋은 생각입니다. 단기간에 작동하지만 코드가 더 약해집니다. – liberforce

관련 문제