Creating a 2D or 3D array?

C

carl

I need to create either a 2D or 3D array based on the dimension specified by
the user. So far I just split it in two cases depending on the specified
parameter:


// 2D grid
if(NDimensions==2) {
double offset = imageSize[0] / (nodes-1) * 1.0;
// generalize to ND ?.
int id = 0;
for (int i = 0; i < nodes; i++) {
for (int j = 0; j < nodes; j++) {
ControlPointType cp;

VectorType location, deformation;
location[0] = i*offset;
location[1] = j*offset;

deformation.Fill(0);
cp.setDeformation(deformation);
cp.setLocation(location);
cp.setId(id);
m_ControlPoints.push_back(cp);
id++;
}
}
}

// 2D cube
if(NDimensions == 3) {
double x_offset = imageSize[0] / (nodes-1) * 1.0;
double y_offset = imageSize[1] / (nodes-1) * 1.0;
double z_offset = imageSize[2] / (nodes-1) * 1.0;
int id = 0;
for (int i = 0; i < nodes; i++) {
for (int j = 0; j < nodes; j++) {
for (int k = 0; k < nodes; k++) {
ControlPointType cp;
VectorType location, deformation;
location[0] = i*x_offset;
location[1] = j*y_offset;
location[2] = k*z_offset;
deformation.Fill(0);
cp.setDeformation(deformation);
cp.setLocation(location);
cp.setId(id);
m_ControlPoints.push_back(cp);
id++;
}
}
}

}


But is there some more generic way to do this or is it only possible when
splitting the code up like above?
 
V

Victor Bazarov

carl said:
I need to create either a 2D or 3D array based on the dimension
specified by the user. So far I just split it in two cases depending on
the specified parameter:
[..]
But is there some more generic way to do this or is it only possible
when splitting the code up like above?

You seem to have forgotten to mention that the sizes of your dimensions
are the same. Are they? If so, you could write a template, something
in line with

#include <vector>

template<int N, unsigned Exp> struct Pow {
static unsigned long const res = N * Pow<N,Exp-1>::res;
};

template<int N> struct Pow<N,0U> {
static unsigned long const res = 1;
};

template<class T, int N, int Dims> class MyArray
{
std::vector<T> data;
public:
MyArray() : data(Pow<N,Dims>::res) {}
};

int main() {
MyArray<int, 50, 3> i; // that's how you use it
}

(filling up 'MyArray' with indexing and other functionality is left as
an exercise)

Of course, that still leaves 'N' specified at compile-time. So, rewrite
this to specify it at run-time, as the argument to the constructor. You
won't need 'Pow' template (or, rather, you will need a different 'Pow'
template).

Good luck!

V
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top