Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 7 of 7

Thread: Compile Errors using "Canvas Class"

Hybrid View

  1. #1
    Junior Member Newbie
    Join Date
    Oct 2012
    Posts
    6

    Compile Errors using "Canvas Class"

    I am required to use this class to do turtle graphics/relative drawing, however I can never get it to compile.

    For example I try to run this program:

    Code :
    #define GLUT_DISABLE_ATEXIT_HACK
    #include <GL/glut.h>
    #include "Canvas.h"
     
    #define screenWidth 400
    #define screenHeight 400
     
    Canvas cvs(screenWidth, screenHeight, "Turtle"); //This is where the error occurs, which directs to a specific line in Canvas.h
     
    void drawShape(Canvas cvs, const int n)
    {
    	cvs.moveTo(200, 200);
    	cvs.turn(-(60-24));
     
     
    	for(int i = 1; i <=n; i++)
    	{
    		cvs.turn(60-24);
    		cvs.forward(100,1);   //side 1
    		cvs.turn(60);
    		cvs.forward(100,1);   //side 2
    		cvs.turn(60);
    		cvs.forward(100,1);   //side 3
    		cvs.turn(60);
    		cvs.forward(100,1);   //side 4
    		cvs.turn(60);
    		cvs.forward(100,1);   //side 5
    		cvs.turn(60);
    		cvs.forward(100,1);   //side 6
     
    	}
     
     
    }
     
    //<<<<<<<<<<<<<<<<<<<<<<<< display >>>>>>>>>>>>>>>>>
    void display(void)
    {
       cvs.clearScreen();
       cvs.setBackgroundColor(0.0, 0.0, 0.0);
       cvs.setColor(1.0, 1.0, 1.0);
       cvs.setWindow(0, 400.0, 0.0, 400.0);
       cvs.setViewport(0, 400, 0, 400);
     
       drawShape(cvs, 15);
       glFlush();
    }
     
     
    int main(int argc, char** argv) {
    	   cvs.setBackgroundColor(0.0, 0.0, 0.0);
      // Window is opened in the Canvas constructor
      glutDisplayFunc(display);
      glutMainLoop();
      return (0);
    }


    I get a compile error within canvas.h at the line that I indicated below.
    What is the issue here????????????????

    Code :
    //Classes for 2D graphics.
    // definition of simple support classes:
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <strstream>
    using namespace std;
     
    #include <windows.h> //change if using xWindows
    #include <assert.h>
    #include <math.h>
    #include <stdlib.h>
    #include <gl/GL.h>
    #include <gl/GLU.h>
    #include <gl/glut.h>
     
    //@@@@@@@@@@@@@@@@@@ IntPoint class @@@@@@@@@@@@@@@@
    class IntPoint{ // for 2D points with integer coordinates
    public:
        int x,y;
        void set(int dx, int dy){x = dx; y = dy;}
        void set(IntPoint& p){ x = p.x; y = p.y;}
        IntPoint(int xx, int yy){x = xx; y = yy;}
        IntPoint(){ x = y = 0;}
    };
     
     
    //@@@@@@@@@@@@@@@@@@ Point2 class @@@@@@@@@@@@@@@@
    class Point2{ // for 2D points with real coordinates
    public:
        float x,y;
        void set(float dx, float dy){x = dx; y = dy;}
        void set(Point2& p){ x = p.x; y = p.y;}
        Point2(float xx, float yy){x = xx; y = yy;}
        Point2(){x = y = 0;}
    };
     
     
    //<<<<<<<<<<<<<<<<<<<< Canvas class >>>>>>>>>>>
    // a global Canvas object (described in Chapter 3) knows how
    // to draw lines in world coordinates and to perform turtlegraphics
    class Canvas {
     private:
          Point2 CP;    // current position in world
          float CD; // current direction in degrees
     public:
          float windowAspect;
          Canvas(int width, int height, char* title)
          {
            char* list; //dummy list for glutInit
            int numArgs = 1;//dummy value for glutInit
            glutInit(&numArgs, &list);  //THIS LINE IS CAUSING THE ERROR*************error reading characters of string, unable to read memory**********************************************************************************
            glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
            glutInitWindowSize(width, height);
            glutInitWindowPosition(100, 100);
            glutCreateWindow(title);
            CP.x = CP.y = 0.0;
            windowAspect = 1.0;
        }
        void setWindow(float l, float r, float b, float t)
        {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluOrtho2D((GLdouble)l, (GLdouble)r, (GLdouble)b, (GLdouble)t);
            if(t == b) return;
            windowAspect = (r - l)/(t - b);
        }
        void setViewport(int l, int r, int b, int t)
            {glViewport((GLint)l, (GLint)b, (GLint)(r-l), (GLint)(t-b));}
        float getWindowAspect(void) { return windowAspect;}
        void lineTo(float x, float y)
        {
            glBegin(GL_LINES);
            glVertex2f((GLfloat)CP.x, (GLfloat)CP.y);
            CP.x = x; CP.y = y;
            glVertex2f((GLfloat)CP.x, (GLfloat)CP.y);
            glEnd();    glFlush();
        }
        void moveTo(float x, float y){CP.x = x; CP.y = y;}
        void turn(float ang) {CD += ang;}
        void turnTo(float ang) {CD = ang;}
        void forward(float dist, int vis)
        {
            #define RadPerDeg 0.017453393 //radians per degree
            float x = CP.x + dist * cos(RadPerDeg * CD);
            float y = CP.y + dist * sin(RadPerDeg * CD);
            if(vis) lineTo(x, y);
            else moveTo(x, y);
            CP.x = x; CP.y = y;
        }
        void initCT() // initialize the CT (model view matrix)
        {
            glMatrixMode(GL_MODELVIEW); glLoadIdentity();
        }
        void rotate2D(double angle)
        {
            glMatrixMode(GL_MODELVIEW); glRotated(angle, 0.0, 0.0, 1.0);
        }
        void translate2D(double dx, double dy)
        {
            glMatrixMode(GL_MODELVIEW); glTranslated(dx, dy, 0.0);
        }
        void scale2D(double sx, double sy)
        {
            glMatrixMode(GL_MODELVIEW); glScaled(sx, sy, 1.0);
        }
        void pushCT(void)
        {
            glMatrixMode(GL_MODELVIEW); glPushMatrix();
        }
        void popCT(void)
        {
            glMatrixMode(GL_MODELVIEW); glPopMatrix();
        }
     
     
        // Member functions added by George Corliss for Figure 3.26:
        void clearScreen(void) {
            glClear(GL_COLOR_BUFFER_BIT);
        }
     
        void setBackgroundColor(GLclampf red, GLclampf green, GLclampf blue) {
            glClearColor(red, green, blue,0.0);
        }
        void setColor(GLfloat red, GLfloat green, GLfloat blue) {
            glColor3f(red, green, blue);
        }
     
    };
     
     
    //<<<<<<<<<<<<<<<<<<<<<< PolyLine >>>>>>>>>>>>>>>>>>>>>>>>>
    class PolyLine{ // a polyline is a num plus an array of points
    public:
        int num;
        Point2 pt[80]; //may need larger arrays in some circumstances
        PolyLine(){num = 0;}
    };
     
     
    // @@@@@@@@@@@@@@@@@@@@@@@@ IntRect class @@@@@@@@@@@@@@@@@@@@
    class IntRect{ // a rectangle with integer border values
    public:
      int left, top, right, bott;
      IntRect(){left = top = right = bott = 0;}
      IntRect(int l, int t, int r, int b)
      {left = l; top = t; right = r; bott = b;}
      void set(int l, int t, int r, int b)
      {left = l; top = t; right = r; bott = b;}
      void set(IntRect& r)
      {left = r.left; top = r.top; right = r.right; bott = r.bott;}
      void draw (Canvas cvs) {
         cvs.moveTo(left,  top );
         cvs.lineTo(right, top );
         cvs.lineTo(right, bott);
         cvs.lineTo(left,  bott);
         cvs.lineTo(left,  top );
      }
    };
     
     
    // @@@@@@@@@@@@@@@@@@@@@@@@ RealRect class @@@@@@@@@@@@@@@@@@@@
    class RealRect{ // a rectangle with integer border values
    public:
      float left, top, right, bott;
      RealRect(){left = top = right = bott = 0;}
      RealRect(float l, float t, float r, float b)
      {left = l; top = t; right = r; bott = b;}
      void set(float l, float t, float r, float b)
      {left = l; top = t; right = r; bott = b;}
      void set(RealRect& r)
      {left = r.left; top = r.top; right = r.right; bott = r.bott;}
      void draw (Canvas cvs) {
         cvs.moveTo(left,  top );
         cvs.lineTo(right, top );
         cvs.lineTo(right, bott);
         cvs.lineTo(left,  bott);
         cvs.lineTo(left,  top );
      }
    };
     
     
     
    // @@@@@@@@@@@@@@@@@@@@@@@@ ngon class @@@@@@@@@@@@@@@@@@@@
    class ngon{ // a rectangle with integer border values
    public:
      int n;
      float cx, cy, radius, rotAngle;
      ngon(){
         n  = 0;
         cx = cy = radius = rotAngle = 0;
      }
      ngon(int nn, float ccx, float ccy, float rradius, float rrotAngle){
         if (nn < 3) { n = 3; }
         else { n = nn; }
         cx = ccx; cy = ccy; radius = rradius; rotAngle = rrotAngle;
      }
      void set (int nn, float ccx, float ccy, float rradius, float rrotAngle)
      {
         if (nn < 3) { n = 3; }
         else { n = nn; }
         cx = ccx; cy = ccy; radius = rradius; rotAngle = rrotAngle;
      }
      void set(ngon& r)
      {
         n = r.n; cx = r.cx; cy = r.cy;
         radius = r.radius; rotAngle = r.rotAngle;
      }
      void draw (Canvas cvs) {
          double angle = rotAngle * 3.14159265 / 180;  // initial angle
          double angleInc = 2 * 3.14159265 /n;         //angle increment
    //      cvs.moveTo(radius + cx, cy);  // Hill's code.  GC mod:
          cvs.moveTo(radius * cos(angle) + cx,
                     radius * sin(angle) + cy);
          for(int k = 0; k < n; k++)                   // repeat n times
          {
             angle += angleInc;
             cvs.lineTo(radius * cos(angle) + cx,
                        radius * sin(angle) + cy);
          }
      }
    };
     
     
    //@@@@@@@@@@@@@@@@@@ Vector2 class @@@@@@@@@@@@@@@@
    class Vector2{
    public:
        float x,y;
        void set(float dx, float dy){ x = dx; y = dy; }
        void set(Vector2& v){ x = v.x; y = v.y;}
        void setDiff(Point2& a, Point2& b)//set to difference a - b
        {x = a.x - b.x; y = a.y - b.y;}
        void normalize()//adjust this vector to unit length
        {       double sizeSq = x * x + y * y;
            if(sizeSq < 0.0000001)
            {
                cerr << "\nnormalize() sees vector (0,0)!";
                return; // does nothing to zero vectors;
            }
            float scaleFactor = 1.0/(float)sqrt(sizeSq);
            x *= scaleFactor; y *= scaleFactor;
        }
        Vector2(float xx, float yy){x = xx; y = yy; }
        Vector2(Vector2& v){x = v.x; y = v.y; }
        Vector2(){x = y = 0;} //default constructor
        float dot(Vector2 b) // return this dotted with b
        {return x * b.x + y * b.y;}
        void perp() // perp this vector
        {float tmp = x; x = -y; y = tmp;}
        float perpDot(Vector2& v) // return perp of this dotted with v
        {return x *v.x - y * v.y;}
    };
     
     
    //3D Classes for Graphics
     
    //@@@@@@@@@@@@@@@@@@ Point3 class @@@@@@@@@@@@@@@@
    class Point3{
    public:
        float x, y, z;
        void set(float dx, float dy, float dz){x = dx; y = dy; z = dz;}
        void set(const Point3& p){x = p.x; y = p.y; z = p.z;}
        Point3(float xx,     float yy, float zz){x = xx; y = yy; z = zz;}
        Point3(){x = y = z = 0;}
        Point3(int dx, int dy, int dz){x = dx; y = dy; z = dz;}
        void build4tuple(float v[])
        {// load 4-tuple with this color: v[3] = 1 for homogeneous
            v[0] = x; v[1] = y; v[2] = z; v[3] = 1.0f;
        }
    };
     
     
    //@@@@@@@@@@@@@@@@@@ Vector3 class @@@@@@@@@@@@@@@@
    class Vector3{
    public:
        float x, y, z;
        void set(float dx, float dy, float dz){ x = dx; y = dy; z = dz;}
        void set(const Vector3& v){ x = v.x; y = v.y; z = v.z;}
        void flip(){x = -x; y = -y; z = -z;}  // reverse this vector
        void setDiff(const Point3& a, const Point3& b)    // set to difference a - b
        { x = a.x - b.x; y = a.y - b.y; z = a.z - b.z;}
        void normalize()      //adjust this vector to unit length
        {
            double sizeSq = x * x + y * y + z * z;
            if(sizeSq < 0.0000001) {
                cerr << "\nnormalize() sees vector (0,0,0)!";
                return; // does nothing to zero vectors;
            }
            float scaleFactor = 1.0/(float)sqrt(sizeSq);
            x *= scaleFactor; y *= scaleFactor; z *= scaleFactor;
        }
        Vector3(float xx, float yy, float zz){x = xx; y = yy; z = zz;}
        Vector3(int xx, int yy, int zz){x = xx; y = yy; z = zz;}
        Vector3(Vector3& v){x = v.x; y = v.y; z = v.z;}
        Vector3(){x = y = z = 0;}  //default constructor
        Vector3 cross(Vector3 b)   //return this cross b
        {
           Vector3 c(y*b.z - z*b.y, z*b.x - x*b.z, x*b.y - y*b.x);
           return c;
        }
        float dot(Vector3 b) // return this dotted with b
        {return x * b.x + y * b.y + z * b.z;}
    };
     
     
    // @@@@@@@@@@@@@@@@@@@@@ Color3 class @@@@@@@@@@@@@@@@
    class Color3 { // holds an red, green, blue 3-tuple
    public:
        float red, green, blue;
        Color3(){red = green = blue = 0;}
        Color3(float r, float g, float b){red = r; green = g; blue = b;}
        Color3(Color3& c){red = c.red; green = c.green; blue = c.blue;}
        void set(float r, float g, float b){red = r; green = g; blue = b;}
        void set(Color3& c)
          {red = c.red; green = c.green; blue = c.blue;}
        void add(float r, float g, float b)
          {red += r; green += g; blue += b;}
        void add(Color3& src, Color3& refl)
        { // add the product of source color and reflection coefficient
            red   += src.red   * refl.red;
            green += src.green * refl.green;
            blue  += src.blue  * refl.blue;
        }
        void add(Color3& colr)
        { // add colr to this color
         red += colr.red ; green += colr.green; blue += colr.blue;}
        void build4tuple(float v[])
        {// load 4-tuple with this color: v[3] = 1 for homogeneous
            v[0] = red; v[1] = green; v[2] = blue; v[3] = 1.0f;
        }
    };
     
     
    //@@@@@@@@@@@@@@@@@@@@ light class @@@@@@@@@@@@@@@@@@@
    class Light{ // for a linked list of light sources’ color and position
    public:
        Point3 pos;
        Color3 color;
        Light* next;
        void setPosition(Point3 p){pos.set(p);}
        void setColor(Color3 c){color.set(c);}
        Light(){next = NULL;}
    };

  2. #2
    Senior Member OpenGL Pro
    Join Date
    Apr 2010
    Location
    Germany
    Posts
    1,099
    I got some compiler error too in that one file I was working on the other day...

    You have to be more precise, i.e. post the error the compiler spits out.

  3. #3
    Junior Member Newbie
    Join Date
    Oct 2012
    Posts
    6
    Quote Originally Posted by thokra View Post
    I got some compiler error too in that one file I was working on the other day...

    You have to be more precise, i.e. post the error the compiler spits out.
    I doubt it makes it more clear, but:

    First-chance exception at 0x1000FDAC (glut32.dll) in ConsoleApplication7.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.
    Unhandled exception at 0x1000FDAC (glut32.dll) in ConsoleApplication7.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.
    The program '[8988] ConsoleApplication7.exe' has exited with code 0 (0x0).

  4. #4
    Senior Member OpenGL Pro
    Join Date
    Apr 2010
    Location
    Germany
    Posts
    1,099
    If you don't call glutInit() and if it doesn't succeed, I'm not surprised by the error.

    EDIT:

    Code :
    char* list; //dummy list for glutInit
    int numArgs = 1;//dummy value for glutInit
    glutInit(&numArgs, &list);

    BTW, do you actually know what this piece of code does?

  5. #5
    Junior Member Newbie
    Join Date
    Oct 2012
    Posts
    6
    BTW, do you actually know what this piece of code does?
    Not really. I assumed it should work though, since the code was given to me as something that was already working on someone else's system.

  6. #6
    Senior Member OpenGL Pro
    Join Date
    Apr 2010
    Location
    Germany
    Posts
    1,099
    list is undefined. Just because your type is char* doesn't mean it actually points to a valid memory location. Use something like

    Code :
    char* list = "dummy";

    I doubt this code works on any other machine and the problem caused by glutInit() isn't a compile time error but a runtime error. If you get compiler errors, then the above error messages aren't the actual errors you wanted to show here.

    You should brush up on your C/C++ knowledge before posting another question which has nothing to do whatsoever with OpenGL. Questions you might want to ask yourself:

    - Do I know what a pointer is?
    - Do I know what the value of an uninitialized pointer is?
    - Do I know what "access violation" means?
    - Do I know the difference between runtime and compile time?

    Anyway, give us the compiler error, not the runtime error.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •