2011-01-22 2 views
0

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

РЕДАКТИРОВАТЬ: Изготовление плитки * Плитка [100] глобальная, похоже, не решает проблему.

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

#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

Тоже. Многое. Код. –

+0

Упрощенный для простоты. –

ответ

1

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

+0

Я пробовал этот метод, и когда я пытаюсь отключить значение плитки (41), я получаю 0, против ожидаемого результата (0.1). (std :: cout << Tile [40] .mA [1];) –

+0

Поскольку он еще не был инициализирован, поскольку инициализация происходит в 'Draw()' (что довольно странно). Вы действительно хотите перестроить свой массив плитки в каждом кадре? – mbaitoff

0

Если вы хотите, чтобы сделать его доступным для основной, ответ, чтобы переместить его в глобальном масштабе, но ..

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

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

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

Смежные вопросы