程序异常,堆栈溢出??

时间:2022-10-23 01:11:03
用第三方软件CsGL画一个螺旋线,编译没有错误,但是提示堆栈溢出,求高手帮我看看是怎么回事?
-----------------------------------------------------------------------
类的源代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CsGL.OpenGL;

namespace OpenGL_nn1
{
    class Shili
    {
        private const double PI = 3.1415926;
        private float x, y, angle;
        private float xRot = 0.0f;
        private float yRot = 0.0f;

        public Shili() { }

        public void Render3DShow()//显示螺旋线
        {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT);
            GL.glPushMatrix();
            GL.glRotatef(xRot, 1.0f, 0.0f, 0.0f);
            GL.glRotatef(yRot, 0.0f, 1.0f, 0.0f);
            GL.glBegin(GL.GL_POINTS);
            float  z =-50.0f;
            for (angle = 0.0f; angle <= (2.0f * Math.PI) * 3.0f; angle += 0.1f)
                  {
                     x = 50.0f* (float)Math.Sin(angle);
                     y = 50.0f* (float)Math.Cos(angle);
                     GL.glVertex3f(x, y, z);
                     z +=0.5f;
                   }
                     GL.glEnd();
                     GL.glPopMatrix();
                     GL.glFlush();
                     GL.glVertex3f(x, y, z);
               
            
        }

    }
}





7 个解决方案

#1


无限递归(自己调用自己)造成的。

#2


[Quote=引用楼主  的回复:]
怎么改啊。。。?求解

#3


执行到哪行出现的?

#4


看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,

#5


引用 3 楼  的回复:
执行到哪行出现的?

namespace OpenGL_nn1
{
     public class OpenGLBase:OpenGLControl
    { 
        Timer Timer_GLupdate = new Timer();//窗口重绘计时器
        private Shili shili = new Shili();
        public OpenGLBase()
        {
            #region OpenGL屏幕刷新计时器
            this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
            this.Timer_GLupdate.Interval = 10;
            this.Timer_GLupdate.Start();
            #endregion 
            /* 按键回调          */
           // this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);
        }
        private void Timer_GLupdate_Tick(Object sender, EventArgs e)//创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
        {
            this.Invalidate();
        }
         #region 窗体重绘
        /// <summary>
        /// 视口改变大小时重新设置视口和绘图
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSizeChanged(EventArgs e)
        {
            GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);//根据窗口大小设置视口
            /*重置投影矩阵堆栈 */
            GL.glMatrixMode(GL.GL_PROJECTION);
            GL.glLoadIdentity(); 
                           
            GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f);
            GL.glMatrixMode(GL.GL_MODELVIEW);//重置模型视图矩阵
            GL.glLoadIdentity();       
        }
        /// <summary>
        /// OnPaint方法处理Paint事件
        /// </summary>
        /// <param name="pevent"></param>
       // protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
        //{
          //  base.OnPaint(pevent);
            //ToDo:可加入自己的设计代码
        //}

        #endregion
       /* OpenGL初始化*/
        protected override void InitGLContext()
        {
            base.InitGLContext();

            GL.glMatrixMode(GL.GL_PROJECTION);//选择投影矩阵
            GL.glLoadIdentity();//重设投影矩阵
            GL.gluPerspective(40.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);//调整视口大小
            GL.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//黑色背景
            GL.glMatrixMode(GL.GL_MODELVIEW);//选择模型观察矩阵
            GL.glLoadIdentity();//重置模型观察矩阵
            GL.glShadeModel(GL.GL_SMOOTH); // 启用阴影平滑
        }

        public override void glDraw()
        {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
            GL.glLoadIdentity();  //重置当前模型视图矩阵
            GL.glColor3f(0.0f, 1.0f, 0.0f);//绘图颜色设置为绿色
            GL.glPushMatrix();//保存矩阵状态并进行旋转
            shili.Render3DShow();
            GL.glFlush();     //刷新绘图命令
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }
    }
}
异常提示是class openGL,说CSGL有问题,可是之前画平面图像都没有问题呀。

