954,506 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

returning three dimensional array

Hello
I am having no problem while returning 1 dimensinal array
But am having trouble with 3 dimenional array

No problem with this code

float Mat[][][];
float Mat[];

float *funct1(void)
      {
return Mat;
}

void funct2()
        {
        float *Mat;
         Mat=funct1();
}


But this doesnt work

float Mat[][][];

float *funct1(void)
{
Mat[][][]={........};
return Mat;
}

void funct2()
{
float *Mat;
Mat=funct1();
}


Is there anyway I can return 3 dimensional arrays ?

phylon
Newbie Poster
6 posts since Oct 2007
Reputation Points: 10
Solved Threads: 0
 

What are your compiler errors?

Belrog
Junior Poster in Training
76 posts since Nov 2007
Reputation Points: 11
Solved Threads: 4
 

For example

multi_return.c: In function ‘funct1’:
multi_return.c:27: warning: return from incompatible pointer type
multi_return.c:27: warning: function returns address of local variable
#include <stdio.h>

 float Mat[4][4][4];

float *funct1(void)
{
float Mat[4][4][4]={
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,};
return Mat;
}

void funct2()
{
int i,j,k;
float *Mat;
Mat=funct1();

         for(k=0; k<4;k++)
         {
           for (i=0; i<4; i++)
	   {
		 for (j=0; j<4; j++)
		 {
		//    printf(" %f ", Mat[k][i][j]);
		 }
		 printf("\n");
	   }
		 printf("\n");
         }

}
         
        int main() {
        funct2();
        }
mank
Light Poster
41 posts since Oct 2007
Reputation Points: 10
Solved Threads: 0
 

I'm sure you are getting a perfectly fine return value. Your problem is that you have not supplied any type information that the compiler can use to "know" about your array.

First, please see the Wikipedia here .

Next, please be aware that only the first dimension can be [] in C, and only when you are not actually creating data. Other dimensions must have a size. So
int Mat[][][];
is an error, as is int Mat [][10][5];
but void printarray( int a[][10][5], int depth );
is not.

However, int *Mat; knows nothing about how many dimensions the array has, or even if it really is an array.

If your array has variable size dimensions, then you should use a simple flat array (or pointer) and calculate things on your own:

int *index_2d_array( int *arr, int height, int width, int y, int x ) {
  int index = (y * width) + x;
  return &(arr[ index ]);
  }

// two differently sized arrays with a "center" element
int a[5][5] = {
  { 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0 },
  { 0, 0, 7, 0, 0 },
  { 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0 }
  };
int b[3][5] = {
  { 0, 0, 0, 0, 0 },
  { 0, 0, 4, 0, 0 },
  { 0, 0, 0, 0, 0 }
  }
// a[3][4] = b[1][3]
*index_2d_array( a,   5, 5,   3, 4 ) = *index_2d_array( b,   3, 5,   1, 3 );


If yourMat object is a variable-sized array, you should create a small library of functions to handle it, and place all relevant information in a structure. For example:

typedef struct {
  int *data;
  int width, height, depth;
  } Mat_t;

int *Mat_element( Mat_t Mat, int z, int y, int x );


Hope this helps.

Duoas
Postaholic
2,043 posts since Oct 2007
Reputation Points: 1,140
Solved Threads: 229
 

thanks

I think this one works fine

#include <stdio.h>

float *array(void);

float *array(void)
{
static float Mat[4][4][4]={
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,

1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,
1.2,1.3,1.4,1.5,};

return (float *) Mat; 
}


int main(void)
{
float *Mat, i;
Mat = array(); 
for (i = 0; i < 16; i++) {
printf("\n %f", *(Mat++));
}
return 0; 
}
mank
Light Poster
41 posts since Oct 2007
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You