У меня есть структура, которую я заполняю, чтобы обновить мой виджет 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:
Текстовое представление отображает грязные строки с @
и я предполагаю, что это как-то связано с отсутствием строки символов с нулевым окончанием или неправильного размера, мое преобразование из строки в символ является подозрительным.
Valid messa@ Valid messa@ Valid message : O@ Valid message : O@
Выход в оболочке:
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...
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 *
,