#6


引用 4 楼  的回复:
看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,

CSGL.dll从2002年开始就没有更新过了,平面图都没有问题,一画立体图就出错。。。

#7


引用 5 楼  的回复:
引用 3 楼 的回复:
执行到哪行出现的?

namespace OpenGL_nn1
{
  public class OpenGLBase:OpenGLControl
  { 
  Timer Timer_GLupdate = new Timer();//窗口重绘计时器
  private Shili shili = new Shili();
  public OpenGLB……

你先把绘画的代码备份下,然后从最后开始删掉一行调试下,还异常就再删一行再调试,直到找出哪句话出的问题

#1


无限递归(自己调用自己)造成的。

#2


[Quote=引用楼主  的回复:]
怎么改啊。。。?求解

#3


执行到哪行出现的?

#4


看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,

#5


引用 3 楼  的回复:
执行到哪行出现的?

namespace OpenGL_nn1
{
     public class OpenGLBase:OpenGLControl
    { 
        Timer Timer_GLupdate = new Timer();//窗口重绘计时器
        private Shili shili = new Shili();
        public OpenGLBase()
        {
            #region OpenGL屏幕刷新计时器
            this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
            this.Timer_GLupdate.Interval = 10;
            this.Timer_GLupdate.Start();
            #endregion 
            /* 按键回调          */
           // this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);
        }
        private void Timer_GLupdate_Tick(Object sender, EventArgs e)//创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
        {
            this.Invalidate();
        }
         #region 窗体重绘
        /// <summary>
        /// 视口改变大小时重新设置视口和绘图
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSizeChanged(EventArgs e)
        {
            GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);//根据窗口大小设置视口
            /*重置投影矩阵堆栈 */
            GL.glMatrixMode(GL.GL_PROJECTION);
            GL.glLoadIdentity(); 
                           
            GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f);
            GL.glMatrixMode(GL.GL_MODELVIEW);//重置模型视图矩阵
            GL.glLoadIdentity();       
        }
        /// <summary>
        /// OnPaint方法处理Paint事件
        /// </summary>
        /// <param name="pevent"></param>
       // protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
        //{
          //  base.OnPaint(pevent);
            //ToDo:可加入自己的设计代码
        //}

        #endregion
       /* OpenGL初始化*/
        protected override void InitGLContext()
        {
            base.InitGLContext();

            GL.glMatrixMode(GL.GL_PROJECTION);//选择投影矩阵
            GL.glLoadIdentity();//重设投影矩阵
            GL.gluPerspective(40.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);//调整视口大小
            GL.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//黑色背景
            GL.glMatrixMode(GL.GL_MODELVIEW);//选择模型观察矩阵
            GL.glLoadIdentity();//重置模型观察矩阵
            GL.glShadeModel(GL.GL_SMOOTH); // 启用阴影平滑
        }

        public override void glDraw()
        {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
            GL.glLoadIdentity();  //重置当前模型视图矩阵
            GL.glColor3f(0.0f, 1.0f, 0.0f);//绘图颜色设置为绿色
            GL.glPushMatrix();//保存矩阵状态并进行旋转
            shili.Render3DShow();
            GL.glFlush();     //刷新绘图命令
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }
    }
}
异常提示是class openGL,说CSGL有问题,可是之前画平面图像都没有问题呀。

#6


引用 4 楼  的回复:
看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,

CSGL.dll从2002年开始就没有更新过了,平面图都没有问题,一画立体图就出错。。。

#7


引用 5 楼  的回复:
引用 3 楼 的回复:
执行到哪行出现的?

namespace OpenGL_nn1
{
  public class OpenGLBase:OpenGLControl
  { 
  Timer Timer_GLupdate = new Timer();//窗口重绘计时器
  private Shili shili = new Shili();
  public OpenGLB……

你先把绘画的代码备份下,然后从最后开始删掉一行调试下,还异常就再删一行再调试,直到找出哪句话出的问题

相关文章