2014-04-03 2 views
0

안녕하세요 여러분, 함수 (또는 포인터)에서 파일 이름의 값을 반환하지만 어떻게해야하는지 확실히 알고 싶습니다. 내 파일 이름은/home/username/file이라는 파일 이름에 경로를 저장합니다. 그래서 여기이GTK의 G_CALLBACK에서 파일 이름을 반환합니다.

static void 
show_dialog (GtkWidget *button, 
      gint  response_id, 
      gpointer user_data) 
/* Init filechoosedialog, builder etc */ 
{ 

gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechoosedialog)); 

} 

처럼 내 주요

gchar *filename = NULL; 

button = GTK_WIDGET(gtk_builder_get_object(builder, "button1")); 
g_signal_connect (button, "clicked", G_CALLBACK (show_dialog), &filename); 

그리고 보여 대화 모습은 내가 show_dialog을 gchar하고 정적 무효 show_dialog를 변경해야합니까 끝에 내가 반환 파일 이름을 어떻게해야합니까; 그리고 다른 무엇 임 오류를 그래서

warning: return makes integer from pointer without a cast 

를 컴파일지고 있기 때문에 나는 내 주에 다음과 같은 코드를 추가하고이 오해 같은 소리 파일 이름

if filename != NULL 
g_print ("Selected filename: %s\n", filename); 

답변

1

의 값을 좀하고 싶습니다 선언해야 할 이벤트 중심 프로그래밍. main()에서 이런 일을하지 않으면 이벤트 처리기에서 처리합니다. 귀하의 예에서는 을 show_dialog()으로 부릅니다.

좀 더 복잡한 작업을 원하면 g_signal_connect() userdata 포인터가 사용하는 응용 프로그램 상태를 알아야합니다. 예를 들어 파일 이름을 레이블 텍스트로 설정하려면 레이블에 대한 포인터를 사용자 데이터 포인터로 설정 한 다음 이벤트 처리기에서 레이블 텍스트를 설정할 수 있습니다.

더 일반적으로 userdata 포인터는 무엇이든 될 수 있습니다. 파일 이름 문자열을 저장하는 데 사용할 수있는 데이터 구조입니다. 일반적인 용도는 main에 할당 된 응용 프로그램 데이터 구조체입니다. 구조체는 filename과 같은 모든 "응용 프로그램 전역 변수"를 포함하며 모든 함수가 구조체 내용에 액세스하고 수정할 수 있도록 구조체에 대한 포인터가 모든 GTK + 콜백에 제공됩니다.

g_signal_connect (button, "clicked", G_CALLBACK (button_clicked_cb), &filename); 

static void 
button_clicked_cb (GtkWidget *button, 
        gint  response_id, 
        gpointer user_data) 
{ 
    char **filename_ptr = (char**)user_data; 
    *filename_ptr = g_strdup ("newly allocated string that the filename pointer in main() stack will now point to"); 
} 
+0

그러나 단추 1 프로그램 쇼 filechooserdialog을 클릭에 내가 diferently 그것을 어차피 다음 cshoose 파일 :

문제가 유저 데이터 포인터를 사용하는 경우, 여기에 유저 데이터로 파일 이름에 단지 포인터를 사용하는 예입니다 확인을 클릭 오리지널 show_dialog에서 예를 들어 g_prinf를 가지고 있지만 지금은 주 또는 다른 함수에서 avalible을 갖고 싶습니다. 그리고 나는 그것이 오해라는 것을 이해하지 못합니다. 다른 방법은 없습니다. – Vido

+1

당신이 원하는 것을 설명했다면 우리가 도울 수 있을지도 몰라. "사용자 데이터 포인터로 레이블"예제는 실제로 문자열을 다른 곳에서 사용할 수 있다는 것이 었습니다 ... "main()으로 돌아가는"것은 GTK +와 같은 이벤트 기반 프로그래밍에서 거의 의미가 없습니다.()는 show_dialog()를 직접 호출하지 않으므로 반환 값을 직접 얻을 수 없다는 의미가 있습니다. – jku

+0

좋아요. main()으로 돌아갔습니다. 왜냐하면 filename()을 네 번째 인수로 다른 G_CALLBACK() 함수에 전달해야 할 필요가 있다면, 그렇게 간단하게 계획 했으므로 몇 가지 메모리 관리를 설정하는 것입니다,하지만 먼저 어떻게해야하는지, 그리고 내가 무엇을 필요로하는지 배우는 것이 필요합니다. 어떤 생각이 있습니까? – Vido