AnimationFile must have a public virtual function void start(), and
m_animation must actually point to an Hbafile, so that when you cast the
void* to AnimationFile* it's going to find a vtable slot for start().
If AnimationFile's start() isn't declared virtual, it won't go through
the vtable.

With the debugger, see if 'this' (the first (hidden) parameter to the
start() function) is 0, indicating that the object didn't get passed to
start().

Note that gtk_signal_connect is deprecated and you should be using
g_signal_connect().


  // HTH, Wally

On Tue, 2005-12-13 at 16:00 -0800, Paul Santa Maria wrote:
> Hi -
> 
> I'm using the GTK+ 2.6.4 that came with Suse 9.3.  I'm coding in C++, but 
> using the "raw" GTK+ C
> libraries.
> 
> I'm trying to pass a pointer to one of my C++ classes into a callback, so 
> that I can call a method
> on that class.  The code looks like this:
> 
> 1. less hbaview.h =>
>    --------------
> class HbaviewApp
> {
>   ...
> private:
>   AnimationFile *m_animation;
>   ...
> 
> class Hbafile : public AnimationFile
> {
> public:
>   Hbafile (GtkWidget *da);
>   virtual ~Hbafile ();
>   virtual void open (const char *fname);
>   virtual void close ();
>   virtual void start ();
>   ...
> 
> 2. less HbaviewApp.cpp =>
>    -------------------
> void init ()
>   ...
>   GtkWidget *play = 
>     gtk_image_menu_item_new_from_stock (
>       "gtk-media-play", accel_group);
>   gtk_widget_show (play);
>   gtk_container_add (GTK_CONTAINER (menu3), play);
>   gtk_signal_connect (GTK_OBJECT (play), "activate",
>                       G_CALLBACK (play_cb), m_animation);
>   ...
> 
> 3. less callbacks.cpp =>
>    ------------------
> gboolean
> play_cb (gpointer data)
> {
>   // Deference the object pointer to do the actual work
>   AnimationFile *ani = (AnimationFile *)data;
>   ani->start ();
> }
> 
> "ani->start()" works fine outside of the callback.  I know my Animation 
> object has been
> successfully created and that "m_animation" points to it before I call 
> gtk_signal_connect().
> 
> But it crashes with a signal SIGSEGV, Segmentation fault when the play_cb 
> callback tries to call
> ani->start().
> 
> Any idea what I might be doing wrong?
> 
> Or tips for debugging the problem?
> 
> Thanx in advance!
>    
> 
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to