468,101 Members | 1,325 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,101 developers. It's quick & easy.

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 5214
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

To reply by email, remove "link" and change "now.here" to "yahoo"
jfischer_link5809{at}now.here.com
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.
To contact me please use the address from a recent posting.

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
reply, and mine too...

--
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
foo
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
<c1**************************@posting.google.com >
a lot of semi-cryptical C++ code. Please do not cross-post
C++ stuff to c.l.c.
--
When things look dark,
hold your head high so it can rain up your nose.
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.


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.

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

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by somaboy mx | last post: by
8 posts views Thread by Levent | last post: by
10 posts views Thread by Sona | last post: by
2 posts views Thread by Salman Khilji | last post: by
1 post views Thread by Abhi | last post: by
1 post views Thread by Astha | last post: by
31 posts views Thread by mdh | last post: by
1 post views Thread by Solo | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.