Я использую C и Glade с GTK 3. Я хочу создать простой язык программирования.Я создал основы: редактор кода, окно вывода и т. Д. Но когда пользователь закрыл окно вывода и попытался открыть его снова, это сообщение показало:
(ltc:3443): GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GObject'
(ltc:3443): GLib-GObject-CRITICAL **: g_object_class_list_properties: assertion 'G_IS_OBJECT_CLASS (class)' failed
Это обработчик событий для выполнения кода:
void on_exec_code() {
gtk_widget_show(execWindow);
execute(buffer, output, NULL);
}
Как мне клонировать окно?Я попробовал простой алгоритм клонирования GObject, но он не клонирует содержимое окна.
А вот функция выполнения кода (с отладкой):
#define DEBUG_OUT(id, text) printf("DEBUG %s: %s\n", id, text);
...
void execute(GtkTextBuffer* code, GtkTextBuffer* output, gchar* currentInput) {
gtk_text_buffer_get_start_iter(code, &iter);
while (!gtk_text_iter_is_end(&iter)) {
gtk_text_iter_forward_cursor_position(&iter);
token_start = iter;
gtk_text_iter_forward_word_end(&iter);
token_end = iter;
token = gtk_text_iter_get_text(&token_start, &token_end);
gtk_text_iter_forward_word_end(&iter);
gtk_text_iter_backward_word_start(&iter);
param_start = iter;
gtk_text_iter_forward_line(&iter);
param_end = iter;
param = gtk_text_iter_get_text(¶m_start, ¶m_end);
DEBUG_OUT("token", token);
DEBUG_OUT("parameter", param);
if (!strcmp(token, "print")) {
gtk_text_buffer_get_end_iter(output, &helper);
gtk_text_buffer_insert(output, &helper, param, strlen(param));
}
else if(!strcmp(token, "get")) {
if(currentInput != NULL) {
/* ... */
}
else return;
}
}
}