Multidimensional Array

The Partridge Family were neither partridges nor a family. Discuss.
Post Reply
aslanbey0158
Posts: 30
Joined: April 15th, 2017, 10:48 am

Multidimensional Array

Post by aslanbey0158 » September 30th, 2019, 10:26 am

I have a matrix like a[3][3] (float) ,

void function(float a[][],b[])

i can't send this matrix into funtion. How can i send matrix to function

User avatar
Yumtard
Posts: 571
Joined: January 19th, 2017, 10:28 pm
Location: Idiot from northern Europe

Re: Multidimensional Array

Post by Yumtard » September 30th, 2019, 11:21 am

I would've made a matrix class. Else you could use vectors.

If it's stricly 3x3 matrices you can also do this

void function(float a[3][3])

aslanbey0158
Posts: 30
Joined: April 15th, 2017, 10:48 am

Re: Multidimensional Array

Post by aslanbey0158 » September 30th, 2019, 12:04 pm

But function doesn't take matrix,it want vector.
The problem is this.

User avatar
chili
Site Admin
Posts: 3850
Joined: December 31st, 2011, 4:53 pm
Location: Japan
Contact:

Re: Multidimensional Array

Post by chili » October 1st, 2019, 10:44 am

The problem, is this.
Chili

aslanbey0158
Posts: 30
Joined: April 15th, 2017, 10:48 am

Re: Multidimensional Array

Post by aslanbey0158 » October 1st, 2019, 12:08 pm

i wrote my function in main class;it works well.
İ wanted to throw this function to

void function( float a[][],float b[]) <----

function doesnt take matrice ,it wants vector
How can i solve this problem?

User avatar
Yumtard
Posts: 571
Joined: January 19th, 2017, 10:28 pm
Location: Idiot from northern Europe

Re: Multidimensional Array

Post by Yumtard » October 1st, 2019, 1:18 pm

Just rewrite the signature, I don't understand your problem.

If you want vectors then something beautiful like this:
void function( const std::vector<std::vector<int>>& a, const std::vector<int>& b )

or create a matrix class and just change the signature so it takes a matrix instead.

If you need more help, please post all the code

User avatar
chili
Site Admin
Posts: 3850
Joined: December 31st, 2011, 4:53 pm
Location: Japan
Contact:

Re: Multidimensional Array

Post by chili » October 1st, 2019, 5:27 pm

You need to read up on pointer decay of arrays. https://stackoverflow.com/questions/146 ... y-decaying
you don't pass arrays by value, they become pointers.

If you wanna avoid that, use std::array<std::array>, or pass the array by reference. Passing by reference will lock you down to a specific dimensionality, but you can use templating to make your life easier in that regard. You can do a nested vector as well. You can pass as a flat array (i.e. as a pointer, remember above), and then do the index calculation yourself. You can create your own custom type that does one of these things and encapsulates the implementation away. You can do so many things. So many options.
Chili

albinopapa
Posts: 3822
Joined: February 28th, 2013, 3:23 am
Location: Oklahoma, United States

Re: Multidimensional Array

Post by albinopapa » October 4th, 2019, 6:16 am

As stated by chili

void function( float arr[3][3] ){ }

float matrix[3][3];
function( matrix );
is the same as
void function( float* arr ){};
function( matrix ) // still works

void function( float(&arr)[3][3] ){ }

Now the function ONLY takes in 2D C-arrays with 3 elements per dimension, but you are actually passing in the "matrix" and can return values with it.

If you are needing nested std::vector, then do what Yumtard said.
void function( std::vector<std::vector<float>>& _matrix );

Or, as chili pointed out, you can go from a flattened 1D array to 2D array with a bit of math:
for(int i = 0; i < 9; ++i ){
int column = i % 3;
int row = i / 3;
}

or from 2D array to 1D array
int index = column + ( row * num_columns );

Here's a partial Matrix class that might be useful.

Code: Select all

class Matrix
{
public:
     Matrix()=default;
     Matrix( float _00, float _01, float _02, 
               float _10, float _11, float _12, 
               float _20, float _21, float _22 );

     float operator()( int Column, int Row )const 
     {
          return elements[Row][Column]; 
     )
     float& operator()( int Column, int Row )
     {
          return elements[Row][Column];
     }
   float elements[3][3];
};

Matrix Identity( ){
     Matrix matrix;
     for( int j = 0; j < 3; ++j )
     {
          for( int i = 0; i < 3; ++i )
          {
               if( i == j )
                    matrix( i, j ) = 1.f;
               else
                    matrix( i, j ) = 0.f;
          }
     }
     return matrix;
}
If you think paging some data from disk into RAM is slow, try paging it into a simian cerebrum over a pair of optical nerves. - gameprogrammingpatterns.com

Post Reply