"JoeC" <en*****@yahoo.comwrote in message
news:11**********************@38g2000cwa.googlegro ups.com...
>I understand the basics of pointers, they point to memory locations.
The contain address values which represent memory locations.
I
would like to know resources for learning all about poters.
I find this one reasonable:
http://pw1.netcom.com/~tjensen/ptr/pointers.htm
Note: it's in the context of C, but it works the
same as C++, except for the 'void*' automatic
conversion.
But after looking at your code, I don't think your
trouble (if I've correctly guessed what it is),
has to do with pointers, but with iterators.
I am
having some problems erasing elements of pointers from a vector.
Specifically what problems?
I
wold like to know where I can get some in depth information on how to
use pointers in various situations.
Good textbooks (see
www.accu.org) or see link above.
It seems that all most books have
to say about pointers is that they point to memory locations.
Which books?
Some
even say they are read/write iterators for arrays.
That's a reasonable description of one thing they
could be used for.
I am using pointers
refrences and handles,
'handle' is a term not defined by the C++ language, but
the 'handle' abstraction is often implemented as a pointer.
most of the time I get the syntax correct but I
have a problem in a complex program and I cant figure out what the
problem is:
You still haven't described your problem, but looking at your code,
and making a couple assumptions, I can guess what the trouble is.
>
I created a handle to contor my dynamicly binded units and I need
pointer to these handles to work in the space holder object in my map
manager for this game.
bool spaceholder::kill(){
std::vector<hunit*>::iterator itr = u.begin();
if(!u.empty()){
while(itr != u.end()){
Aside:
If begin() == end() then the container is empty,
so the test for !empty() is redundant.
if((*itr)->marked()){
Is type 'hunit' an iterator or pointer to a struct/class, or does it
overload the '->' operator? If not, this syntax is incorrect.
I'll go ahead and assume that the answer to this question is yes.
itr = u.erase(itr);
This is probably your problem. vector.erase() returns an
iterator to the element beyond the one erased. If you've
just erased the last element, this returned iterator will
be 'end()', in which case ...
kill = true;
}++itr;
.... this line would cause 'itr' to increment past 'end()',
producing undefined behavior. Was the problem a crash,
or 'segfault', or 'access violation' or similar?
>
}
}
}
Try:
bool spaceholder::kill(){
std::vector<hunit*>::iterator itr = u.begin();
while(itr != u.end()){
if((*itr)->marked()){
itr = u.erase(itr);
kill = true;
continue; /* new line */
}++itr;
}
}
If this does not solve your problem, you'll need to give
more specific information, ideally including a complete,
compilable example which exhibits the problem.
-Mike