Проблемы с отображением строки в gtk3 Textview

У меня есть структура, которую я заполняю, чтобы обновить мой виджет 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...

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 *,

0

Другие решения


По вопросам рекламы [email protected]