two-dimentional array with non constant variables

A

Al

I'd like to declare (in a Matrix class) a two-dimentional array with
user-defined coordinates. The constructor is:
Matrix(int c, int l): col(c), lin(l), a(new float[col][lin]) {}

the compiler says 'lin' should be a constant, but I want it to be
defined from the user, so what should I do? and how must 'a' be
declared??
help me please
 
K

Kai-Uwe Bux

Al said:
I'd like to declare (in a Matrix class) a two-dimentional array with
user-defined coordinates. The constructor is:
Matrix(int c, int l): col(c), lin(l), a(new float[col][lin]) {}

the compiler says 'lin' should be a constant, but I want it to be
defined from the user, so what should I do? and how must 'a' be
declared??
help me please

a) Do not roll your own matrix code unless you absolutely have to. Numerical
analysis is hard. Use a library instead. There are many good linear algebra
libraries out there. Google is your friend.

b) Do not use float for numerical computations unless you know with
certainty that the precision is good enough for your needs. Beware that
linear algebra algorithms can go mad on precision.

c) If you absolutely need to run your own matrix class, do not do the memory
management by yourself. Simply do

template <typename ArithmeticType>
class Matrix

std::size_t row_size;
std::size_t col_size;
std::vector< ArithmeticType > data;

Matrix ( std::size_t rows, std::size_t cols )
: row_size ( rows )
, col_size ( cols )
, data ( rows*cols )
{}

ArithmeticType &
operator() ( std::size_t row, std::size_t col ) {
// check for bounds here if you please ...
return( this->data[row*this->cols_size + col ] );
}

ArithmeticType const &
operator() ( std::size_t row, std::size_t col ) const {
// check for bounds here if you please ...
return( this->data[ row*this->cols_size + col ] );
}

};

You might also want to have a look into std::valarray and the numeric
header.

d) Adhere to established math conventions: matrices have rows and columns,
and rows go first. Make that second nature, and bugs will go away.

e) Again: do not roll your own code.


Best

Kai-Uwe Bux
 
M

mlimber

Al said:
I'd like to declare (in a Matrix class) a two-dimentional array with
user-defined coordinates. The constructor is:
Matrix(int c, int l): col(c), lin(l), a(new float[col][lin]) {}

the compiler says 'lin' should be a constant, but I want it to be
defined from the user, so what should I do? and how must 'a' be
declared??
help me please

Please consult the FAQ:

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.16

But, I'd suggest you use a vector< vector<float> > if possible. It can
make life simpler in many ways.

Cheers! --M
 
O

Old Wolf

Al said:
I'd like to declare (in a Matrix class) a two-dimentional array with
user-defined coordinates. The constructor is:
Matrix(int c, int l): col(c), lin(l), a(new float[col][lin]) {}

the compiler says 'lin' should be a constant, but I want it to be
defined from the user, so what should I do? and how must 'a' be
declared??

You've struck right to the heart of the problem. 'a' must be
declared as:

float (*a)[lin];

But C++ requires that the array dimension is a compile-time constant.
So it is not possible to have this array as you would like.

You could either make 'a' a one-dimension array and add a
function for accessing it as if it were 2-D; or you could
use a vector of vectors.
 
A

Axter

Al said:
I'd like to declare (in a Matrix class) a two-dimentional array with
user-defined coordinates. The constructor is:
Matrix(int c, int l): col(c), lin(l), a(new float[col][lin]) {}

the compiler says 'lin' should be a constant, but I want it to be
defined from the user, so what should I do? and how must 'a' be
declared??
help me please

Check out the following link for an example:
http://code.axter.com/dynamic_2d_array.h

However, I recommend you use a vector of vector.
Example:
int col = 123;
int row = 456;
vector<vector<int> > My2dArray(col, vector<int>(row));

You can reference both the above vector code and the dynamic_2d_array
class using double index ([][])
My2dArray[0][0] = 99;
 
A

Al

thx
I've never used vectors of vectors before, but it's a good reason to
learn it!
How do you use 'typename' ?? (from Kai-Uwe Bux: template<typename
ArithmeticType>)
 
A

Al

what should I do to get the size of the second dimension of the vector,
without using it as a parameter?

void getVector(vector<vector<int> >& v)
{
for(int i = 0;i<v.size();i++)
{ for(int j = 0;j< /*here*/ ;j++)
{ cout <<"v["<<i<<"]["<<j<<"] = ";
cin >>v[j]; } }
}
 
M

Mark P

Al said:
what should I do to get the size of the second dimension of the vector,
without using it as a parameter?
v.size()


void getVector(vector<vector<int> >& v)
{
for(int i = 0;i<v.size();i++)
{ for(int j = 0;j< /*here*/ ;j++)
{ cout <<"v["<<i<<"]["<<j<<"] = ";
cin >>v[j]; } }
}
 

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

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top