我想我这里有一个纯 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);
}
buf3
是 mult_by_100_char2int
局部变量的地址。一旦 mult_by_100_char2int
返回,这个变量就不再存在了。您的程序无权访问它。
第一个 printf
产生了正确的结果是一个不幸的巧合。我们可能会推论它为什么会发生(如果删除第一个 printf
使第二个看起来正常工作,我不会感到惊讶),但最重要的是行为是未定义的。
我是一名优秀的程序员,十分优秀!