Velocity Reviews > Single dim array as a multidim array?

# Single dim array as a multidim array?

Sona
Guest
Posts: n/a

 09-01-2003
Please could someone tell me how to use a single-dimensional array as a
two-dimensional array? Is the following correct:

int ROW_SIZE = 5;
int COL_SIZE = 3;

int *arr = (int*) malloc(sizeof(int) *ROW_SIZE*COL_SIZE);

arr[i *COLUMN_SIZE + j];

will this only work for square arrays or all two-dim arrays ? Thanks

Sona

Irrwahn Grausewitz
Guest
Posts: n/a

 09-01-2003
Sona <(E-Mail Removed)> wrote in
<3f534c51\$(E-Mail Removed)>:

>Please could someone tell me how to use a single-dimensional array as a
>two-dimensional array? Is the following correct:
>
>int ROW_SIZE = 5;
>int COL_SIZE = 3;
>
>int *arr = (int*) malloc(sizeof(int) *ROW_SIZE*COL_SIZE);

Nit1: arr isn't an array, albeit you can apply the [] operator
to an pointer to int (which it is).

Nit2: the cast to int* is superfluous in C.

>
>arr[i * COLUMN_SIZE + j];

This will work as long as i is in [0 ; ROW_SIZE-1]
and j is in [0 ; COL_SIZE-1].

Much like in a RealArray(tm):

int realArr[YDIM][XDIM];
realArr[ y ][ x ] ...

>
>will this only work for square arrays or all two-dim arrays ? Thanks

Well, for square arrays i and j are interchangeable, as long as
you use them in a consistently, but it works for all n-dimensional
arrays, e.g.:

int *arr = (int*) malloc( ZDIM * YDIM * XDIM * sizeof *arr );

arr[ z * XDIM * YDIM + y * XDIM + x ] = 42;

Irrwahn

--
If it's not on fire, it's a software problem.

Irrwahn Grausewitz
Guest
Posts: n/a

 09-01-2003
Irrwahn Grausewitz <(E-Mail Removed)> wrote in
<(E-Mail Removed)>:

>Well, for square arrays i and j are interchangeable, as long as
>you use them in a consistently, but it works for all n-dimensional

^^^^<del>
>
>int *arr = (int*) malloc( ZDIM * YDIM * XDIM * sizeof *arr );

^^^^^^
Damn, now I've copied this stupid cast!

--
Learn how to splel, dmanit!

llewelly
Guest
Posts: n/a

 09-01-2003
Irrwahn Grausewitz <(E-Mail Removed)> writes:

> Irrwahn Grausewitz <(E-Mail Removed)> wrote in
> <(E-Mail Removed)>:
>
>>Well, for square arrays i and j are interchangeable, as long as
>>you use them in a consistently, but it works for all n-dimensional

> ^^^^<del>
>>
>>int *arr = (int*) malloc( ZDIM * YDIM * XDIM * sizeof *arr );

> ^^^^^^
> Damn, now I've copied this stupid cast!

That's ok. Weirdos who compile your code on boxen where int and int*
are not the same size deserve undefined behavior. Especially if
you forgot to include a header. Remember, all the world is a
wintel32.

(Note to c.l.c++ readers: that cast isn't necessary or safe in C++
either; the alternatives are:
vector<int> arr(ZDIM * YDIM * XDIM);
int *arr= new [ZDIM * YDIM * XDIM * sizeof *arr];
int *arr= static_cast<int*> malloc( ZDIM * YDIM * XDIM * sizeof *arr );
)

Kevin Goodsell
Guest
Posts: n/a

 09-01-2003
Irrwahn Grausewitz wrote:

> Sona <(E-Mail Removed)> wrote in
> <3f534c51\$(E-Mail Removed)>:
>
>
>>Please could someone tell me how to use a single-dimensional array as a
>>two-dimensional array? Is the following correct:
>>
>>int ROW_SIZE = 5;
>>int COL_SIZE = 3;
>>
>>int *arr = (int*) malloc(sizeof(int) *ROW_SIZE*COL_SIZE);

>
> Nit1: arr isn't an array, albeit you can apply the [] operator
> to an pointer to int (which it is).
>
> Nit2: the cast to int* is superfluous in C.
>

It's a bit worse than superfluous. It can be dangerous (as can any cast).

It's necessary in C++, but in C++ you normally shouldn't use 'malloc' at
all. In nearly all cases you should use 'new' instead.

-Kevin
--
My email address is valid, but changes periodically.

Irrwahn Grausewitz
Guest
Posts: n/a

 09-01-2003
