473,327 Members | 1,997 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,327 software developers and data experts.

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 5418
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: somaboy mx | last post by:
Hello, I need to do the following: Say I have a multidim array: $array = array(); $array = 'Kevin';
8
by: Levent | last post by:
Hi, Is it possible to have static multi-dim array as a function return parameter? in particular, class Foo { int arr; public: ? getArr() {return (?) arr;}
10
by: Sona | last post by:
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*)...
2
by: Salman Khilji | last post by:
After reading all the FAQs, I cannot solve the following problem: I have a pointer of type double. I am supposed to 1) Allocate memory for it assuming that the pointer will be pointing to a...
1
by: Abhi | last post by:
Hi! I am wondering if someone can point me to the needed sort function. There are so many of them that I simply got lost by reading their descriptions. I try to explain what I need. I have a...
0
by: guerrerofarias | last post by:
I have a "population" of objects that is suppose to do a lot of stuff during its lifecycle... I had everything working fine (not fancy code, though) with an array, but now I've received instructions...
1
by: Astha | last post by:
Hi. I am having a problem when retrieving data from database and comparing each of them to decide wheter or not to give access to a user to a certain page.Actually,the data being retrieved are...
31
by: mdh | last post by:
I am still having a problem understanding K&RII on p 112. I have looked at the FAQs --which I am sure answer it in a way that I have missed, so here goes. A 2-dim array, (per K&R) is really a...
152
by: vippstar | last post by:
The subject might be misleading. Regardless, is this code valid: #include <stdio.h> void f(double *p, size_t size) { while(size--) printf("%f\n", *p++); } int main(void) { double array = { {...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.