2017-12-28 3 views
1

나는 여기에 순수한 C 문제가 있다고 생각한다. GTK와는 아무런 관련이 없다.GTK C - gtk_list_store_set을 먹일 gint64 포인터 값을 얻는다.

나는 GtkEntry의 내용을 retreiving하고 gchar을 다른 함수로 gint64로 변환 한 다음 목록에 추가하려고합니다. 너는 첫 번째 printf이 나에게 올바른 값을 주지만 두 번째 값은 잘못된 값을 준다.

따라서 *c에 포함 된이 값을 gtk_list_store_set에 전달하는 방법을 알 수 없습니다.

void on_button_add_clicked (GtkButton *button, app_widgets *app_wid) { 

     GtkTreeIter iter; 

     //get the entry content 
     gint64 *c = mult_by_100_char2int(gtk_entry_get_text(GTK_ENTRY(app_wid->ent_mont))); 
     printf("c=%li\n",*c); 
     gint64 cval = *c; 
     printf("cval=%li\n",cval); 

     //put in the liststore 
     GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app_wid->treeview))); 
     gtk_list_store_append(store, &iter); // Acquire an iterator 
     gtk_list_store_set(store, &iter, 
      AMOUNT_COLUMN, cval, //the column requires a gint64 
      -1); 

    } 

//prototype of other function is: 
gint64* mult_by_100_char2int (const gchar* number) 

편집 (부가 기능 - 역순)는

gint64* mult_by_100_char2int (const gchar* number) { 

    const gchar* buf1 = mult_by_100(number); 
    gint64 buf2 = g_ascii_strtoll(buf1,NULL,10); 
    gint64 *buf3 = &buf2; 

    return buf3; 

} 

gchar* mult_by_100 (const gchar *number) { 

    int thesize = strlen(number); 

    gchar *entiers = substring(number,0,thesize-3); 
    gchar *centimes = substring(number,thesize-2,2); 
    gchar *result = g_strjoin("",entiers,centimes,NULL); 

    return result; 
    g_free(result); 
} 

gchar* substring(const gchar* s, int p, int l) { 

    char sub[128] = ""; 
    char schar[128] = ""; 
    gchar* result; 
    int i; 

    strcat(schar,s); 

    for(i=0;i<l;i++) { 
     sub[i] = schar[p+i]; 
     //printf("i=%d - sub=%s\n",i,sub); 
    } 
    sub[i+1] = '\0'; 

    result = g_strdup(sub); 
    return result; 
    g_free(result); 
} 
+0

안녕하세요, 아마도 포인터가 혼란 스러울 것입니다. 함수'mult_by_100_char2int'의 내용을 추가 할 수 있습니까? –

+0

좋아, 3 중첩 된 기능을 추가했습니다. –

+0

'mult_by_100_char2int'가 gint64에 대한 포인터를 반환해야합니까? 그 g_free의 반환 후 완전히 중복, 그들은 결코 실행되지 않습니다 ... –

답변

0

buf3mult_by_100_char2int 로컬 변수의 어드레스이다. mult_by_100_char2int이 반환되면이 변수는 더 이상 존재하지 않습니다. 프로그램에는 액세스 할 수 없습니다.

첫 번째 printf이 올바른 결과를 산출 한 것은 불행한 일입니다. 우리는 그것이 일어난 이유를 이론화 할 수 있습니다. (두 번째가 올바르게 작동하는 것처럼 보이게하는 첫 번째 printf의 제거는 놀라지 않을 것입니다.) 그러나 최하위는 그 동작이 정의되지 않았 음을 의미합니다.

+0

감사합니다. 값의 복사본이 콜백 함수 내부에서 작성되었다고 생각했지만 const char/gchar이 아닌 한 포인터의 경우는 아닙니다 ... –

0

Gtk를 사용하여 언급 한 것처럼 포인터에 대한 일반적인 질문입니다. @ user58697 대답은 왜 이런 일이 일어 났는지 설명합니다.

이 문제를 해결하면 mult_by_100_char2int 함수는 로컬 변수에 대한 포인터 대신 gint64를 반환해야합니다.

은 다음과 비슷한 모습이 될 것입니다

gint64 mult_by_100_char2int (const gchar* number) { 

    gchar* buf1 = mult_by_100(number); 
    gint64 retval = g_ascii_strtoll(buf1,NULL,10); 
    g_free (buf1); 

    return retval; 
} 

그런 다음, 콜백 함수가 있어야한다 :

void on_button_add_clicked (GtkButton *button, app_widgets *app_wid) { 

    GtkTreeIter iter; 

    //get the entry content 
    gint64 c = mult_by_100_char2int(gtk_entry_get_text(GTK_ENTRY(app_wid->ent_mont))); 
    printf("c=%li\n",c); 

    //put in the liststore 
    GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app_wid->treeview))); 
    gtk_list_store_append(store, &iter); // Acquire an iterator 
    gtk_list_store_set(store, &iter, 
     AMOUNT_COLUMN, c, //the column requires a gint64 
     -1); 

} 

을 코멘트에 명시된 바와 같이 다른 기능, 중복 g_free 년대, 그래서 그들이해야 이런 식으로 (g_free 호출 만 보았습니다. 다른 조치를 취하지 않으면 코드를 개선 할 수 있습니다).

gchar* mult_by_100 (const gchar *number) { 

    int thesize = strlen(number); 

    gchar *entiers = substring(number,0,thesize-3); 
    gchar *centimes = substring(number,thesize-2,2); 
    gchar *result = g_strjoin("",entiers,centimes,NULL); 

    g_free(entiers); 
    g_free(centimes); 

    return result; 
} 

gchar* substring(const gchar* s, int p, int l) { 

    char sub[128] = ""; 
    char schar[128] = ""; 
    gchar* result; 
    int i; 

    strcat(schar,s); 

    for(i=0;i<l;i++) { 
     sub[i] = schar[p+i]; 
     //printf("i=%d - sub=%s\n",i,sub); 
    } 
    sub[i+1] = '\0'; 

    result = g_strdup(sub); 
    return result; 
} 

코드를 테스트하지는 않았지만 제대로 작동합니다.

+1

실제로 완벽하게 실행됩니다. 감사합니다. 위에서 말했듯이, 나는 함수를 반환하는 포인터의 특이성을 인식하지 못했습니다.내가 다른 게시물에서 방금 읽은 바에 따르면 char 변수는 프로그램의 끝까지 남아 있기 때문에 다릅니다. –