Posted by & filed under memo, programming.


CG課題(2)-2文字が描画できなかった問題が解決.

変数のスコープをきちんと理解できていなかったのが原因だった.

文字を描画する前に2次元クリッピング領域を設定してやる必要があるが,それを画面全体に設定するために,別ファイルのヘッダに定義した静的グローバル変数を使って画面サイズを取得し,利用していた.

その静的グローバル変数には,別ファイルに書かれた glutReshapeFunc が呼び出される度に値が代入されるようになっている.

.

同じファイルの中でこれらすべてを定義していたのなら,これで問題ないはずだったが,別々のファイルで変数を利用しようとしてしまった為,問題が発生した.

というのも,静的グローバル変数のスコープは,そのソースファイルだけに限定されるからだ.

値を共有するから.と,何の気なしに static をつけてしまっていたが,そうしてしまったがために問題が発生してしまっていた.

今回の場合,こんな感じにすれば問題なかった.

  • ヘッダファイル
  • /* hoge.h */
    extern GLint width, height;
  • reshape
  • #include "hoge.h"
    GLint width = 0;
    GLint height = 0;
    ・・・・
    void reshape(int w, int h)
    {
        width = w;
        height = h;
        ・・・・
    }
  • drawMessage
  • #include "hoge.h"
    void drawMessage(const char* mes, GLint x, GLint y)
    {
        ・・・・
        gluOrtho2D(.0, width, height, .0);
        ・・・・
    }

結局,その時点のウィンドウサイズは, glutGet を用いて,

GLfloat width = glutGet((GLenum)GLUT_WINDOW_WIDTH);

GLfloat height = glutGet((GLenum)GLUT_WINDOW_HEIGHT);

のようにすれば取得できるので,グローバル変数で保持するのではなく,その都度 glutGet で取得するようにした.

無闇矢鱈にグローバル変数を使うと,今回のように複数のファイルにソースが分割されている場合は特に変数がごちゃごちゃになるので,これが一番いいと思う.実際,今回もそれで混乱した.

変数保持でなく, glutGet を用いることによるオーバーヘッドはさほど気にしなくても大丈夫…だと信じたい.(面倒くさいので計測してない)