By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,903 Members | 1,180 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,903 IT Pros & Developers. It's quick & easy.

two-dimentional array with non constant variables

P: n/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

Oct 27 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
Al wrote:
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-lit...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

Oct 27 '05 #2

P: n/a
Al wrote:
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
Oct 27 '05 #3

P: n/a
Al
you know... just newbie training...
thx

Oct 27 '05 #4

P: n/a
Al wrote:
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.

Oct 27 '05 #5

P: n/a

Al wrote:
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;

Oct 28 '05 #6

P: n/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>)

Oct 28 '05 #7

P: n/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[i][j]; } }
}

Oct 28 '05 #8

P: n/a
Al wrote:
what should I do to get the size of the second dimension of the vector,
without using it as a parameter?
v[i].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[i][j]; } }
}

Oct 29 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.