Connecting Tech Pros Worldwide Help | Site Map

find length of a dynamic array

  #1  
Old July 6th, 2006, 07:45 PM
finerrecliner@gmail.com
Guest
 
Posts: n/a
hey everyone

i'm trying to make a function that will return the length and width of
a dynamically allocated 2D array.

here's what i came up with to find width:

int findWidth(int** matrix)
{
int width = 0;

while(matrix[width][0] != NULL)
width++;

return width;
}

this doesnt work though. part of the problem is that my matrix has many
zeros. and i think this function treats those zeros as NULL, and doesnt
return the right value.

who has other ideas?

  #2  
Old July 6th, 2006, 07:55 PM
finerrecliner@gmail.com
Guest
 
Posts: n/a

re: find length of a dynamic array


already made small progress on my own:

int findWidth(int** matrix)
{
int width = 0;

while(&matrix[width][0] != NULL) //added memory address
keyword &
width++;

return width;
}


this seems to work to find the width of the 2d array.

but when i try to find length by editing the one line to:
while(&matrix[0][width] != NULL) //switched [0] and [width]

-- i get an infinite loop :(

i appreciate any help that is offered

  #3  
Old July 6th, 2006, 08:15 PM
mlimber
Guest
 
Posts: n/a

re: find length of a dynamic array


finerrecliner@gmail.com wrote:
Quote:
already made small progress on my own:
>
int findWidth(int** matrix)
{
int width = 0;
>
while(&matrix[width][0] != NULL) //added memory address
keyword &
width++;
>
return width;
}
>
>
this seems to work to find the width of the 2d array.
>
but when i try to find length by editing the one line to:
while(&matrix[0][width] != NULL) //switched [0] and [width]
>
-- i get an infinite loop :(
>
i appreciate any help that is offered
This method won't work. Compare:

http://www.parashift.com/c++-faq-lit...html#faq-16.14

You either need to keep track of the height and width yourself or,
better, use a container class that automates it. See, e.g., the Matrix
class defined here:

http://www.parashift.com/c++-faq-lit...html#faq-16.19

Cheers! --M

  #4  
Old July 6th, 2006, 08:35 PM
Frederick Gotham
Guest
 
Posts: n/a

re: find length of a dynamic array


posted:
Quote:
hey everyone
>
i'm trying to make a function that will return the length and width of
a dynamically allocated 2D array.

Maybe something like:


#define LengthOf(arr) (sizeof(arr) / sizeof(*arr))
#define WidthOf(arr) (sizeof(*arr) / sizeof(**arr))

#include <iostream>

int main()
{
int array1[5][3];
int array2[3][1];
int array3[4][4];
int array4[1][7];
int array5[8][3];
int array6[5][6];
int array7[3][7];
int array8[7][3];
int array9[2][7];

std::cout << LengthOf(array1) << ' ' << WidthOf(array1) << '\n';
std::cout << LengthOf(array2) << ' ' << WidthOf(array2) << '\n';
std::cout << LengthOf(array3) << ' ' << WidthOf(array3) << '\n';
std::cout << LengthOf(array4) << ' ' << WidthOf(array4) << '\n';
std::cout << LengthOf(array5) << ' ' << WidthOf(array5) << '\n';
std::cout << LengthOf(array6) << ' ' << WidthOf(array6) << '\n';
std::cout << LengthOf(array7) << ' ' << WidthOf(array7) << '\n';
std::cout << LengthOf(array8) << ' ' << WidthOf(array8) << '\n';
std::cout << LengthOf(array9) << ' ' << WidthOf(array9) << '\n';

}


Or perhaps if you would prefer templates:


#include <cstddef>

struct Dimensions {

std::size_t length;
std::size_t width;

};


template<class T,std::size_t i,std::size_t j>
Dimensions GetD( T const (&arr)[i][j] )
{
Dimensions tmp = { i, j };

return tmp;

/* return (Dimensions){i,j}; */
}

#include <iostream>

int main()
{
int array1[5][3];
int array2[3][1];
int array3[4][4];
int array4[1][7];
int array5[8][3];
int array6[5][6];
int array7[3][7];
int array8[7][3];
int array9[2][7];

std::cout << GetD(array1).length << ' ' << GetD(array1).width <<
'\n';
std::cout << GetD(array2).length << ' ' << GetD(array2).width <<
'\n';
std::cout << GetD(array3).length << ' ' << GetD(array3).width <<
'\n';
std::cout << GetD(array4).length << ' ' << GetD(array4).width <<
'\n';
std::cout << GetD(array5).length << ' ' << GetD(array5).width <<
'\n';
std::cout << GetD(array6).length << ' ' << GetD(array6).width <<
'\n';
std::cout << GetD(array7).length << ' ' << GetD(array7).width <<
'\n';
std::cout << GetD(array8).length << ' ' << GetD(array8).width <<
'\n';
std::cout << GetD(array9).length << ' ' << GetD(array9).width <<
'\n';

}


--

Frederick Gotham
  #5  
Old July 6th, 2006, 10:15 PM
Michael Taylor
Guest
 
Posts: n/a

re: find length of a dynamic array



"Frederick Gotham" <fgothamNO@SPAM.comwrote in message
news:YHdrg.11177$j7.315390@news.indigo.ie...
Quote:
posted:
>
Quote:
>hey everyone
>>
>i'm trying to make a function that will return the length and width of
>a dynamically allocated 2D array.
>
>
Maybe something like:
>
>
#define LengthOf(arr) (sizeof(arr) / sizeof(*arr))
#define WidthOf(arr) (sizeof(*arr) / sizeof(**arr))
>
These won't work for "a dynamically allocated 2D array".


  #6  
Old July 7th, 2006, 12:25 AM
Frederick Gotham
Guest
 
Posts: n/a

re: find length of a dynamic array


Michael Taylor posted:

Quote:
Quote:
> #define LengthOf(arr) (sizeof(arr) / sizeof(*arr))
> #define WidthOf(arr) (sizeof(*arr) / sizeof(**arr))
>>
>
These won't work for "a dynamically allocated 2D array".

If you want to create an array, the first thing to consider is:

(1) Will the dimension(s) be known at compile time?

If so, then you create it in the ordinary fashion:

int array[64];

If not, then you must use dynamic allocation:

int * const p = new int[len];

int * const p = (int*)malloc(len * sizeof(int));


It is possible to dynamically allocate an array and STILL keep track of its
dimensions:

int (&array)[64] = *new int[1][64];

However this can't be used if the dimensions aren't known until runtime:

int (&array)[len] = *new int[1][len]; /* Compile ERROR */

Therefore, there is in fact NO WAY to find out the dimensions of a
dynamically allocated array, unless you yourself keep track of it.


--

Frederick Gotham
  #7  
Old July 7th, 2006, 04:05 AM
Axter
Guest
 
Posts: n/a

re: find length of a dynamic array


finerrecliner@gmail.com wrote:
Quote:
already made small progress on my own:
>
int findWidth(int** matrix)
{
int width = 0;
>
while(&matrix[width][0] != NULL) //added memory address
keyword &
width++;
>
return width;
}
>
>
this seems to work to find the width of the 2d array.
>
but when i try to find length by editing the one line to:
while(&matrix[0][width] != NULL) //switched [0] and [width]
>
-- i get an infinite loop :(
>
i appreciate any help that is offered
I recommend that you not use this type of C-style array, and instead
use std::vector.
You can create a 2D array with vector by using a vector of vector
vector< vector< int matrix;
You can then easily determine it's size by using the vector::size()
method.

If you still need to use raw pointers, then you'll need some type of
implementation define method to determine the size.
For example, VC++ has an _msize function that can be used to determine
the size of dynamically allocated pointer. But that is not part of the
C++ standard, and therefore not portable.

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
getting the size of dynamic array abdulsamad answers 2 February 14th, 2008 12:00 AM
How can you quickly find the number of elements stored in a a) staticarray b) dynamic array ? C C++ C++ answers 11 January 17th, 2008 09:35 AM
Dynamic array advice. JoeC answers 9 March 19th, 2007 03:05 AM
create a dynamic array of pointers with initial values of NULL sandy@murdocks.on.ca answers 23 December 1st, 2006 11:05 PM