0

次のコード スニペットを実行しようとすると、このエラーと奇妙な意味不明なメッセージが表示され続けます。

エラー:

(foo:11333): Pango-WARNING **: 無効な UTF-8 文字列が pango_layout_set_text() に渡されました

構造定義:

typedef struct chat_info ChatInfo;
struct chat_info {
  GtkWidget *text_line1;
  GtkWidget *text_line2;
  GtkWidget *text_line3;
  GtkWidget *entry;

};

そして、このコードは 3 番目のラベル (2 番目のラベルは空) で奇妙な意味不明な言葉が出てくるようにします。

static void send_message(GtkWidget *window, gpointer data){
    GuiInfo *g = (GuiInfo *) data;


    ChatInfo *c = g->chat;

    const gchar *message = gtk_entry_get_text(GTK_ENTRY(c->entry));  
    const gchar *oldtext1 = gtk_label_get_text( (GtkLabel *) c->text_line1);
    const gchar *oldtext2 = gtk_label_get_text( (GtkLabel *) c->text_line2);

    gtk_label_set_text( (GtkLabel *) c->text_line1, message);
    gtk_label_set_text( (GtkLabel *) c->text_line2, oldtext1);
    gtk_label_set_text( (GtkLabel *) c->text_line3, oldtext2);


}

エラーを調べたところ、おそらく gchar 文字列を指定する必要があるときにポインターアドレスを指定したようなことが原因だと思いますか? しかし、すべてが正しく見えます。

4

1 に答える 1

4

問題は、呼び出しから戻ってきたメモリが、呼び出しによって再び使用する前_get_text()に解放されていることだと思います。GtkLabel_set_text()

たとえば、gtk_label_set_text(c->text_line1, message)取得したポインタをoldtext1無効にする呼び出しを行うと(への呼び出しgtk_label_get_text()は、文字列の内部コピーへのポインタを返します)。

これで、コードを並べ替えて依存関係を削除することで、これを修正できます。

gtk_label_set_text( (GtkLabel *) c->text_line3, oldtext2);
gtk_label_set_text( (GtkLabel *) c->text_line2, oldtext1);
gtk_label_set_text( (GtkLabel *) c->text_line1, message);

または、読みやすくするstrdup()ために、取得した文字列を_get_text()渡して_set_text()、後でそれらを解放する必要があります。

于 2013-02-25T19:31:28.040 に答える