Re: access violation question
"Thomas" <user@nl.invalid> wrote in message
news:ifb0v5$m5g$1@speranza.aioe.org...
On 27-12-2010 22:28, Ian Collins wrote:
On 12/28/10 10:20 AM, Paavo Helde wrote:
Thomas<user@nl.invalid> wrote in news:ifav7r$i6v$1@speranza.aioe.org:
On 27-12-2010 17:49, AnonMail2005@gmail.com wrote:
Please post your code.
Here is the code, that will compile on Codeblocks (gcc compiler), but
leads to an error during execution.
First error seems to be in the function terugtel():
while (terugtel != vint.size())
{
terugtel++;
if (vint[terugtel] == terugtel + 1)
Here terugtel becomes equal to vint.size() eventually, thus vint
[terugtel] is illegal.
This was easily catched by MSVC++2010 Debug mode build, BTW.
You pipped me to the post! Also easily spotted by Solaris dbx.
Thomas, you should find your self a decent debugger!
As it happens, this problem doesn't arise, because the vector<int>s with
length n in this program are by definition filled with permutations of the
integer range [1..n] (not [0..n-1]). The terugtel() function worked fine
in all previous programs that used it.
All *previous* programs that use it. I get an error in the code
inline unsigned int terugtel (vector<unsigned int>& vint)
{
unsigned int terugtel = 0, vangst = 0;
while (terugtel != vint.size())
{
terugtel++;
if (vint[terugtel] == terugtel + 1)
{
reverse (vint.begin(), vint.begin()+terugtel+1);
terugtel = 0;
++vangst;
}
}
return vangst;
}
reverse (vint.begin(), vint.begin()+terugtel+1);
terugtel is currently 18. The vint size is 20. Where is vint.begin() +
terugtel + 1 going to point to? Which element in the 20 element vint?
Oops. 18 + 20 + 1 = 40. So it's going to point to the 40th element in the
array. This may have worked for you in the past in other programs, but
it's not working now. You need to ensure that you do go past .end() which
is expected. The confusion comes in when you mix iterators (begin()) with
array counters (terugtel) you have to do your own manual checking to make
sure "they" (the pointer/iterator you are going to use) is within bounds.
It does not always break, of course, just sometimes when it's working toward
the end of the array. You need to fix your logic.
Incidently, it's very bad to have a function name with the same name as a
variable name. Your function name is terugtel and your variable is
terugtel. *shudder* I am not positive that terugtel + 1 represents the
variable + 1 or the address off the function + 1. If you must, give your
function names a capital letter. This wouldn't compile in C because of the
name clash, but it does in C++ becaue of name mangaling I believe. Still
ugly as sin.
on the line