お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2022-04-27 01:28:32

thunderdragon
メンバ
登録日: 2012-09-18

C言語の関数ポインタ

カテゴリ違いまたは質問する場所が違っていたら失礼します。
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

以上よろしくお願い致します。

オフライン

 

#2 2022-04-27 16:38:30

elliptic
メンバ
登録日: 2020-03-05

Re: C言語の関数ポインタ

GtkWidget* window は関数ポインタではありません。

func()の変数windowと main()の変数windowは別物です。
func()のwindowは関数に入るときに 引数値を持って生成され、
関数を抜けるときに破棄されます。
func()はどこにも結果を残してません。
main()のwindowは書き換えられず最初の未定義値のままです。

> 構造体のポインタを関数の引数に渡しているのですがこのような場合どうすれば宜しいのでしょうか?
変数を書き換えるなら 変数の値を引数で受け取る関数ではなく、
変数を指すポインタを引数で受け取る関数を書きます。

オフライン

 

#3 2022-04-27 21:15:35

thunderdragon
メンバ
登録日: 2012-09-18

Re: C言語の関数ポインタ

レスありがとうございます。
ポインタについてまだまだ勉強不足で理解できません。
申し訳ありません。
具体的にどうすれば良いのかご提示願えますか?

オフライン

 

#4 2022-04-28 22:25:40

yaneno-suzume
メンバ
From: 名古屋
登録日: 2013-06-30

Re: C言語の関数ポインタ

こうでしょうか?

コード:

#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;
}

オフライン

 

#5 2022-04-28 23:30:10

thunderdragon
メンバ
登録日: 2012-09-18

Re: C言語の関数ポインタ

ご回答ありがとうございます。
なるほど、関数の引数側をポインタのポインタにするということですね。
スッキリしました。
本当にありがとうございました。

オフライン

 

Board footer

Powered by FluxBB