Ubuntu日本語フォーラム
ログインしていません。
カテゴリ違いまたは質問する場所が違っていたら失礼します。
C言語でGTK+3を使用してプログラムを作成しています。
以下のプログラムでエラーが発生して動作しません。
構造体のポインタを関数の引数に渡しているのですがこのような場合どうすれば宜しいのでしょうか?
ご提示願います。
#include <gtk/gtk.h> #include <glib.h> void func(GtkWidget* window) { window = gtk_window_new(GTK_WINDOW_TOPLEVEL); } int main(int argc, char** argv) { GtkWidget* window; gtk_init(&argc, &argv); func(window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_resize(GTK_WINDOW(window), 640, 480); gtk_widget_show_all(window); gtk_main(); return 0; }
エラー内容は以下です。
(sample:27602): GLib-GObject-WARNING **: 01:12:45.672: invalid (NULL) pointer instance (sample:27602): GLib-GObject-CRITICAL **: 01:12:45.672: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed (sample:27602): Gtk-CRITICAL **: 01:12:45.672: gtk_window_resize: assertion 'GTK_IS_WINDOW (window)' failed (sample:27602): Gtk-CRITICAL **: 01:12:45.672: gtk_widget_show_all: assertion 'GTK_IS_WIDGET (widget)' failed
また、以下のプログラムでは正常に動作致します。
#include <gtk/gtk.h> #include <glib.h> int main(int argc, char** argv) { GtkWidget* window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_resize(GTK_WINDOW(window), 640, 480); gtk_widget_show_all(window); gtk_main(); return 0; }
動作環境
Ubuntu 22.04
GCC version: (Ubuntu 11.2.0-19ubuntu1) 11.2.0
libgtk-3-0:amd64 3.24.33-1ubuntu1
libgtk-3-dev:amd64 3.24.33-1ubuntu1
以上よろしくお願い致します。
オフライン
GtkWidget* window は関数ポインタではありません。
func()の変数windowと main()の変数windowは別物です。
func()のwindowは関数に入るときに 引数値を持って生成され、
関数を抜けるときに破棄されます。
func()はどこにも結果を残してません。
main()のwindowは書き換えられず最初の未定義値のままです。
> 構造体のポインタを関数の引数に渡しているのですがこのような場合どうすれば宜しいのでしょうか?
変数を書き換えるなら 変数の値を引数で受け取る関数ではなく、
変数を指すポインタを引数で受け取る関数を書きます。
オフライン
レスありがとうございます。
ポインタについてまだまだ勉強不足で理解できません。
申し訳ありません。
具体的にどうすれば良いのかご提示願えますか?
オフライン
こうでしょうか?
#include <gtk/gtk.h> #include <glib.h> void func(GtkWidget** windowp) { *windowp = gtk_window_new(GTK_WINDOW_TOPLEVEL); } int main(int argc, char** argv) { GtkWidget* window; gtk_init(&argc, &argv); func(&window); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_window_resize(GTK_WINDOW(window), 640, 480); gtk_widget_show_all(window); gtk_main(); return 0; }
オフライン
ご回答ありがとうございます。
なるほど、関数の引数側をポインタのポインタにするということですね。
スッキリしました。
本当にありがとうございました。
オフライン