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"

  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,128
    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,128
    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,128
    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.

  7. #7
    Junior Member Newbie
    Join Date
    Oct 2012
    Posts
    6
    Quote Originally Posted by thokra View Post
    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.
    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.
    Last edited by TheKidd; 10-31-2012 at 09:26 AM.

Posting Permissions

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