Morgan
Morgan

Reputation: 356

Reversing for loop causing system errors

This feels like a newbie issue, but I can't seem to figure it out. I want to iterate over the items in a std::vector. Currently I use this loop:

for (unsigned int i = 0; i < buffer.size(); i++) {
    myclass* var = buffer.at(i);
    [...]
}

However, I realised that I actually want to iterate over it in the opposite order: starting at the end and working my way to 0. So I tried using this iterator:

for (unsigned int i = buffer.size()-1; i >= 0; i--) {
    myclass* var = buffer.at(i);
    [...]
}

But by simply replacing the old line with the new (and of course, recompiling), then it goes from running properly and iterating over the code, it instead causes the program to crash the first time it hits this line, with this error:

http://i43.tinypic.com/20sinlw.png

Followed by a "[Program] has stopped working" dialog box.

The program also returns exit code 3, according to Code::Blocks, which (if this article is to be believed) means ERROR_PATH_NOT_FOUND: The system cannot find the file specified.

Any advice? Am I just missing something in my for loop that's maybe causing some sort of memory issue? Is the return code of 3, or the article, misleading, and it doesn't actually mean "path not found"?

Upvotes: 1

Views: 82

Answers (3)

Dmitri Bouianov
Dmitri Bouianov

Reputation: 538

#include <vector>

using namespace std;

int main() {
    vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) {
        //do your stuff
    }
    return 0;
}

Upvotes: 0

Ken Wayne VanderLinde
Ken Wayne VanderLinde

Reputation: 19349

When i == 0 (i.e. what should be the last iteration), the decrement i-- causes i to wrap around to the largest possible value for an unsigned int. Thus, the condition i >= 0 still holds, even though you'd like the loop to stop.

To fix this, you can try something like this, which maintains the original loop logic, but yields a decrementing i:

unsigned int i;
unsigned int size = buffer.size();
for (unsigned int j = 0; j < size; j++) {
    i = size - j - 1;

Alternatively, since std::vector has rbegin and rend methods defined, you can use iterators:

for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i)
{
    myclass* var = *i;
    // ...
}

(There might be small syntactic errors - I don't have a compiler handy)

Upvotes: 2

Kaz
Kaz

Reputation: 58578

An unsigned integer is always >= 0. Furthermore, decrementing from 0 leaps to a large number.

Upvotes: 3

Related Questions