How do i allocate multidimensional arrays by new?, C/C++ Programming

Assignment Help:

How do I allocate multidimensional arrays by new?

A: There are several ways to do this, based on how flexible you wish the array sizing to be. On one acute, if you know all the dimensions at compile-time, you can allocate statically multidimensional arrays (like in C):

class Fred { /*...*/ };                

void someFunction(Fred& fred);

void manipulateArray()

{

const unsigned nrows = 10; // Num rows is compile-time constant const unsigned ncols = 20; // Num columns is a compile-time constant Fred matrix[nrows][ncols];

for (unsigned i = 0; i < nrows; ++i) {

for (unsigned j = 0; j < ncols; ++j) {

// Here's the way you access the (i,j) element:

Some Function( matrix[i][j] );

// you can securely "return" without any special delete code:

if (today == "Tuesday" && moon.isFull())

return; // Quit early on Tuesdays while the moon is full

}

}

// No explicit delete code at the ending of the function either

}

Commonly, the size of the matrix isn't known till run-time but you know that this will be rectangular. In this case you have to use the heap ("freestore"), but at least you are capable to allocate all of the elements in one freestore chunk.

void manipulateArray(unsigned nrows, unsigned ncols)

{

Fred* matrix = new Fred[nrows * ncols];

// Since we utiized a simple pointer above, we have to be VERY

// careful to ignore skipping over the delete code.

// That's why we catch all exceptions:

try {

// Here's described how to access the (i,j) element:

for (unsigned i = 0; i < nrows; ++i) { for (unsigned j = 0; j < ncols; ++j) { some Function( matrix[i*ncols + j] );

}

}

// If you wish to quit early on Tuesdays while the moon is full,

// make sure to do the delete along with ALL return paths:

if (today == "Tuesday" && moon.isFull()) {

delete[] matrix;

return;

}

...insert code here to fiddle along with the matrix...

}

catch (...) {

// make sure to do the delete while an exception is thrown:

delete[] matrix;

throw; // Re-throw the current exception

}

// Make sure to do the delete at the ending of the function too:

delete[] matrix;

}

Lastly at the other extreme, you may not even be guaranteed that the matrix is rectangular. For instance, if each row could have a distinct length, you'll have to allocate each row individually. In following function, ncols[i] is the number of columns in row number i, where i varies among 0 and nrows-1 inclusive.

void manipulateArray(unsigned nrows, unsigned ncols[])

{

typedef Fred* FredPtr;

// There will not be leak if the following throws an exception: FredPtr* matrix = new FredPtr[nrows];

// Set each of element to NULL in case there is an exception later on.

// (See comments at the top of the try block for rationale.)

for (unsigned i = 0; i < nrows; ++i)

matrix[i] = NULL;

// Since we utilized a simple pointer above, we have to be

// VERY careful to ignore skipping over the delete code.

// That's why we catch all exceptions:

try {

// Next we populate the array. If one of these throws, all

// the allocated elements will be deleted for (unsigned i = 0; i < nrows; ++i)

matrix[i] = new Fred[ ncols[i] ];

// Here's how to access the (i,j) element:

for (unsigned i = 0; i < nrows; ++i) { for (unsigned j = 0; j < ncols[i]; ++j) { someFunction( matrix[i][j] );

}

}

// If you wish to quit early on Tuesdays while the moon is full,

// make sure to do the delete along with ALL return paths:

if (today == "Tuesday" && moon.isFull()) {

for (unsigned i = nrows; i > 0; --i)

delete[] matrix[i-1]; delete[] matrix; return;

}

...insert code here to fiddle with the matrix...

}

catch (...) {

// Make sure to do the delete while an exception is thrown:

// Note down that some of these matrix[...] pointers may be

// NULL, however that's okay since it's legal to delete NULL.

 for (unsigned i = nrows; i > 0; --i)

delete[] matrix[i-1];

delete[] matrix;

throw; // Re-throw current exception

}

// Make sure to do delete at the ending of the function too.

// Note down that deletion is the opposite order of allocation:

for (unsigned i = nrows; i > 0; --i)

delete[] matrix[i-1];

delete[] matrix;

}

Note down the funny use of matrix[i-1] in the deletion procedure. This prevents wrap-around of the unsigned value while i goes one step below zero.

Lastly, note down that pointers and arrays are evil. Normally it is much better to encapsulate your pointers in a class which has a safe and simple interface. The following


Related Discussions:- How do i allocate multidimensional arrays by new?

Loops, Create a program that will accept 3 numbers. The first number (num1)...

Create a program that will accept 3 numbers. The first number (num1) is the common difference and the second number (num2) is the starting number and the 3rd number (num3) is the m

Differentiate between the expression ++a and a++, Differentiate between the...

Differentiate between the expression "++a" and "a++"? - With ++a, increment happens first on variable a, and resulting value is used. This is known as prefix increment. - Wi

Bankers algorithm, creating a system having five process from p0 to p4 and ...

creating a system having five process from p0 to p4 and five resource types. create the need matrix use the safe algorithm to test if the system is in safe mode.

Explain virtual base classes, Virtual Base Classes This ambiguity can b...

Virtual Base Classes This ambiguity can be resolved if the class derived have only one copy of the class base. This can be done by making the base class a virtual class. This k

Palindrome, A palindrome is a string that reads the same from both the ends...

A palindrome is a string that reads the same from both the ends. Given a string S convert it to a palindrome by doing character replacement. Your task is to convert S to palindrome

TCP, check this link: http://cactus.eas.asu.edu/partha/Teaching/430.2013/...

check this link: http://cactus.eas.asu.edu/partha/Teaching/430.2013/Project/proj-2.2013.htm

Common concepts of object oriented, Object Oriented Programming Paradigm: ...

Object Oriented Programming Paradigm: For OOP, Paradigm is a standard set.  The OOP will help to develop software in modules, which will be integrated later as a full packag

Program to open a file in c++, Program to Open a file in C++: int main...

Program to Open a file in C++: int main() {                  char ch;                  ifstream f1 ("OLDFILE.TXT");                  ofstream f2 ("NEWFILE.TXT");

Described storage qualifiers in c++ ?, A: They are following: Const: poi...

A: They are following: Const: point out that memory once initialized, must not be modify through a program. Volatile: denote that value in the memory location can be modified

Source code on home stay, I am doing project on home stay which includes fe...

I am doing project on home stay which includes features like add homestay,search,book,delete homestay,

Write Your Message!

Captcha
Free Assignment Quote

Assured A++ Grade

Get guaranteed satisfaction & time on delivery in every assignment order you paid with us! We ensure premium quality solution document along with free turntin report!

All rights reserved! Copyrights ©2019-2020 ExpertsMind IT Educational Pvt Ltd