# 2D-Arrays Re-sized

• 06-14-2004
Epo
2D-Arrays Re-sized
Here's the scenario:

In a class, I have a two dimensional array, let's call it: 2DArray.
To declare it, I use:
int 2DArray[20][20];

Now, naturally, it is an array of integers, holding 441 (21 x 21) values.

But, this "20" I use is pretty open to change. Sometimes I might feel like throwing in a 50, sometimes a 2, it depends on my current mood. Now, the problem is, I use this number "20" many many times throughout my class AND main program, so, going through each time and changing the "20"s that apply can get rather tiresome.

What I was hoping was to find a way that I could make a variable within my class, to hold the dimensions of my 2DArray (it will always be symmetrical, I.e. 1x1 or 5x5 or 50x50), and then declare a 2D Array based on that variable? That way I'll also be able to retrieve the value from my main app and use the number there if calculations are needed.

Thanks :)
Erik
• 06-14-2004
Zach L.
Umm... Actually, it only holds 400 (20x20) values.

At any rate, to solve your problem, I recommend one of the following:
1) Use dynamic memory allocation; just be sure to clean up properly when you resize, which would be a pain to deal with.
2) Use a constant for your values: 'const int ARRAY_SIZE = 20;' somewhere in your code, and then use ARRAY_SIZE where you had used your literal value (only requiring one change and then a recompile).
3) Use STL and a vector inside a vector: i.e. 'vector<vector<int> > m2DArray'.

The best is the last suggestion. The first is the most dangerous if you are not very familiar/comfortable with dynamic memory allocation.

Cheers
• 06-14-2004
Epo
Bah, you're right, [20] = [0 to 19], not [0 to 20] :)

And as for those three options...I have no clue about anything that Options 1 or 3 suggest :) But I'm liking the simplicity (and distance from messing with memory) that number 3 has, but I have no clue what STL is, or how I could use vectors for it...but I really don't want to go messing with memory allocation.

I'll give #3 a shot and I'll most likely be back here in the near future with a couple of questions :) Thanks

Erik
• 06-14-2004
Zach L.
Good call staying away from #1. As for #3, try this thread for some pointers to STL info: http://cboard.cprogramming.com/showthread.php?t=53919

Vectors are actually quite nice. You can treat them just like arrays, and they are resizable (with their own internal memory management). The one thing I should warn you of is the inefficiency of resizing an array/vector in such a manner, though perhaps this is not much of an issue. Just make sure that all of your vectors get resized.

A fourth idea (which is likely overkill) is to find a library with a good matrix class.

Good luck.
• 06-15-2004
Salem
For simplicity, at the expense of some memory, you could do

const int MAX_SIZE = 30;
typedef int twoDArray[MAX_SIZE][MAX_SIZE];

Sure it wastes some memory if all you want is a 5x5, but so long as the max isn't too big, and you don't have too many of them (like hundreds), then it's a pretty easy way to deal with the problem.

void foo ( twoDArray bar, size_t current_size );
Pass the array, and whatever it's current size is (up to the max), and everything takes care of itself. :)