質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • GLFW

    10questions

glfw3のウィンドウが表示できない。(My program has a error with glfw3 window)

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 159

 問題(Problem)

  • glfw3を使って、ウィンドウを表示させたいのですが、

ERROR: Setting <GLFWContentView: 0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.

というエラーが出て、表示する途中で落ちてしまいます。
どうすれば解決できるでしょうか?

  • My program has a error with glfw3 window. The error is that 

ERROR: Setting <GLFWContentView: 0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.

How can I deal with it?

 発生している問題・エラーメッセージ(Error)

Main[74526:7122089] [General] ERROR: Setting <GLFWContentView:  0x1007508a0> as the first responder for window <GLFWWindow: 0x10072f620>, but it is in a different window ((null))! This would eventually crash when the view is freed. The first responder will be set to nil.
(
    0   AppKit                              0x00007fff5520752e -[NSWindow _validateFirstResponder:] + 578
    1   AppKit                              0x00007fff5494ea58 -[NSWindow _setFirstResponder:] + 31
    2   AppKit                              0x00007fff549ed17d -[NSWindow _realMakeFirstResponder:] + 448
    3   Main                                0x0000000100055003 createNativeWindow + 1187
    4   Main                                0x000000010005490f _glfwPlatformCreateWindow + 63
    5   Main                                0x000000010004d167 glfwCreateWindow + 887
    6   Main                                0x000000010000caa1 _ZN6WindowC2EiiPKc + 97
    7   Main                                0x0000000100008e59 _ZN6WindowC1EiiPKc + 41
    8   Main                                0x000000010000855c main + 156
    9   libdyld.dylib                       0x00007fff7ebc4115 start + 1
)

 該当のソースコード

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <chrono>
#include <iostream>
#include <thread>
#include "./MendelsEngine/Model/UI/Window.h"
#include "./MendelsEngine/State/Scene/Scene.h"

/* 変数名の省略の対応表
global: g
pointer: p
member: m
array: a
vector: vec
matrix: mat
index: id
count: cou
number: num
value: val

allocate: alloc,
buffer: buf,
current: cur,
dimension: dim,
direction: dire,
event: ev,
fragment: frag
height: hei,
inverse: inv,
location: loc,
medium: med,
multiply: mult,
normal : norm,
perspective: persp,
position: pos,
previous: pre,
projection: proj,
random: rand,
string: str,
target: tar,
texture: tex,
vertex: vert,
volume: vol,
width: wid,
win: win
 */

int main() {

  /* 初期化 */

  /// GLFW を初期化する。
  if (glfwInit() == GL_FALSE) {
    // 初期化に失敗した。
    std::cerr << "Can't Initialize GLFW" << std::endl;
  };

  // プログラム終了時の処理を登録する。
  atexit(glfwTerminate);

  //// OpenGL Version 3.2 Core Profile を選択する。
  //glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  //glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
  //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

  // ゲーム画面を構築するインスタンス生成。
  // インスタンスへの参照を他クラスへ渡し、他クラスでもその処理を行えるようにする。
  Window win;
  Scene scene;

  // 背景色を指定する。
  glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

  // 背面カリングを有効にする。
  glFrontFace(GL_CCW);
  glCullFace(GL_BACK);
  glEnable(GL_CULL_FACE);

  // デプスバッファを有効にする。
  glClearDepth(1.0);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);

  // ゲームループの変数初期化。
  const std::chrono::milliseconds MS_PER_UPDATE(10);
  std::chrono::milliseconds lag;
  auto pre = std::chrono::system_clock::now();

  // メインゲームループ。ゲームループでゲームを更新し、描画し続ける。
  while (win.should_close(win.win()) == GL_FALSE) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    auto curr = std::chrono::system_clock::now();
    // 処理に要した時間をミリ秒に変換。
    auto elapsed =
        std::chrono::duration_cast<std::chrono::milliseconds>(curr - pre);
    pre = curr;
    lag = lag + elapsed;

    // 画面をクリア。
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // 変換行列の初期化。
    glLoadIdentity();

    /* インプット */

    // 現在のウィンドウの大きさを取得。
    int wid, hei;
    glfwGetFramebufferSize(win.win(), &wid, &hei);

    // ESCキーで終了。
    if (glfwGetKey(win.win(), GLFW_KEY_ESCAPE) == GLFW_PRESS) {
      break;
    };

    while (lag >= MS_PER_UPDATE) {

      /* 更新 */

      scene.update(win);
    };

    /* 描画 */

    scene.render(win);

    glViewport(0, 0, wid, hei);
    lag -= MS_PER_UPDATE;
  };
};
#pragma once

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <vector>

// ウィンドウ関連の処理。
class Window {
  // ウィンドウのポインタの入れ物。
  GLFWwindow *win_;
  // ウィンドウのサイズ。
  std::vector<GLfloat> size_;
  // 図形の正規化デバイス座標系上での位置。
  std::vector<GLfloat> pos_;
  // ワールド座標系に対するデバイス座標系の拡大率。
  GLfloat scale_;
  // キーボードの状態。
  int key_status_;

public:
  // コンストラクタ。
  Window(int wid = 640, int hei = 480, const char *title = "MendelsEngine")
      : win_(glfwCreateWindow(wid, hei, title, NULL, NULL)), scale_(100.0f),
        key_status_(GLFW_RELEASE) {

    // 作成したウィンドウをOpenGLの処理対象にする。
    glfwMakeContextCurrent(win_);

    // GLEW を初期化する。
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
      // GLEW の初期化に失敗した。
      std::cerr << "Can't initialize GLEW" << std::endl;
    };

