You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ OpenGL中结构体对象传参后访问属性输出为0问题求助

问题根源

你在MyMouse函数中定义的discType d属于栈局部变量,生命周期仅局限于当前else代码块,函数执行完毕后该变量会被系统自动回收销毁。你当前仅给局部变量赋值,没有将数据写入全局存储的disc数组,后续访问disc数组元素时,读取到的是未初始化的默认值0。

修复方案
  • 直接操作全局数组对应位置的元素,避免额外创建局部变量:
else
{
    // 直接给全局数组对应元素赋值
    disc[numDiscs].pos[0] = (double)x;
    disc[numDiscs].pos[1] = (double)y;
    // 给其他成员赋初始值,避免未定义行为
    disc[numDiscs].speed[0] = 0.0;
    disc[numDiscs].speed[1] = 0.0;
    disc[numDiscs].radius = 15.0; // 可按需调整半径数值
    disc[numDiscs].color[0] = 255;
    disc[numDiscs].color[1] = 0;
    disc[numDiscs].color[2] = 0;

    // 测试打印
    cout << disc[numDiscs].pos[0] << endl;
    cout << disc[numDiscs].pos[1] << endl;

    DrawDisc(&disc[numDiscs]);

    numDiscs++;
    glutPostRedisplay();
}
  • 如果你需要使用局部变量做临时处理,记得在变量销毁前将数据拷贝到全局数组:
discType d;
d.pos[0] = (double)x;
d.pos[1] = (double)y;
d.speed[0] = 0.0;
d.speed[1] = 0.0;
d.radius = 15.0;
d.color[0] = 255;
d.color[1] = 0;
d.color[2] = 0;
// 拷贝数据到全局数组
disc[numDiscs] = d;
DrawDisc(&disc[numDiscs]);
额外注意事项
  • 栈变量的指针仅在变量生命周期内有效,变量销毁后继续访问对应指针会触发未定义行为,可能出现乱码、程序崩溃等异常。
  • OpenGL鼠标回调的y轴默认是从窗口顶部向下递增,和OpenGL渲染坐标系的y轴方向相反,如果你发现绘制位置上下颠倒,可以将y坐标转换为(double)winHeight - y。
  • 结构体实例创建后建议给所有成员赋初始值,避免读取到栈内存的随机脏数据。

内容的提问来源于stack exchange,提问作者Selva Vignesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 03:00:05