我有一个结构,我填充更新我的textview小部件(注意我混合C和C ++代码,我的编译器是g ++)
struct wdata
{
// some other variables;
// assume all the widget are initiated properly
struct *GUI { all the widgets...};
const char* psText , *csText;
}
在一个线程(与gtk_main线程不同)中,收到某些消息后...状态在texview中报告,并且因为它在不同的线程中运行,我使用gdk_threads_add_idle()
wd->csText = convChar(" Valid message : Ok... \n");
gdk_threads_add_idle(disptext_CS,(void*)wd);
其中包含方法convChar()
和disptext_CS
:
const gchar* convChar(string sc)
{
return sc.c_str();
}
和
gboolean disptext_RFCS(void* wdata)
{
WinData* wd = (WinData*)wdata;
wd->GUI->mark = gtk_text_buffer_get_insert(wd->GUI->buffview);
gtk_text_buffer_get_end_iter(wd->GUI->buffview, &wd->GUI->iter);
gtk_text_buffer_move_mark(wd->GUI->buffview, wd->GUI->mark,
&wd->GUI->iter);
gtk_text_buffer_insert_at_cursor(wd->GUI->buffview, wd->csText, -1);
gtk_text_view_scroll_to_mark(wd->GUI->txtview, wd->GUI->mark, 0.0, TRUE,
1.0, 0.0);
return G_SOURCE_REMOVE;
}
GtkTextview中的输出:
textview显示带有@
的乱码字符串,我认为它与没有空字符串的字符串或大小错误有关,我从字符串到char的转换是可疑的。
Valid messa@ Valid messa@ Valid message : O@ Valid message : O@
shell中的输出:
Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
但我期待这样的事情:
Valid message : Ok...
Valid message : Ok...
Valid message : Ok...
Valid message : Ok...
答案 0 :(得分:0)
const char* psText , csText;
不会创建两个指针。它与
相同const char* psText;
const char csText;
编译器应该警告这个错误,如果没有完全阻止它,通过告诉你csText
的赋值转换指向没有强制转换的整数的指针。
要解决此问题,您需要在两个名称前加*
:
const char *psText, *csText;
此外,您的convChar()
方法不安全:一旦sc
参数超出范围,c_str()
指针将无效。您需要存储它的副本。您可以使用g_strdup()
轻松制作一个;完成后请务必使用g_free()
将其释放。
如果您传递给convChar()
的字符串始终为"string literal"
,则根本不需要该功能;字符串文字的类型已经是const char *
。