Kevin Goodsell <(E-Mail Removed)> wrote in
<3f539667@shknews01>:
>
>It's necessary in C++, but in C++ you normally shouldn't use 'malloc' at
>all. In nearly all cases you should use 'new' instead.
>

From the use of malloc() in the OP's example I derived that this was a
C-question - though it was cross-posted to c.l.c and c.l.c++, like your

--
I wish life had a scroll-back buffer.

Al Bowers
Guest
Posts: n/a

 09-01-2003

Sona wrote:
> Please could someone tell me how to use a single-dimensional array as a
> two-dimensional array? Is the following correct:
>
> int ROW_SIZE = 5;
> int COL_SIZE = 3;
>
> int *arr = (int*) malloc(sizeof(int) *ROW_SIZE*COL_SIZE);
>
> arr[i *COLUMN_SIZE + j];
>
> will this only work for square arrays or all two-dim arrays ? Thanks
>

I like:
int i, **arr;
arr = malloc(sizeof(*arr)*ROW_SIZE);
for(i = 0;i < ROW_SIZE; i++)
arr[i] = malloc(sizeof(**arr)*COL_SIZE);
arr[4][2] = 6; /* assuming successful allocations */

This is only one of various ways you can do this. The faq
demonstrates this technique and others at:
http://www.eskimo.com/~scs/C-faq/q6.16.html

--
Al Bowers
Tampa, Fl USA
mailto: http://www.velocityreviews.com/forums/(E-Mail Removed) (remove the x)
http://www.geocities.com/abowers822/

foo
Guest
Posts: n/a

 09-01-2003
llewelly <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>...
> Irrwahn Grausewitz <(E-Mail Removed)> writes:
>
> > Irrwahn Grausewitz <(E-Mail Removed)> wrote in
> > <(E-Mail Removed)>:
> >
> >>Well, for square arrays i and j are interchangeable, as long as
> >>you use them in a consistently, but it works for all n-dimensional

> ^^^^<del>
> >>
> >>int *arr = (int*) malloc( ZDIM * YDIM * XDIM * sizeof *arr );

> > ^^^^^^
> > Damn, now I've copied this stupid cast!

>
> That's ok. Weirdos who compile your code on boxen where int and int*
> are not the same size deserve undefined behavior. Especially if
> you forgot to include a header. Remember, all the world is a
> wintel32.
>
> (Note to c.l.c++ readers: that cast isn't necessary or safe in C++
> either; the alternatives are:
> vector<int> arr(ZDIM * YDIM * XDIM);
> int *arr= new [ZDIM * YDIM * XDIM * sizeof *arr];
> int *arr= static_cast<int*> malloc( ZDIM * YDIM * XDIM * sizeof *arr );
> )

IMHO, a better C++ alterantive would be to use either a
vector<vector<int> > object or even better yet, the following dynamic
2 dimensional array object:
template < class T, int ROW_T = 0, int COL_T = 0 >
class dynamic_2d_array
{
public:
dynamic_2d_array(int row, int col):m_row(row),m_col(col),
m_data((row!=0&&col!=0)?new T[row*col]:NULL){}
dynamic_2d_array():m_row(ROW_T),m_col(COL_T), m_data(new
T[ROW_T*COL_T])
{if (!COL_T || !ROW_T) {int x[ROW_T] = {{ROW_T}};int y[COL_T] =
{{x[0]}};}}
~dynamic_2d_array(){if(m_data) delete []m_data;}
T* operator[](int i) {return (m_data + (m_col*i));}
T const*const operator[](int i) const {return (m_data +
(m_col*i));}
private:
const int m_row;
const int m_col;
T* m_data;
};
See following link for usuage example and for vector<vector<type> >
example:

http://axter.com/faq/topic.asp?TOPIC..._ID=4&CAT_ID=9

Irrwahn Grausewitz
Guest
Posts: n/a

 09-01-2003
(E-Mail Removed) (foo) wrote in
<(E-Mail Removed) >
a lot of semi-cryptical C++ code. Please do not cross-post
C++ stuff to c.l.c.
--
When things look dark,

foo
Guest
Posts: n/a

 09-02-2003
Irrwahn Grausewitz <(E-Mail Removed)> wrote in message news:<(E-Mail Removed)>. ..
> (E-Mail Removed) (foo) wrote in
> <(E-Mail Removed) >
> a lot of semi-cryptical C++ code. Please do not cross-post
> C++ stuff to c.l.c.
>>>>Nit2: the cast to int* is superfluous in C.

Thank you very much