我想这里有一个纯粹的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);
}
答案 0 :(得分:0)
buf3
是mult_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未对代码进行测试,但现在应该可以使用。