将带有 glut 的点击坐标添加到向量的链接列表中

Posted

技术标签:

【中文标题】将带有 glut 的点击坐标添加到向量的链接列表中【英文标题】:Adding coordinates of clicks with glut to a linked list of vectors 【发布时间】:2020-04-30 15:59:41 【问题描述】:

我想创建一个向量的链接列表,并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中。

这些是我写的结构体。

typedef struct vectorint x;int y;Vector;
typedef struct VectorListVector X; struct VectorList*next; node_v;

我全局定义了一个 P 向量和向量链表 prev。

Vector P;
node_v * prev=NULL;

在鼠标回调函数_mouse_CB 每次点击鼠标左键时,我想用当前的x 和y 值更新P 向量并将它们附加到链表中。

这是代码的那一部分。

static void _mouse_CB(int button, int state, int x, int y)

    if(state==GLUT_DOWN)
    
        switch(button)
        
        case GLUT_LEFT_BUTTON :
            px=x;py=y;
            P.x=x;
            P.y=y;
            prev=VL_new1(P);

            append(&prev,P);
            break;

这里的 append 函数是我从 geeksforgeeks 写的,并在最后添加了一个 while 循环来检查是否正确添加了值,但是我正在溢出。

void append(node_v** head_ref, Vector A)
 
    node_v* new_node = (node_v*) malloc(sizeof(node_v)); 

    node_v *last = *head_ref;  

    new_node->X.x  = A.x; 
      new_node->X.y  = A.y; 
    new_node->next = NULL; 

    if (*head_ref == NULL) 
     
       *head_ref = new_node; 
       return; 
       
    while (last->next != NULL) 
        last = last->next; 
    last->next = new_node; 
    last = *head_ref;
    while(last)
      printf("%d %d\n", last->X.x,last->X.y);
      last = last->next;
    
    return;     
 

为了创建一个节点我写了这个函数

node_v* VL_new1(Vector A)
        node_v *new = (node_v*)malloc(sizeof(node_v));
        if(new==NULL)exit(1);
        else
            new->X.x  = A.x; 
            new->X.y  = A.y; 
            new->next = NULL;
        
        return new;

每次我运行这个程序并点击出现的窗口时,终端上的 printf 里面的 append 函数都会输出这个

-732680176 -729092496
0 -1344244448

我应该进行哪些更改才能不溢出并成功添加当前值?

【问题讨论】:

建议node_v* new_node = (node_v*) malloc(sizeof(node_v)); => node_v* new_node = malloc(sizeof(*new_node)); 删除prev=VL_new1(P); @Rabbid76 这是我为分配节点而创建的函数 @JoJo 在append中创建新节点。 【参考方案1】:

在函数append中创建新节点:

node_v* new_node = (node_v*) malloc(sizeof(node_v));

指令prev=VL_new1(P); 生成一个新的列表头。每次执行代码时,都会设置prev,并丢失prev之前的内容。

删除如果:

case GLUT_LEFT_BUTTON :
    px=x;py=y;
    P.x=x;
    P.y=y;
    append(&prev,P);

注意,函数VL_new1可以在append中调用,而不是:

void append(node_v** head_ref, Vector A)
 
    node_v *last = *head_ref;
    node_v* new_node = VL_new1(A); 

    if (*head_ref == NULL) 
     
       *head_ref = new_node; 
       return; 
    

    while (last->next != NULL) 
        last = last->next; 
    last->next = new_node;

【讨论】:

我删除并编译了,但仍然溢出 在 append 函数中,我在最后添加了这一行 printf("%d %d\n",A.x,A.y); 并点击了屏幕并打印了 -563777520 -560359568 在mouse_cb里面打印了正确的坐标,但不是在append里面,我认为这是需要的结果 是的,这是我在主函数中调用的glutMouseFunc(_mouse_CB); 我只写了#include <stdlib.h>

以上是关于将带有 glut 的点击坐标添加到向量的链接列表中的主要内容,如果未能解决你的问题,请参考以下文章

GLUT 鼠标移动,坐标始终开启

GLUT:错误的鼠标坐标?

如何在带有向量作为值类型的地图中添加值?

将命名向量添加到列表中

使用 glut 函数 glutMouseFunc() 将窗口坐标转换为 3D 世界坐标

通过循环向量链表使用opengl1绘制线条