0

古いクラッターコードのキャストを整理して、最新の状態にしようとすると問題が発生します。次のようなコードがあります。

static void image_init(CtkImage *image)
{
    priv->texture = clutter_texture_new ();
    ...
}

static void refresh_icon (CtkImage *image)
{
  CtkImagePrivate *priv = image->priv;
  gtk_clutter_texture_set_from_pixbuf (CLUTTER_TEXTURE (priv->texture), priv->pixbuf, NULL);
}

これにより、次のコンパイル時エラーが発生します。

error: passing argument 1 of ‘gtk_clutter_texture_set_from_pixbuf’ from incompatible pointer type [-Werror]
/usr/include/clutter-gtk-1.0/clutter-gtk/gtk-clutter-texture.h:99:17: note: expected ‘struct GtkClutterTexture *’ but argument is of type ‘struct ClutterTexture *’

GTK_CLUTTER_TEXTUREを使用して修正できると思いました。これはコンパイルされますが、実行時エラーが発生し、pixbufsが不足しています。

gtk_clutter_texture_set_from_pixbuf (GTK_CLUTTER_TEXTURE (texture), tiled, NULL);

その結果:

GLib-GObject-WARNING **: invalid cast from `ClutterTexture' to `GtkClutterTexture'

Clutter-Gtk-CRITICAL **: gtk_clutter_texture_set_from_pixbuf: assertion `GTK_CLUTTER_IS_TEXTURE (texture)' failed

何が起こっているのですか、そしてなぜこれが失敗するのですか?どうすればデバッグできますか?

4

2 に答える 2

1

GtkClutterTextureは、ClutterTextureのサブクラスです。つまり、ClutterTextureを受け入れるすべての関数でGtkClutterTextureを使用できますが、GtkClutterTextureを使用するメソッドでClutterTextureを使用することはできません。

この例では、clutter_texture_new()を使用してテクスチャを作成し、そのポインタをgtk_clutter_texture_set_from_pixbuf()に渡します。GtkClutterTextureを作成するか、clutter_texture_set_from_rgb_data()関数を使用して、次のようなものを使用してGdkPixbufから画像データを設定します。

  clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (texture),
                                     gdk_pixbuf_get_pixels (pixbuf),
                                     gdk_pixbuf_get_has_alpha (pixbuf),
                                     gdk_pixbuf_get_width (pixbuf),
                                     gdk_pixbuf_get_height (pixbuf),
                                     gdk_pixbuf_get_rowstride (pixbuf),
                                     gdk_pixbuf_get_has_alpha (pixbuf) ? 4 : 3,
                                     CLUTTER_TEXTURE_NONE,
                                     &gerror);

これはまさにGtkClutterTexture.set_from_pixbuf()が行うことです。

于 2012-03-13T21:04:08.917 に答える
0

初期化されていないポインタを関数に渡していGtkClutterTexture *ます。このポインタにはガベージのみが含まれています。pixbufでオブジェクトを埋める前に、GtkClutterTextureを使用してオブジェクトを作成する必要があります。gtk_clutter_texture_new()

編集: 更新された例では、がありclutter_texture_new()ます。これはと同じではないgtk_clutter_texture_new()ため、を使用してキャストすると、そうでGTK_CLUTTER_TEXTURE()ないタイプにキャストしようとし、実行時の警告が生成されます。

于 2012-03-13T06:33:59.643 に答える