Array intialization

D

Drak I

Hello all,
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

What is the best way to intialize such array if I need to pass the size as
variables, like int [rows][columns], where rows and columns has the size of the
array.

Thanks in advance
Drak
 
K

Karl Heinz Buchegger

Drak said:
Hello all,
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

What is the best way to intialize such array if I need to pass the size as
variables, like int [rows][columns], where rows and columns has the size of the
array.

This is a FAQ.
Thanks in advance
Drak


--
Karl Heinz Buchegger, GASCAD GmbH
Teichstrasse 2
A-4595 Waldneukirchen
Tel ++43/7258/7545-0 Fax ++43/7258/7545-99
email: (e-mail address removed) Web: www.gascad.com

Fuer sehr grosse Werte von 2 gilt: 2 + 2 = 5
 
K

Karl Heinz Buchegger

Drak said:
Hello all,
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

What is the best way to intialize such array if I need to pass the size as
variables, like int [rows][columns], where rows and columns has the size of the
array.

This is a FAQ

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

Make sure you read the following items also.
 
B

Bob Hairgrove

Hello all,
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

What is the best way to intialize such array if I need to pass the size as
variables, like int [rows][columns], where rows and columns has the size of the
array.

Thanks in advance
Drak

Scott Meyers has a nice chapter on implementing a 2-dimensional array
class in "More Effective C++", item 30: "Proxy classes".

However, you can also use a vector of vectors instead of unsafe
arrays. Note that vectors -- unlike arrays -- can also be dynamically
sized, so this is what you need if your dimensions aren't known at
compile time.

// e.g.:

#include <iostream>
#include <ostream>
#include <vector>

typedef std::vector<int> IntVec;
typedef std::vector<IntVec> IntArray2D;

const int IDX_1 = 10;
const int IDX_2 = 20;

int main() {
using std::cout;
using std::endl;

IntVec dummy(IDX_2); // reserving space in the ctor
IntArray2D x(IDX_1); // avoids unnecessary reallocations

int c=0;
for (int i=0; i<IDX_1; ++i) {
for (int j=0; j<IDX_2; ++j, c++)
dummy[j] = (c);
x = dummy;
}
for (int i=0; i<IDX_1; ++i) {
cout << "x[" << i << "]:";
for (int j=0; j<IDX_2; ++j)
cout << " " << x[j];
cout << endl;
}
return 0;
}

I'm not sure how to reserve enough space up front for IntArray2D,
though; assigning directly to x[j] instead of filling up the dummy
will compile, but then gives me an access violation at run-time. The
use of a temporary vector<int> (i.e. "dummy") seems necessary in order
for it to work.

Once the 2D-vector has been initialized, it should not be a problem to
assign directly using just the index values.
 
J

John Harrison

Drak I said:
Hello all,
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

Because the types are different. intArray is type int** but new int[10][20]
is type int (*)[20]. Not the same type at all. Newbies often get this wrong
because they don't understand the C++ type system very well.

What is the best way to intialize such array if I need to pass the size as
variables, like int [rows][columns], where rows and columns has the size of the
array.

As Karl said, read the FAQ.

john
 
M

Mats Weber

Drak I said:
I have very basic question on intializing two dimenstional array. Why cant I
initialize a two dimensional int array like the following ?

int **intArray = new int[10][20]

using vector< vector<int> > makes it all much simpler.
 

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

Members online

Forum statistics

Threads
474,173
Messages
2,570,938
Members
47,474
Latest member
VivianStuk

Latest Threads

Top