Ссылка на массив вне его диапазона - PullRequest
0 голосов
/ 22 января 2011

эта программа создает изображение из 100 блоков, после того как блок создан, его 4 координаты сохраняются в индексе массива классов Tile, поэтому я могу ссылаться на каждую плитку позже в своем коде. Это работает нормально, за исключением того, что я не могу ссылаться на массив Tile в моей основной функции, только в функции Draw (), где он создан. Любые решения будут оценены.

РЕДАКТИРОВАТЬ: Создание Tiles * Tile [100] global, похоже, не решает проблему.

Упрощенный код:

#include <iostream>
class Tiles {
public:
    Tiles() : mA (1){}
    double mA;
};

void Function1() {
    Tiles Tile[5];
    Tile[1].mA = 10;
}

int main(int iArgc, char** cppArgv) {
    Function1();
    Tile[1].mA = 2;  // ERROR "Tile" is unidentified.
    return 0;
}

Полный код:

#include <iostream>
#include <glut.h>
class Tiles {
public:
 Tiles() : mA () , mB() , mC() , mD() , mCP(){}
 double mA[2] , mB[2] , mC[2] , mD[2]  , mCP[2];
};

void Draw() {
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1.0, 1.0, 1.0);
 double dX1 = 0.0, dY1 = 0.0, dMidX = 0.0, dMidY = 0.0, dXC = 0.0, dYC = 0.0;
 int sq = 0, row = 1, CoordMap = 0;
 Tiles Tile[100];
   //Tiles* Tile = new Tiles[100]; doesnt seem to be any different..
     for (int i=0; i < 10;i++ ) { // ROWS
     for (int i2=0; i2 < 10; i2++) { // BOXES
      glBegin(GL_LINE_STRIP);
      glVertex3f(dX1, dY1, 0.0);
      Tile[sq].mA[1] = dX1;
      Tile[sq].mA[2] = dY1;// Bottom Left
      dX1 = dX1 + .1;
      dXC = dX1;
      dYC = dY1;
      glVertex3f(dX1, dY1, 0.0);
      Tile[sq].mB[1] = dX1;
      Tile[sq].mB[2] = dY1;// Bottom Right
      dY1 = dY1 + .1;
      glVertex3f(dX1, dY1, 0.0);
      Tile[sq].mC[1] = dX1;
      Tile[sq].mC[2] = dY1;// Top Left
      dX1 = dX1 - .1;
      glVertex3f(dX1, dY1, 0.0);
      Tile[sq].mD[1] = dX1;
      Tile[sq].mD[2] = dY1;// Top Right
      glEnd();
      glBegin(GL_POINTS);
      glVertex3f((dX1 + .05) , (dY1 - .05), 0.0);
      glEnd();
      ++sq;
      dX1 = dXC;
      dY1 = dYC;
        }
      row++;
      dX1 = 0.0;
      dY1 = ((row * .1) - .1); 
        } 
     glFlush();
    }


void Initialize() {
 glClearColor(0.0, 0.0, 0.0, 0.0);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

int main(int iArgc, char** cppArgv) {
 glutInit(&iArgc, cppArgv);
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowSize(250, 250);
 glutInitWindowPosition(200, 200);
 glutCreateWindow("XoaX.net");
 Initialize();
 glutDisplayFunc(Draw);
 glutMainLoop();
 //Tile[2].mA[1] = 2; //
 return 0;
}

Этот код изменен по сравнению с оригинальной версией, написанной XoaX - Майклом Холлом.

Спасибо

Ответы [ 2 ]

1 голос
/ 22 января 2011

Чтобы сделать ваш массив Tiles доступным из main(), вы должны объявить Tiles в области действия main().Например, переместите вашу декларацию Tiles Tile[100]; в глобальную область, то есть непосредственно перед строкой void Draw() {.

0 голосов
/ 22 января 2011

Если вы хотите сделать его доступным из основного, ответ - переместить его в глобальную область, но ..

Вы используете openGL и glut здесь, и вы вызываете glutMainLoop непосредственно перед доступом к Tile в main () .. как написано в спецификации, glutMainLoop никогда не возвращает один раз вызванный ..

если по случайности вы пытаетесь установить значение перед вызовом glutMainLoop, метод draw не будет вызван, так как он был вызван из glutMainLoop .. что делает значение по-прежнему 0 ..

ссылки: http://www.opengl.org/documentation/specs/glut/spec3/node14.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...