    // 垂直同期のタイミングを待つ。
    glfwSwapInterval(1);
    // ウィンドウのサイズ変更時に呼び出す処理の登録。
    glfwSetWindowSizeCallback(win_, &resize);
    // マウスホイール操作時に呼び出す処理の登録。
    glfwSetScrollCallback(win_, &wheel);
    // キーボード操作時に呼び出す処理の登録。
    glfwSetKeyCallback(win_, &keyboard);
    // このインスタンスの this ポインタを記録しておく。
    glfwSetWindowUserPointer(win_, this);
    // 開いたウィンドウの初期設定。
    resize(win_, wid, hei);
  };

  // デストラクタ。
  virtual ~Window() { glfwDestroyWindow(win_); }

  // メンバ関数。
  int should_close(GLFWwindow *win) const;
  void swap_buffers(GLFWwindow *win, int key_status);
  // ウィンドウのサイズ変更時の処理。
  static void resize(GLFWwindow *win, int wid, int hei){
    // ウィンドウ全体をビューポートに設定する。
    glViewport(0, 0, wid, hei);
    // このインスタンスの this ポインタを得る。
    Window *instance(static_cast<Window *>(glfwGetWindowUserPointer(win)));
    if (instance != NULL) {
      // 開いたウィンドウのサイズを保存する。
      GLfloat wid0 = static_cast<GLfloat>(wid);
      GLfloat hei0 = static_cast<GLfloat>(hei);
      instance->size(0, wid0);
      instance->size(1, hei0);
    };
  };
  // マウスホイール操作時の処理。
  static void wheel(GLFWwindow *win, double x, double y){
    // このインスタンスの this ポインタを得る。
    Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(win)));
    if (instance != NULL) {
      // ワールド座標系に対するデバイス座標系の拡大率を更新する。
      GLfloat scale0 = instance->scale() + static_cast<GLfloat>(y);
      instance->scale(scale0);
    };
  };
  // キーボード操作時の処理。
  static void keyboard(GLFWwindow *win, int action, int key = -1,
                       int scancode = -1, int mods = -1){
    // このインスタンスの this ポインタを得る。
    Window *const instance(static_cast<Window *>(glfwGetWindowUserPointer(win)));
    if (instance != NULL) {
      // キーの状態を保存する。
      instance->key_status(action);
    };
  };

  // アクセサ。
  GLFWwindow *win() { return win_; };

  std::vector<GLfloat> size() { return size_; };
  GLfloat size(int i) { return size_[i]; };
  void size(int i, GLfloat &glf) { size_[i] = glf; };

  std::vector<GLfloat> pos() { return pos_; };
  GLfloat pos(int i) { return pos_[i]; };
  void pos(int i, GLfloat &glf) { pos_[i] = glf; };

  GLfloat scale() { return scale_; };
  void scale(GLfloat &glf) { scale_ = glf; };

  int key_status() { return key_status_; };
  void key_status(int &i) { key_status_ = i; };
};
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

検索したところFail to create window on Sierra 10.12.6 · Issue #1057 · glfw/glfw · GitHubなどに同様のメッセージが出るとの報告が見つかりましたが、それによるとどうやらGLFW 3.3.0以降では修正されているそうです。
もしGLFWのバージョンが古いようでしたら、GitHub - glfw/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and inputで入手できるものを使ってみてはどうでしょうか?

※すみませんが、諸般の事情によりうちのMacが使用できず、ご質問者さんのおっしゃる症状が再現するか、GLFWのアップグレードで解決できるかは未確認です...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    OpenCVで動画の読み込みがうまくできません。

    以前別のプログラムで動画の読み込みができましたが、今現在取り組んでいるプログラムではうまくいきません。 言語はC++でopencv2.4.9を使用しています。 Os windo

  • 受付中

    OpenCVで動画の読み込みがうまくできません。

    以前別のプログラムで動画の読み込みができましたが、今現在取り組んでいるプログラムではうまくいきません。   言語はC++を使用しています。  ・ソースコード  ヘッダファ

  • 受付中

    Ruby(mruby)とvector等のC++のSTLを連携させるには?

    Ruby(mruby)とC++を連携させようと考えています。 int等、C++のプリミティブ型や関数、クラスを連携させるのは mrubybindという外部のソースコードを 借り

  • 解決済

    【vector】vector.erase()を高速化したい

     解決済みですが、まだまだこんなのあるよ!という方のコメントを随時募集してます! 前提・実現したいこと タイトルの通り、C++のSTLコンテナの一つvectorクラスの"vecto

  • 解決済

    OpenCVを使った笑顔検出での問題

    前提・実現したいこと OpenCVで元からあるサンプルコード「smiledetect.cpp」を用いて笑顔検出のシステムを作っています。 検出機能を実装中に以下の問題が発生しました

  • 解決済

    数字の文字列を一桁ずつ数字として取り出す方法

    任意の数字列が文字列型として与えられたときに、それらの数字を整数型に変換して、一つずつ取り出したいのですが、その方法が分かりません 例えば、123456789という文字列がst

  • 解決済

    irfanviewで書き出したpgmファイルの再配置。

     前提・実現したいこと プログラミング初心者です。 数字をirfanviewでグレースケールで書きだしたのですが横文字70制限のためこのように書き出されました。 このpgmファイル

  • 解決済

    PyQt5:プロットする領域を拡大・縮小したい

    PyQt5を使用してグラフ上に点をプロットしたいと思っております。 PyQtを使用して作成したウィンドウ上に、描画用の領域を作成し、その上に点を打ちたいと思っております。 現在、描

同じタグがついた質問を見る

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • GLFW

    10questions