Re: 2d array with comma operator in C++?
Diaboflo wrote:
I have seen many threads that you can't innitialise 2d arrays with a
comma operator in C++. But when I tried it it actually worked fine. I
can call any element of the array using the comma operator.
I'm using g++ on a sun station.
Are there important reasons why I shouldn't do it this way and better
allocate it as a **pointer?
There are no two dimensional arrays in your code.
{ What you wrote as [a,b] below is actually equivalent to [b]. -mod/sk }
int main()
{
double *e;
e=new double[10,10];
This allocates a one dimensional array, type double[]. The
proof is that you can assign the results to a double*.
Formally, C++ doesn't have two dimensional arrays, just arrays
of arrays. Normally, the difference is irrelevant, but it does
affect conversions and the return type of new: an array of
arrays converts to a pointer to an array. After that, it is a
pointer, not an array, so no further conversion occurs. Thus,
if you write:
double* e = new double[ 10 ][ 10 ] ;
the code will not compile, since a pointer to an array[10] of
double is not a pointer to a double.
Of course, since you've allocated a single dimensional array,
and you have a pointer to the first element of a single
dimensional array, all of the rest works as well. On a single
dimensional array. If you really want a two dimensional array,
and the second dimension is a constant, you can write:
double (*e)[ 10 ] = new double[ 10 ][ 10 ] ;
In most cases, however, I'd suggest encapsulating this into a
class, using a single dimensional array internally. Something
along the lines of:
template< typename T >
class Vector2D
{
public:
Vector2D( size_t n, size_t m ) : myY( m ), myData( n * m ) {}
T const* operator[]( size_t i ) const
{
return &myData[ myY * i ] ;
}
T* operator[]( size_t i )
{
return &myData[ myY * i ] ;
}
private:
size_t myY ;
std::vector< T > myData ;
} ;
(I'd actually add a bit more error checking, at least in the
form of assert.)
This way, both dimensions can be variable.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]