472,982 Members | 1,738 Online

# Single dim array as a multidim array?

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

Jul 19 '05 #1
10 5402
Sona <so**********@nospam.net> wrote in
<3f********@clarion.carno.net.au>:
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.
Jul 19 '05 #2
Irrwahn Grausewitz <ir*****@freenet.de> wrote in
<l9********************************@4ax.com>:
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!
Jul 19 '05 #3
Irrwahn Grausewitz <ir*****@freenet.de> writes:
Irrwahn Grausewitz <ir*****@freenet.de> wrote in
<l9********************************@4ax.com>:
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 );
)

Jul 19 '05 #4
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 :)

Consider the following C++ program

<example>
void foo(int **b, int rows, int cols)
{
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
b[r][c] = r*c + c;
}
}
}

int main()
{
int rows = 5;
int cols = 3;
int **a = 0;

try {
a = new int*[rows];
a[0] = 0;
a[0] = new int[rows * cols];
for (int r = 1; r < rows; ++r)
a[r] = a[r-1] + cols;

// use the "2D array" 'a' here
foo(a, rows, cols);
}
catch (...) {
// whatever
}

// house keeping
if ( a ) {
delete[] a[0];
delete[] a;
}

return 0;
}
</example>

--
Jim

Jul 19 '05 #5
Irrwahn Grausewitz wrote:
Sona <so**********@nospam.net> wrote in
<3f********@clarion.carno.net.au>:

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.

Jul 19 '05 #6
Kevin Goodsell <us*********************@neverbox.com> 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.
Jul 19 '05 #7

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: xa*@abowers.combase.com (remove the x)
http://www.geocities.com/abowers822/

Jul 19 '05 #8
llewelly <ll*********@xmission.dot.com> wrote in message news:<86************@Zorthluthik.local.bar>...
Irrwahn Grausewitz <ir*****@freenet.de> writes:
Irrwahn Grausewitz <ir*****@freenet.de> wrote in
<l9********************************@4ax.com>:
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
Jul 19 '05 #9
ma*******@axter.com (foo) wrote in
a lot of semi-cryptical C++ code. Please do not cross-post
C++ stuff to c.l.c.
--
When things look dark,
Jul 19 '05 #10
foo wrote:
Irrwahn Grausewitz <ir*****@freenet.de> wrote in message
ma*******@axter.com (foo) wrote in

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.

You are both at fault here, not to mention the OP (who should not
have crossposted in the first place). Both of you should have
set followups. This is the appropriate mechanism to advise
across newsgroups, and prevent further confusion.

--
Replies should be to the newsgroup
Chuck Falconer, on vacation.
Jul 19 '05 #11

This thread has been closed and replies have been disabled. Please start a new discussion.