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:

#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???

//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 << "
normalize() 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 << "
normalize() 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;}
}; 

I got some compiler error too in that one file I was working on the other day… :rolleyes:

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

[QUOTE=thokra;1244018]I got some compiler error too in that one file I was working on the other day… :rolleyes:

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

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).

If you don’t call glutInit() and if it doesn’t succeed, I’m not surprised by the error.

EDIT:

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?

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.

list is undefined. Just because your type is char* doesn’t mean it actually points to a valid memory location. Use something like

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.

[QUOTE=thokra;1244034]list is undefined. Just because your type is char* doesn’t mean it actually points to a valid memory location. Use something like

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.[/QUOTE]

hmmm… interesting that my instructor would distribute the code with this error in it.

Pointers seems to be one of those things I have to relearn every couple months.

I’m thinking an access violation refers to accessing memory that has not been allocated by the program. The uninitialized pointer mustve been pointing to such a memory location.

And yeah I was confused about compile vs runtime errors in the visual studio environment, but the difference is clear now.

I will make sure my postings are graphics related in the future, assuming I can understand the nature of the problem in the first place lol

Anyway thanks for the help, that solved the problem.