vector does funny stuff (just to piss me off)
ok, so heres my problem, im writing a Tile Based SDL thing, so my way of doing it is load in the texture file, onto one surface, then create an array of SDL_Rects to hold the location of each of the tiles. I decided to use the Vector STL so i dont have to use big arrays. so heres my code:
//header stuff
vector SampleTiles;
/*edit: gamedev removes the angle brackets, and all the contained*/
//body stuff
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
counter++;
rect.x = c * tilewidth;
rect.y = r * tileheight;
rect.w = tilewidth;
rect.h = tileheight;
SampleTiles.push_back(rect);
}
}
so anyway, when i output rect.x inside the loop, i get normal values, incrementing by 16 (the tile width), but when i ask for SampleTiles[counter].x i get these crazy numbers like -21216
so anyway, where am i going wrong?
thanks a lot
-- Jake
[edited by - shade13 on June 7, 2004 7:35:00 PM]
When that loop ends, counter = rows*columns.
The last element is (rows*columns)-1. (You''re overstepping your array bounds)
The last element is (rows*columns)-1. (You''re overstepping your array bounds)
My vector has no preset size, im using the SampleTiles.push_back(rect), counter is really only there for the output:
fprintf(crap, "+++ Rect #%i +++\n"
"+x: %i\n"
"+y: %i\n"
"+w: %i\n"
"+h: %i\n"
"++++++++++++++++\n\n", counter, SampleTiles[counter].x, SampleTiles[counter].y, SampleTiles[counter].w, SampleTiles[counter].h);
fprintf(crap, "+++ Rect #%i +++\n"
"+x: %i\n"
"+y: %i\n"
"+w: %i\n"
"+h: %i\n"
"++++++++++++++++\n\n", counter, SampleTiles[counter].x, SampleTiles[counter].y, SampleTiles[counter].w, SampleTiles[counter].h);
can you post your code again in [*source][/source] brackets please (without the asterix)? i'd like to see how you define your vector (the part with the angle brackets. Also, please show the class definition for whatever class rect is.
here's the rest easier to read:
-me
[edited by - Palidine on June 7, 2004 7:48:34 PM]
here's the rest easier to read:
//EDIT: this is the line i want to see.//header stuffvector SampleTiles; //body stufffor (int r = 0; r < rows; r++) { for (int c = 0; c < columns; c++) { counter++; rect.x = c * tilewidth; rect.y = r * tileheight; rect.w = tilewidth; rect.h = tileheight; SampleTiles.push_back(rect); }}
-me
[edited by - Palidine on June 7, 2004 7:48:34 PM]
ok, so heres the code:
ok, i gave a bit more detail there, thanks in advance
-- Jake
class cMap {public: int LoadTextures(char * texturefile, int rows, int columns); void debugOn() { debug = 1; } void debugOff() { debug = 0; } private: vector <SDL_Rect> SampleTiles; int debug;};int cMap::LoadTextures(char *texturefile, int rows, int columns) { SDL_Rect rect; SDL_Surface* s; int tilewidth, tileheight, counter; FILE * crap; //SampleTiles.resize(rows * columns + 1); if (debug) { crap = fopen("cMap.txt", "w+"); } if ((s = IMG_Load(texturefile)) == NULL) { if (debug) fprintf(crap, "--------------------+ Couldn''t load texture file: %s\n", texturefile); return 1; } tilewidth = s->w / columns; tileheight = s->h / rows; counter = 0; for (int r = 0; r < rows; r++) { for (int c = 0; c < columns; c++) { counter++; rect.x = c * tilewidth; rect.y = r * tileheight; rect.w = tilewidth; rect.h = tileheight; SampleTiles.push_back(rect); fprintf(crap, "+++ Rect #%i +++\n" "+x: %i\n" "+y: %i\n" "+w: %i\n" "+h: %i\n" "++++++++++++++++\n\n", counter, SampleTiles[counter].x, SampleTiles[counter].y, SampleTiles[counter].w, SampleTiles[counter].h); } } return 0;}
ok, i gave a bit more detail there, thanks in advance
-- Jake
oh, rite. pretty simple.
the way you are incrementing counter you are always accessing one position beyond where you actually are in the vector.
i.e.:
basically just move the counter++; below the line where you actually print things out. the way it's written now the first time you print out during your iterations counter will be == 1, however you don't have a rect in vector[1] yet, only vector[0]. the funny part, i guess, is that your code is actually fine, it was your debugging code that had the error
-me
[edited by - Palidine on June 7, 2004 8:04:02 PM]
the way you are incrementing counter you are always accessing one position beyond where you actually are in the vector.
i.e.:
vector<int> foo;int counter = 0;foo.push_back(1); //this puts 1 into the 0th position in the array//so if you:cout << foo[counter+1];//you are now beyond the bounds of your vector//this is what you are doing in your program as it's written
basically just move the counter++; below the line where you actually print things out. the way it's written now the first time you print out during your iterations counter will be == 1, however you don't have a rect in vector[1] yet, only vector[0]. the funny part, i guess, is that your code is actually fine, it was your debugging code that had the error
-me
[edited by - Palidine on June 7, 2004 8:04:02 PM]
i thought of that, but the counter is only used for viewing.
each frame is 16 px wide/tall, so when i directly output the crap to my datafile, i get it all working, but when i go thru my vector, heres a sample:
+++ Rect #1 +++
+x: 56
+y: 2
+w: 1
+h: 0
++++++++++++++++
+++ Rect #2 +++
+x: 53
+y: 3
+w: 1
+h: 0
++++++++++++++++
+++ Rect #3 +++
+x: -21216
+y: 30661
+w: 0
+h: 0
++++++++++++++++
+++ Rect #4 +++
+x: 513
+y: 5
+w: 257
+h: 8
++++++++++++++++
+++ Rect #5 +++
+x: -11824
+y: 1280
+w: 20944
+h: 1281
++++++++++++++++
+++ Rect #6 +++
+x: -11824
+y: 1280
+w: 53712
+h: 1280
++++++++++++++++
-- Jake
[edited by - shade13 on June 7, 2004 8:04:17 PM]
ps. eating dinner, back in an hour
[edited by - shade13 on June 7, 2004 8:05:25 PM]
each frame is 16 px wide/tall, so when i directly output the crap to my datafile, i get it all working, but when i go thru my vector, heres a sample:
+++ Rect #1 +++
+x: 56
+y: 2
+w: 1
+h: 0
++++++++++++++++
+++ Rect #2 +++
+x: 53
+y: 3
+w: 1
+h: 0
++++++++++++++++
+++ Rect #3 +++
+x: -21216
+y: 30661
+w: 0
+h: 0
++++++++++++++++
+++ Rect #4 +++
+x: 513
+y: 5
+w: 257
+h: 8
++++++++++++++++
+++ Rect #5 +++
+x: -11824
+y: 1280
+w: 20944
+h: 1281
++++++++++++++++
+++ Rect #6 +++
+x: -11824
+y: 1280
+w: 53712
+h: 1280
++++++++++++++++
-- Jake
[edited by - shade13 on June 7, 2004 8:04:17 PM]
ps. eating dinner, back in an hour
[edited by - shade13 on June 7, 2004 8:05:25 PM]
no, look. it's an order of operations thing:
this is the correct way:
make sense? vectors, like arrays, start element numbering at zero, not one. the first element in a vector is always accesses with vectorName[0]. vectorName[1] is actually the 2nd element in the array. you are printing to the file, the wrong information. if you actually go through your vector afterwards, you will find it contains the correct information:
-me
[edited by - Palidine on June 7, 2004 8:07:36 PM]
[edited by - Palidine on June 7, 2004 8:10:10 PM]
[edited by - Palidine on June 7, 2004 8:14:32 PM]
vector<int> foo;int counter = 0;foo.push_back(1);counter++;cout << foo[counter];//this is exactly what you are doing//counter is = 1 when you print it. however, the number 1 is//in position foo[0]. NOT foo[1]. so you are printing beyond the//bounds of your array
this is the correct way:
vector<int> foo;int counter = 0;foo.push_back(1);cout << foo[counter];counter++;//now counter is = 0 when you print//the number 1 will now be printed to the screen
make sense? vectors, like arrays, start element numbering at zero, not one. the first element in a vector is always accesses with vectorName[0]. vectorName[1] is actually the 2nd element in the array. you are printing to the file, the wrong information. if you actually go through your vector afterwards, you will find it contains the correct information:
for ( unsigned int i = 0; i < SampleTiles.size(); ++i ){ std::cout << SampleTiles[i].x << " " << SampleTiles[i].y << " " << SampleTiles[i].w << " " << SampleTiles[i].h << \n";}
-me
[edited by - Palidine on June 7, 2004 8:07:36 PM]
[edited by - Palidine on June 7, 2004 8:10:10 PM]
[edited by - Palidine on June 7, 2004 8:14:32 PM]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement