User Name Password Register
DaniWeb IT Discussion Community
All
What is DaniWeb IT Discussion Community?
You're currently browsing the C section within the Software Development category of DaniWeb, a massive community of 426,634 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 1,574 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our C advertiser: Programming Forums
Views: 1622 | Replies: 4
Reply
Join Date: Oct 2007
Posts: 6
Reputation: phylon is an unknown quantity at this point 
Rep Power: 0
Solved Threads: 0
phylon phylon is offline Offline
Newbie Poster

returning three dimensional array

  #1  
Nov 2nd, 2007
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 ?
AddThis Social Bookmark Button
Reply With Quote  
Join Date: Nov 2007
Location: Pretoria
Posts: 67
Reputation: Belrog is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 4
Belrog's Avatar
Belrog Belrog is offline Offline
Junior Poster in Training

Re: returning three dimensional array

  #2  
Nov 2nd, 2007
What are your compiler errors?
Last edited by Belrog : Nov 2nd, 2007 at 2:53 am. Reason: Grammar mistakes
Reply With Quote  
Join Date: Oct 2007
Posts: 41
Reputation: mank is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 0
mank mank is offline Offline
Light Poster

Re: returning three dimensional array

  #3  
Nov 2nd, 2007
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();
        }
Reply With Quote  
Join Date: Oct 2007
Location: Cherry Hill, NJ
Posts: 1,876
Reputation: Duoas is a splendid one to behold Duoas is a splendid one to behold Duoas is a splendid one to behold Duoas is a splendid one to behold Duoas is a splendid one to behold Duoas is a splendid one to behold Duoas is a splendid one to behold 
Rep Power: 11
Solved Threads: 193
Featured Poster
Duoas's Avatar
Duoas Duoas is offline Offline
Posting Virtuoso

Re: returning three dimensional array

  #4  
Nov 2nd, 2007
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 your Mat 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.
Reply With Quote  
Join Date: Oct 2007
Posts: 41
Reputation: mank is an unknown quantity at this point 
Rep Power: 1
Solved Threads: 0
mank mank is offline Offline
Light Poster

Re: returning three dimensional array

  #5  
Nov 2nd, 2007
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; 
}
Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

DaniWeb C Marketplace
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

Thread Tools Display Modes

Similar Threads
Other Threads in the C Forum

All times are GMT -4. The time now is 12:41 am.
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC