By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,680 Members | 1,578 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,680 IT Pros & Developers. It's quick & easy.

Function pop causing crash

P: n/a
The program below fails on execution and I think the error is in my
pop function but it all looks correct.Also could someone check my code
as to why my print function is not
working? I havent included the other parts of my program but will if
someone needs it. Please help; I have had it. I have checked all C++
websites and cannot figure it out.
<code>

template<class Type>
void Novice<Type>::Print()
{
while(! IsEmpty())
{
std::cout << topPtr->item;
topPtr = topPtr ->next;
}
}
template<class Type>
void Novice<Type>::Pop(Type &y)
{
if(IsEmpty())
throw EmptyStack();
else
{
Node<Type*tempPtr;
tempPtr = topPtr;
topPtr = topPtr -next;
delete tempPtr;
}
}
// main function

int main()
{
Novice<inta;
int s;

a.Pop(s); // not working
a.Push(1);
a.Push(2);
a.Push(3);
cout << a.length() << endl;
a.Pop(s);
cout << a.length() << endl;
a.Print();
}

</code>

Apr 15 '07 #1
Share this Question
Share on Google+
4 Replies


P: n/a
I guess you are popping from an empty stack and it is throwing an
exception because IsEmpty will be true. Wrap the code in a
try{}catch() block and catch the exception. Hope that helps.

Apr 15 '07 #2

P: n/a
j_*******@yahoo.com wrote:
The program below fails on execution and I think the error is in my
pop function but it all looks correct.Also could someone check my code
as to why my print function is not
working? I havent included the other parts of my program but will if
someone needs it. Please help; I have had it. I have checked all C++
websites and cannot figure it out.
<code>
If you want some decent help, post something that compiles, otherwise we
have to guess what a Novice and a Node are.

--
Ian Collins.
Apr 16 '07 #3

P: n/a
Prashanth wrote:
I guess you are popping from an empty stack and it is throwing an
exception because IsEmpty will be true. Wrap the code in a
try{}catch() block and catch the exception. Hope that helps.
Please keep the context you are replying to. This post makes no sense
on its own.

--
Ian Collins.
Apr 16 '07 #4

P: n/a
On Apr 15, 4:54 pm, j_depp...@yahoo.com wrote:
The program below fails on execution and I think the error is in my
pop function but it all looks correct.
And thats exactly what the program should do - fail. You are
attempting to pop an empty container and you aren't handling the
expected and thrown exception. Thats assuming that IsEmpty() is
working properly.
Since relying on educated guesses and assumptions is what we are asked
to disscuss here: try compiling and running the following program for
illustration.

#include <iostream>
#include <stdexcept>

class EmptyStack : public std::runtime_error
{
public:
EmptyStack()
: std::runtime_error("EmptyStack error") { }
};

int main()
{
try {
throw EmptyStack();
}
catch(const std::exception& r_e)
{
std::cout << "error: " << r_e.what();
std::cout << std::endl;
}
}

/*
error: EmptyStack error
*/

The std::runtime_error type is derived from std::exception. The thrown
exception is therefore caught by the above catch block. What should
the program do if i were to throw EmptyStack() and don't bother
catching it? Try it.

int main()
{
throw EmptyStack();
}

Does the result look familiar to you?
Note: you don't have to derive from anything insofar as the type
EmptyStack is concerned. You can throw anything, as long as you use a
try block and catch it.

class EmptyStack { };

int main()
{
try {
throw EmptyStack();
}
catch(const EmptyStack& r_e)
{
std::cout << "error: EmptyStack" << std::endl;
}
// other catch blocks...
}
Also could someone check my code as to why my print function is not
working? I havent included the other parts of my program but will if
someone needs it. Please help; I have had it. I have checked all C++
websites and cannot figure it out.
<code>

template<class Type>
void Novice<Type>::Print()
{
while(! IsEmpty())
{
std::cout << topPtr->item;
topPtr = topPtr ->next;
}

}
The function is not 'emptying' the container in any way (IsEmpty() is
never satisfied). You are therefore stepping through ghost pointers
(topPtr->next). Anything can happen here - the result is undefined.
>
template<class Type>
void Novice<Type>::Pop(Type &y)
{
if(IsEmpty())
throw EmptyStack();
else
{
Node<Type*tempPtr;
tempPtr = topPtr;
topPtr = topPtr -next;
delete tempPtr;
}

}

// main function

int main()
{
Novice<inta;
int s;

a.Pop(s); // not working
a.Push(1);
a.Push(2);
a.Push(3);
cout << a.length() << endl;
a.Pop(s);
cout << a.length() << endl;
a.Print();

}

</code>

Apr 16 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.