C ++ / OpenGL - 数组的指针

时间:2012-03-30 08:23:39

标签: c++ opengl

我目前遇到一个问题,将鼠标坐标存储到一个数组中,其中该数组的指针传递给一个函数,然后该函数将使用这些坐标在屏幕上显示折线。

以下是我的代码。请注意,我已经评论了问题的位置,但我认为无论如何我都会粘贴大部分代码:

struct mousePoint{
    int x, y;
};

struct Node{
    mousePoint *pointer;
    int corner;
    Node *next;
};

Node *Top;
Node *Bottom;


void init(void){ // doesnt need to be shown, but initialises linked list

// Adds the mouse coords array to the top of the linked list
void AddLines(mousePoint Lines[], int corner){
    Node *temp;
    temp = new Node;
    cout << "(AddLines func) array x1: ";
cout << Lines[0].x << endl;
cout << "(AddLines func) array y1: ";
cout << Lines[0].y << endl;
cout << "(AddLines func) array x2: ";
cout << Lines[1].x << endl;
cout << "(AddLines func) array y1: ";
cout << Lines[1].y << endl;
    temp->pointer = Lines; // <--- I believe this is the error
    temp->corner = corner;
    temp->next = NULL;
    if(Top == NULL){
        Top = temp;
    }else{
        temp->next = Top;
        Top = temp;
        if(Bottom == NULL){
            Bottom = Top;
        }
    }
}

// Draws the polyline based on the coords in the array
void DrawLines(mousePoint Lines[], int corner){
    cout << "(DrawLines func) array x1: ";
cout << Lines[0].x << endl;
cout << "(DrawLines func) array y1: ";
cout << Lines[0].y << endl;
cout << "(DrawLines func) array x2: ";
cout << Lines[1].x << endl;
cout << "(DrawLines func) array y1: ";
cout << Lines[1].y << endl;
    glBegin(GL_LINE_STRIP);
        for(int i = 0; i < corner; i++){
            glVertex2i(Lines[i].x, Lines[i].y);
        }
    glEnd();

}

void display(void){
    Node *current;
        current = Top;
                // cycle through all polylines in linked list
        for(; current != NULL; current = current->next){ 
            DrawLines(current->pointer, current->corner);
        }
    glFlush();
}

void mouse(int button, int state, int x, int y)
{
    static mousePoint Lines[100]; // array to store mouse coords
    static int NumCorner = 0; // counter for mouse click
    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        Lines[NumCorner].x = x;
        Lines[NumCorner].y = 480 - y;
                // draw individual points
        glBegin(GL_POINTS);
        glVertex2i(Lines[NumCorner].x, Lines[NumCorner].y); 
        glEnd();
        NumCorner++;
    }else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
        AddLines(Lines, NumCorner); // add mouse coords to linked list
        NumCorner = 0; // reset counter back to 0
    }
}

int main(int argc, char** argv) // doesnt need to be shown

基本上,当我用鼠标点击屏幕时,应绘制一个点,同时将这些坐标保存到数组中。用户可以使用鼠标左键单击以在保存这些坐标时绘制点。在按下鼠标右键之前,线条将不会绘制,其中数组存储在链接列表中。链表用于存储所有不同的折线形状。但问题是,指针未正确指向数组,并且绘制线功能未正确绘制线条。

因此,例如,如果单击显示屏上的两个点(注意代码中的cout语句),然后右键单击,则使用这两个点绘制一条线。但是,如果我点击另一个点,则从前面的坐标线绘制一条线,而不是按下鼠标右键。

(AddLines func) array x1: 338
(AddLines func) array y1: 395
(AddLines func) array x2: 325
(AddLines func) array y1: 308
(DrawLines func) array x1: 338
(DrawLines func) array y1: 395
(DrawLines func) array x2: 325
(DrawLines func) array y1: 308
(DrawLines func) array x1: 383
(DrawLines func) array y1: 224
(DrawLines func) array x2: 325
(DrawLines func) array y1: 308

注意如何在不将其添加到指针的情况下绘制额外的行?

我尝试过使用memcpy - 如果少用5-6个点就会完美地绘制线条,而且应用程序崩溃了。因此,为什么我认为这是一个指针问题

1 个答案:

答案 0 :(得分:1)

好的,我想我明白了。

您正在使用静态数组Lines []。当你执行“temp-&gt; pointer = Lines;”时您指向每个多边形的静态数组。因此,当您绘制第一个多边形时,然后当您尝试启动第二个多边形时,您正在编辑第一个多边形的线条。

您可以复制for循环中的每个点,而不是您已经发现有问题的行。

代替:

temp->pointer = Lines; // <--- I believe this is the error

尝试:

temp->pointer = new mousePoint[corner];
for(int a = 0; a < corner; a++)
{
   temp->pointer[a] = Lines[a];
}