Не могу понять странную ошибку времени выполнения C.Нужна помощь? - PullRequest
0 голосов
/ 23 сентября 2011

Я пытаюсь освоить библиотеку GObject. Поэтому я попытался создать простой Gtk + Custom Widget, унаследовав его от GtkHBox. Я не могу понять, в чем проблема или даже где проблема, поэтому мне придется вставить весь код. Вот код:

notetab.h

#ifndef NOTETAB_H
#define NOTETAB_H

G_BEGIN_DECLS

#define PRO_NOTE_TAB(obj) GTK_CHECK_CAST(obj, pro_note_tab_get_type (), ProNoteTab)
#define GTK_CPU_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, pro_note_tab_get_type(), ProNoteTabClass)
#define GTK_IS_CPU(obj) GTK_CHECK_TYPE(obj, pro_note_tab_get_type())

typedef struct _ProNoteTab ProNoteTab;
typedef struct _ProNoteTabClass ProNoteTabClass;

struct _ProNoteTab
{
    GtkWidget hbox;
    GtkObject parent_instance;
    GtkLabel label;
    GtkButton cbtn;
};

struct _ProNoteTabClass
{
    GtkHBoxClass parent_class;
};

GtkType pro_note_tab_get_type(void);
GtkWidget* pro_note_tab_new(void);

G_END_DECLS

#endif

notetab.c

#include "common.h"
#include "notetab.h"

GtkType pro_note_tab_get_type()
{
    GtkType pro_note_tab_type = 0;

    if (!pro_note_tab_get_type)
    {
        static const GtkTypeInfo pro_note_tab_info =
        {
            "ProNoteTab",
            sizeof(ProNoteTab),
            sizeof(ProNoteTabClass),
            (GtkClassInitFunc) NULL,
            (GtkObjectInitFunc) NULL,
            NULL,
            NULL,
            (GtkClassInitFunc) NULL
        };

        pro_note_tab_type = gtk_type_unique(GTK_TYPE_WIDGET, &pro_note_tab_info);
    }

    return pro_note_tab_type;
}

GtkWidget* pro_note_tab_new(void)
{
    return GTK_WIDGET(gtk_type_new(pro_note_tab_get_type()));
}

Теперь программа прекрасно компилируется. Но ошибка, которую я получаю во время выполнения:

GTK_CRITICAL **: IA__gtk_type_new: утверждение GTK_TYPE_IS_OBJECT(type) failed GTK_CRITICAL **: IA__gtk_container_add: утверждение GTK_IS_WIDGET(widget) failed

Что я делаю не так? Или даже я, о чём в мире эта ошибка?

Ответы [ 3 ]

1 голос
/ 24 сентября 2011

Согласно документации, gtk_type_unique «устарело и не должно использоваться во вновь создаваемом коде».

Вместо этого используйте g_type_register_static. Более того, если вы пытаетесь освоить GObject, а не старый Gtk +.

В любом случае, я бы сказал, что ваша ошибка связана с некоторыми указателями NULL-функций, которые вы устанавливаете, некоторые, вероятно, не являются обязательными, но это плохо документировано.

0 голосов
/ 23 сентября 2011

Это должно быть проблемой

 if (!pro_note_tab_get_type)
{
0 голосов
/ 23 сентября 2011

Например, переменная pro_note_tab_type в pro_note_tab_get_type() на самом деле выглядит так, как будто должна быть static.

...