GTK C - 获取指向gint64的指针值以提供gtk_list_store_set

时间:2017-12-28 10:59:04

标签: c gtk

我想这里有一个纯粹的C问题而且它与GTK无关,但我不确定。

我有这个函数,我在其中检索GtkEntry的内容,用另一个函数将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);
}

2 个答案:

答案 0 :(得分:0)

buf3mult_by_100_char2int本地变量的地址。 mult_by_100_char2int返回后,此变量不再存在。您的程序无权访问它。

第一个printf产生了正确的结果,这是一个不幸的巧合。我们可以推理它为什么会发生(我不会感到惊讶的是删除第一个printf使第二个看起来正常工作),但底线是行为未定义。

答案 1 :(得分: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;
}

Haven未对代码进行测试,但现在应该可以使用。