Student needs assistance... (deperately)

Discussion in 'C++' started by sandy@murdocks.on.ca, Oct 9, 2006.

  1. Guest

    I am a student with an assignement due tomorrow. I am to write a sort
    of a memory manager, I don't want to go into all of the details (it's
    long).

    I have the following header file for my memory manager:
    <code>
    #ifndef MemManager_h
    #define MemManager_h

    #include <cstdlib>

    class MemManager
    {
    public:
    // Constructor
    //
    // Input : None
    // Purpose: To create an empty MemManager
    // Output : None

    MemManager ( );


    // Copy constructor
    //
    // Input : MemManager M
    // Purpose: To initialize MemManager to M
    // Output : None

    MemManager ( const MemManager & M );

    // Copy assignment
    //
    // Input : MemManager M
    // Purpose: To assign Rhs to current MemManager
    // Output : Current MemManager

    const MemManager & operator= ( const MemManager & M );


    // Destructor
    //
    // Input : None
    // Purpose: To free memory of MemManager
    // Output : None

    ~MemManager ( );


    // Clear
    //
    // Input : None
    // Purpose: To re-initialize MemManager to empty
    // Output : None

    void Clear ( );

    //
    // Input : None
    // Purpose: To delete the top element of MemManager
    // Output : 1 if successful; 0 otherwise
    // Notes: Only used to clear the linked list for this class

    int Pop ( );


    // Empty
    //
    // Input : None
    // Purpose: To check if MemManager is empty
    // Output : 1 if empty; 0 otherwise

    int Empty ( ) const;

    /*****************************************************
    Allocate

    Inputs: int Pages
    Output: int Starting Page

    Notes: Takes in the number of pages needed by a job
    Outputs the starting page for the job in memory
    returns -1 if there is not enough memory for the
    job.
    *********************************************************/
    int Allocate(int N);

    /*************************************************************
    GetNumPages

    Inputs: None
    Outputs: Pages

    Notes: Returns the number of pages in the current
    MemNode's block
    type.
    *************************************************************/
    int GetNumPages(MemNode & MN);

    /**************************************************************
    GetFirstPage

    Inputs: None
    Outputs: Page

    Notes: Returns the first available memory page from the
    current
    MemNode's blockType.

    ********************************************************************/
    //int GetFirstPage(MemNode & MN) const;



    private:

    typedef struct BlockType
    {
    int firstPage;
    int numberPages;

    //Constructor
    BlockType() : firstPage(0), numberPages(59)
    {}

    //I am not sure that I should ALLOW this since we are
    to be
    // limited to 60 pages... I left it in...
    BlockType(int f, int n) : firstPage(f), numberPages(n)
    {}

    }BlockType;

    struct MemNode
    {
    BlockType Element;
    MemNode *Next, *Previous;

    // StackNode constructors
    MemNode ( ) : Next ( NULL )
    {}
    MemNode ( const BlockType & E, MemNode *P = NULL ) :
    Element ( E ), Next ( P )
    { }
    };



    // Pointer to the top of Stack
    MemNode *Top;
    int NumNodes;

    };

    #endif

    </code>

    In the private section I have a typedef (I know this C not C++ but I
    cannot compile if I don't use the type def...)

    I have a typedef of 'BlockType'. I am supposed to keep this Private
    (requirement of the assignment) and I need to access the properties of
    the BlockType: firstPage and numberPages (meaning the first available
    page of memory and the number of pages available respectively.

    I declare the following function:
    int GetNumPages(MemNode & MN);

    I get the non-sensical error of: expected `;' before '(' token

    If I comment out the line the error goes away and it will compile. This
    tells me there are no semi-colons missing on the lines above. The error
    does not however point to any error that I can see to fix.

    I am down to the crunch and I am stumped.

    It would work fine (I think) if I moved the code into a seperate class
    but the prof has specified that he does not want us to do that.

    I however cannot figure out how to get access to those values. (Ant the
    error does not help since the compiler is obviously confused.)

    PLEASE HELP.

    Thanks.
     
    , Oct 9, 2006
    #1
    1. Advertising

  2. Gavin Deane Guest

    wrote:
    > I am a student with an assignement due tomorrow. I am to write a sort
    > of a memory manager, I don't want to go into all of the details (it's
    > long).
    >
    > I have the following header file for my memory manager:


    I have trimmed out the comments fom your code to (hopefully) better
    illustrate the problem.

    > <code>
    > #ifndef MemManager_h
    > #define MemManager_h
    >
    > #include <cstdlib>
    >
    > class MemManager
    > {
    > public:
    > MemManager ( );
    > MemManager ( const MemManager & M );
    > const MemManager & operator= ( const MemManager & M );
    > ~MemManager ( );
    > void Clear ( );
    > int Pop ( );
    > int Empty ( ) const;
    > int Allocate(int N);


    This is your problem line.
    > int GetNumPages(MemNode & MN);
    > private:
    >
    > typedef struct BlockType
    > {


    <snip>

    > }BlockType;
    >
    > struct MemNode
    > {


    <snip>

    > };
    > MemNode *Top;
    > int NumNodes;
    > };
    >
    > #endif
    >
    > </code>


    The compiler reads your code starting at the top and working towards
    the bottom. When it reaches your problem line

    int GetNumPages(MemNode & MN);

    it's going to have trouble knowing what that means if it doesn't know
    what MemNode is. And your definition of MemNode doesn't appear until
    later.

    Do you know about forward declarations? Alternatively, are you aware
    that the public, protectected and private parts of a class do not need
    to be declared in that order and that you can, for example, have a
    private section followed by a public section followed by another
    private section?

    You said you got the error
    expected `;' before '(' token

    I don't know what compiler you are using, but Comeau online does a
    better job of diagnosing the problem. It says
    error: identifier "MemNode" is undefined

    Sometimes compilers are like that. Making the intuitive link between
    what the compiler says and what is actually wrong can be a bit of an
    art.

    <snip>

    Gavin Deane
     
    Gavin Deane, Oct 9, 2006
    #2
    1. Advertising

  3. Guest

    Thank you!

    I have now got a private section, public section, private section.

    I had no idea you could do that.

    I don't know what forward declarations are, but they are now my list of
    things to read about.

    Thanks again.

    FYI: It was recommended that I use Dev C++ by bloodshed so that is what
    I use. That way I can hand in the whole project with the assignment and
    they can either just run it, or complile it as they see fit.



    Gavin Deane wrote:
    > wrote:
    > > I am a student with an assignement due tomorrow. I am to write a sort
    > > of a memory manager, I don't want to go into all of the details (it's
    > > long).
    > >
    > > I have the following header file for my memory manager:

    >
    > I have trimmed out the comments fom your code to (hopefully) better
    > illustrate the problem.
    >
    > > <code>
    > > #ifndef MemManager_h
    > > #define MemManager_h
    > >
    > > #include <cstdlib>
    > >
    > > class MemManager
    > > {
    > > public:
    > > MemManager ( );
    > > MemManager ( const MemManager & M );
    > > const MemManager & operator= ( const MemManager & M );
    > > ~MemManager ( );
    > > void Clear ( );
    > > int Pop ( );
    > > int Empty ( ) const;
    > > int Allocate(int N);

    >
    > This is your problem line.
    > > int GetNumPages(MemNode & MN);
    > > private:
    > >
    > > typedef struct BlockType
    > > {

    >
    > <snip>
    >
    > > }BlockType;
    > >
    > > struct MemNode
    > > {

    >
    > <snip>
    >
    > > };
    > > MemNode *Top;
    > > int NumNodes;
    > > };
    > >
    > > #endif
    > >
    > > </code>

    >
    > The compiler reads your code starting at the top and working towards
    > the bottom. When it reaches your problem line
    >
    > int GetNumPages(MemNode & MN);
    >
    > it's going to have trouble knowing what that means if it doesn't know
    > what MemNode is. And your definition of MemNode doesn't appear until
    > later.
    >
    > Do you know about forward declarations? Alternatively, are you aware
    > that the public, protectected and private parts of a class do not need
    > to be declared in that order and that you can, for example, have a
    > private section followed by a public section followed by another
    > private section?
    >
    > You said you got the error
    > expected `;' before '(' token
    >
    > I don't know what compiler you are using, but Comeau online does a
    > better job of diagnosing the problem. It says
    > error: identifier "MemNode" is undefined
    >
    > Sometimes compilers are like that. Making the intuitive link between
    > what the compiler says and what is actually wrong can be a bit of an
    > art.
    >
    > <snip>
    >
    > Gavin Deane
     
    , Oct 9, 2006
    #3
  4. Guest

    ****

    Sorry I spoke too soon.

    It compiled because in my debugging I had commented out the function.

    It didn't compile. I am still looking at the issue.


    Gavin Deane wrote:
    > wrote:
    > > I am a student with an assignement due tomorrow. I am to write a sort
    > > of a memory manager, I don't want to go into all of the details (it's
    > > long).
    > >
    > > I have the following header file for my memory manager:

    >
    > I have trimmed out the comments fom your code to (hopefully) better
    > illustrate the problem.
    >
    > > <code>
    > > #ifndef MemManager_h
    > > #define MemManager_h
    > >
    > > #include <cstdlib>
    > >
    > > class MemManager
    > > {
    > > public:
    > > MemManager ( );
    > > MemManager ( const MemManager & M );
    > > const MemManager & operator= ( const MemManager & M );
    > > ~MemManager ( );
    > > void Clear ( );
    > > int Pop ( );
    > > int Empty ( ) const;
    > > int Allocate(int N);

    >
    > This is your problem line.
    > > int GetNumPages(MemNode & MN);
    > > private:
    > >
    > > typedef struct BlockType
    > > {

    >
    > <snip>
    >
    > > }BlockType;
    > >
    > > struct MemNode
    > > {

    >
    > <snip>
    >
    > > };
    > > MemNode *Top;
    > > int NumNodes;
    > > };
    > >
    > > #endif
    > >
    > > </code>

    >
    > The compiler reads your code starting at the top and working towards
    > the bottom. When it reaches your problem line
    >
    > int GetNumPages(MemNode & MN);
    >
    > it's going to have trouble knowing what that means if it doesn't know
    > what MemNode is. And your definition of MemNode doesn't appear until
    > later.
    >
    > Do you know about forward declarations? Alternatively, are you aware
    > that the public, protectected and private parts of a class do not need
    > to be declared in that order and that you can, for example, have a
    > private section followed by a public section followed by another
    > private section?
    >
    > You said you got the error
    > expected `;' before '(' token
    >
    > I don't know what compiler you are using, but Comeau online does a
    > better job of diagnosing the problem. It says
    > error: identifier "MemNode" is undefined
    >
    > Sometimes compilers are like that. Making the intuitive link between
    > what the compiler says and what is actually wrong can be a bit of an
    > art.
    >
    > <snip>
    >
    > Gavin Deane
     
    , Oct 9, 2006
    #4
  5. Guest

    Got it now.

    Thanks again.


    wrote:
    > ****
    >
    > Sorry I spoke too soon.
    >
    > It compiled because in my debugging I had commented out the function.
    >
    > It didn't compile. I am still looking at the issue.
    >
    >
    > Gavin Deane wrote:
    > > wrote:
    > > > I am a student with an assignement due tomorrow. I am to write a sort
    > > > of a memory manager, I don't want to go into all of the details (it's
    > > > long).
    > > >
    > > > I have the following header file for my memory manager:

    > >
    > > I have trimmed out the comments fom your code to (hopefully) better
    > > illustrate the problem.
    > >
    > > > <code>
    > > > #ifndef MemManager_h
    > > > #define MemManager_h
    > > >
    > > > #include <cstdlib>
    > > >
    > > > class MemManager
    > > > {
    > > > public:
    > > > MemManager ( );
    > > > MemManager ( const MemManager & M );
    > > > const MemManager & operator= ( const MemManager & M );
    > > > ~MemManager ( );
    > > > void Clear ( );
    > > > int Pop ( );
    > > > int Empty ( ) const;
    > > > int Allocate(int N);

    > >
    > > This is your problem line.
    > > > int GetNumPages(MemNode & MN);
    > > > private:
    > > >
    > > > typedef struct BlockType
    > > > {

    > >
    > > <snip>
    > >
    > > > }BlockType;
    > > >
    > > > struct MemNode
    > > > {

    > >
    > > <snip>
    > >
    > > > };
    > > > MemNode *Top;
    > > > int NumNodes;
    > > > };
    > > >
    > > > #endif
    > > >
    > > > </code>

    > >
    > > The compiler reads your code starting at the top and working towards
    > > the bottom. When it reaches your problem line
    > >
    > > int GetNumPages(MemNode & MN);
    > >
    > > it's going to have trouble knowing what that means if it doesn't know
    > > what MemNode is. And your definition of MemNode doesn't appear until
    > > later.
    > >
    > > Do you know about forward declarations? Alternatively, are you aware
    > > that the public, protectected and private parts of a class do not need
    > > to be declared in that order and that you can, for example, have a
    > > private section followed by a public section followed by another
    > > private section?
    > >
    > > You said you got the error
    > > expected `;' before '(' token
    > >
    > > I don't know what compiler you are using, but Comeau online does a
    > > better job of diagnosing the problem. It says
    > > error: identifier "MemNode" is undefined
    > >
    > > Sometimes compilers are like that. Making the intuitive link between
    > > what the compiler says and what is actually wrong can be a bit of an
    > > art.
    > >
    > > <snip>
    > >
    > > Gavin Deane
     
    , Oct 9, 2006
    #5
  6. Guest

    wrote:
    > ****
    >
    > Sorry I spoke too soon.
    >
    > It compiled because in my debugging I had commented out the function.
    >
    > It didn't compile. I am still looking at the issue.
    >
    >


    Re-arrange your class, put the private section before the public
    section.
     
    , Oct 9, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rodney Edmondson
    Replies:
    3
    Views:
    359
    David Segall
    Nov 25, 2003
  2. beyonder74

    Java Student Needs Help

    beyonder74, Sep 12, 2004, in forum: Java
    Replies:
    5
    Views:
    879
    Tris Orendorff
    Sep 15, 2004
  3. Ville Vainio
    Replies:
    0
    Views:
    309
    Ville Vainio
    May 3, 2006
  4. Replies:
    10
    Views:
    490
    Noah Roberts
    Oct 6, 2006
  5. Replies:
    6
    Views:
    345
Loading...

Share This Page