Single dim array as a multidim array?

S

Sona

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
 
I

Irrwahn Grausewitz

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
 
I

Irrwahn Grausewitz

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
^^^^ said:
int *arr = (int*) malloc( ZDIM * YDIM * XDIM * sizeof *arr );
^^^^^^
Damn, now I've copied this stupid cast!
 
L

llewelly

Irrwahn Grausewitz said:
^^^^^^
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 );
)
 
K

Kevin Goodsell

Irrwahn said:
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
 
I

Irrwahn Grausewitz

Kevin Goodsell said:
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
reply, and mine too...
 
A

Al Bowers

Sona said:
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 = 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
 
F

foo

llewelly said:
Irrwahn Grausewitz said:
^^^^^^
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=60&FORUM_ID=4&CAT_ID=9
 
F

foo

Irrwahn Grausewitz said:
(e-mail address removed) (foo) wrote in
<[email protected]>
a lot of semi-cryptical C++ code. Please do not cross-post
C++ stuff to c.l.c.


And please do not cross-post your superfluous C remarks to c.l.c++

Thank you very much :)
 
L

LibraryUser

foo said:
And please do not cross-post your superfluous C remarks to c.l.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.
 

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

Staff online

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top