2011-09-23 2 views
0

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

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

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

+0

Попробуйте выполнить компиляцию со всеми предупреждениями, то есть опцию '-Wall' в' gcc' ... Вы обязательно получите предупреждение в 'if (! Pro_note_tab_get_type)', как указано @Lews Therin, это должно быть 'if (pro_note_tab_type) 'без ** get ** в имени переменной, которое может быть причиной проблемы. Также рассмотрите предложение @unwind, связанное с 'static' –

+1

Возможно, вы захотите проверить' G_DEFINE_TYPE() ', который будет расширяться до большей части приведенного выше кода для вас, с добавленным бонусом, что будет намного сложнее для ошибок пробираться туда. – ptomato

+0

@ptomato Спасибо. – ApprenticeHacker

ответ

1

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

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

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

+0

Наконец, я изменил несколько указателей NULL, и это работает! благодаря – ApprenticeHacker

0

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

+0

Все еще не исправлено. – ApprenticeHacker

0

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

if (!pro_note_tab_get_type) 
{ 
Смежные вопросы