【问题标题】:Referencing an Array outside its range引用超出其范围的数组
【发布时间】:2011-01-22 04:34:49
【问题描述】:

这个程序创建一个包含 100 个盒子的图像,创建盒子后,它的 4 个坐标存储在类数组 Tile 的索引中,因此我可以稍后在我的代码中引用每个图块。这很好用,除非我不能在我的主函数中引用 Tile 数组,只能在创建它的 Draw() 函数中引用。任何解决方案将不胜感激。

编辑:将 Tiles* Tile[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 - Michael Hall 编写的原始版本修改而来。

谢谢

【问题讨论】:

    标签: c++ c arrays object reference


    【解决方案1】:

    要使您的Tiles 数组可从main() 访问,您必须在main() 范围内声明Tiles。例如,将您的声明 Tiles Tile[100]; 移动到全局范围,即在 void Draw() { 行之前。

    【讨论】:

    • 我已经尝试过这种方法,当我尝试计算图块的值 (41) 时,我收到 0,与预期结果相反 (0.1)。 (std::cout
    • 因为它还没有被初始化,因为初始化发生在Draw()(这很奇怪)。您确定要在每一帧重新构建您的 tile 数组吗?
    【解决方案2】:

    如果你想让它从 main 访问,答案是将它移动到全局范围,但是..

    您在这里使用了 openGL 和 glut,并且您在访问 main() 中的 Tile 之前调用了 glutMainLoop。如规范中所述,glutMainLoop 一旦调用就永远不会返回。

    如果碰巧在调用 glutMainLoop 之前尝试计算值,则不会调用 draw 方法,因为它是从 glutMainLoop 内部调用的..这使得值仍然为 0..

    参考:http://www.opengl.org/documentation/specs/glut/spec3/node14.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多