Ich habe derzeit ein Problem beim Speichern von Mauskoordinaten in einem Array, in dem ein Zeiger dieses Arrays an eine Funktion übergeben wird, die dann diese Koordinaten verwenden, um eine Polylinie auf dem Bildschirm anzuzeigen.C++/OpenGL - Zeiger eines Arrays
Unten ist mein Code. Beachten Sie, dass ich kommentiert habe, wo das Problem zu sein scheint, aber ich dachte, dass ich die meisten der Code sowieso einfügen würde:
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
Grundsätzlich, wenn ich mit der Maus auf dem Bildschirm klicken, sollte ein Punkt gezogen werden und gleichzeitig werden diese Koordinaten in einem Array gespeichert. Der Benutzer kann mit der linken Maustaste klicken, um Punkte zu zeichnen, während diese Koordinaten gespeichert werden. Die Linien werden nicht gezeichnet, bis die rechte Maustaste gedrückt wird, in der das Array in einer verknüpften Liste gespeichert wird. Die verknüpfte Liste dient zum Speichern aller verschiedenen Polylinienformen. Das Problem besteht jedoch darin, dass der Zeiger nicht korrekt auf das Array zeigt und die Zeichnungsfunktion die Linien nicht korrekt zeichnet.
Wenn Sie zum Beispiel auf zwei Punkte auf dem Display klicken (beachten Sie die cout-Anweisungen im Code), dann klicken Sie mit der rechten Maustaste, eine Linie wird mit diesen beiden Punkten gezeichnet. Wenn ich jedoch auf einen anderen Punkt klicke, wird eine Linie von den vorherigen Koordinaten gezogen, OHNE dass ich die rechte Maustaste drücke.
(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
Beachten Sie, wie es eine zusätzliche Zeile zeichnet, ohne es zum Zeiger hinzuzufügen?
Ich habe versucht mit memcpy - die Zeilen sind perfekt gezeichnet IF weniger als 5-6 Punkte wurden verwendet, mehr und die Anwendung stürzt ab. Daher, warum ich glaube, es zu einem Zeiger Problem
Gibt es einen Grund, warum Sie nicht std :: list oder std :: vector und std :: vector verwenden? Nur zur Info, es macht die Dinge einfacher zu sehen. –
Robinson
Kein besonderer Grund, eher so vorläufig – user1280446