2017-12-28 20 views
1

私はここで純粋なCの問題があり、それはGTKとは関係ないと思うが、わからない。GTK C - gtk_list_store_setを供給するためのgint64へのポインタの値を取得

私はGtkEntryの内容を取り戻し、gcharを別の関数でgint64に変換してから、リストに追加したいというこの機能を持っています。あなたは、最初のprintfは私に正しい値を与えますが、2番目の値は間違った値を与えます。

したがって、*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変数とは異なります。 –

関連する問題