Return multidimension array

Reply

Join Date: May 2004
Posts: 15
Reputation: tlee is an unknown quantity at this point 
Solved Threads: 0
tlee tlee is offline Offline
Newbie Poster

Return multidimension array

 
0
  #1
Jun 7th, 2004
Hi all,
What should I write for function signature in order to return this 6X6 array without compiler error? I tried to use int* getGraph(), but it did not work.
Thanks for your help.

int[6][6] getGraph()
{
int graph[6][6] = {
{0, 5, 10, -1, -1, -1},
{-1, 0, -1, 2, -1, -1},
{-1, -1, 0, -1, 10, -1},
{-1, -1, -1, 0, 1, -1},
{-1, -1, -1, -1, 0, 10},
{-1, -1, -1, -1, -1, 0} };

return graph;
}
Reply With Quote Quick reply to this message  
Join Date: Jun 2004
Posts: 9
Reputation: kalachylde is an unknown quantity at this point 
Solved Threads: 1
kalachylde's Avatar
kalachylde kalachylde is offline Offline
Newbie Poster

Re: Return multidimension array

 
0
  #2
Jun 8th, 2004
I'm unsure of this but I don't think "int [6][6]" will work. Did you try "int getGraph()" and "return graph[6][6]"?
Reply With Quote Quick reply to this message  
Join Date: Apr 2004
Posts: 4,321
Reputation: Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future 
Solved Threads: 230
Team Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Return multidimension array

 
0
  #3
Jun 8th, 2004
When you return from your proposed function, the local data goes out of scope. So it is not useful to do it this way. Could you describe what it is you would like to accomplish?
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
Reply With Quote Quick reply to this message  
Join Date: May 2004
Posts: 15
Reputation: tlee is an unknown quantity at this point 
Solved Threads: 0
tlee tlee is offline Offline
Newbie Poster

Re: Return multidimension array

 
0
  #4
Jun 15th, 2004
To Kalachylde: It does not perform what we are expected to because of two reasons: it will return integer instead of array of integer, and return graph[6][6] means creating one new array of integer with size 6X6 without initialization.

To Dave Sinkula: I think although the local data goes out of scope, we still get the correct result because the local data is copied to a temporary memory, which is returns to the caller before the local data going out of scope.

Now, I think the least sufficient way is using class (wrapper the multi-array), and returning its's object. However, if anyone has a greater idea, please share with us.

By the way, thanks for both your inputs.
Reply With Quote Quick reply to this message  
Join Date: Apr 2004
Posts: 4,321
Reputation: Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future 
Solved Threads: 230
Team Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Return multidimension array

 
0
  #5
Jun 15th, 2004
Unless there is some language extension with which I am not yet familiar, you cannot return arrays (I'm more sure of this for C). An array name, when used in an expression, decays to a pointer to the first element. The function would then be returning a pointer to local data that is now out of scope. It may appear to be correct, or it may not -- both are within the realm of undefined behavior.

If the array is within a class (again I'm going with more familiarity with C's structs) -- yes, you can return an object.

Another idea: pass a pointer to the start and copy the desired contents there.
  1. #include <stdio.h>
  2. #include <string.h>
  3. void getGraph(int my_graph[6][6])
  4. {
  5. static const int default_graph[6][6] =
  6. {
  7. { 0, 5, 10, -1, -1, -1},
  8. {-1, 0, -1, 2, -1, -1},
  9. {-1, -1, 0, -1, 10, -1},
  10. {-1, -1, -1, 0, 1, -1},
  11. {-1, -1, -1, -1, 0, 10},
  12. {-1, -1, -1, -1, -1, 0},
  13. };
  14. memcpy(my_graph, default_graph, sizeof default_graph);
  15. }
  16. int main(void)
  17. {
  18. int graph[6][6];
  19. getGraph(graph);
  20. /* ... */
  21. return 0;
  22. }
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
Reply With Quote Quick reply to this message  
Join Date: May 2004
Posts: 15
Reputation: tlee is an unknown quantity at this point 
Solved Threads: 0
tlee tlee is offline Offline
Newbie Poster

Re: Return multidimension array

 
0
  #6
Jun 15th, 2004
Yes. Absolutely, you are right about local data goes out of scope, but the value is always correct since the pointer is going out of scope, but the memory, which pointer pointed to is still there unless you explicitly delete pointer, then that memory location will contain garbage.
I really appreciate for your help.
Reply With Quote Quick reply to this message  
Join Date: Apr 2004
Posts: 4,321
Reputation: Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future Dave Sinkula has a brilliant future 
Solved Threads: 230
Team Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Return multidimension array

 
0
  #7
Jun 15th, 2004
Originally Posted by tlee
Yes. Absolutely, you are right about local data goes out of scope, but the value is always correct since the pointer is going out of scope, but the memory, which pointer pointed to is still there unless you explicitly delete pointer, then that memory location will contain garbage.
No. Undefined behavior is, well, undefined behavior.

Let's say you have an array local to a function. This data is created on the stack. You call this function and return a pointer to the first element of it -- you are pointing somewhere on the stack.

Then you call another function that also has local variables. This function also uses the stack, and it tramples your data. And the pointer returned by the first function is still pointing to the same place.

This is just one possible example of your assertion being incorrect. So "always correct" is not true.

[edit]Since you can't return an array, this is the closest simulation I could devise.
  1. #include <stdio.h>
  2. int *getGraph(void)
  3. {
  4. int init[6][6] =
  5. {
  6. { 0, 5, 10, -1, -1, -1},
  7. {-1, 0, -1, 2, -1, -1},
  8. {-1, -1, 0, -1, 10, -1},
  9. {-1, -1, -1, 0, 1, -1},
  10. {-1, -1, -1, -1, 0, 10},
  11. {-1, -1, -1, -1, -1, 0},
  12. };
  13. int i, j;
  14. puts("getGraph:");
  15. for (i = 0; i < 6; ++i)
  16. {
  17. for (j = 0; j < 6; ++j)
  18. {
  19. printf("%2d ", init[i][j]);
  20. }
  21. putchar('\n');
  22. }
  23. return init;
  24. }
  25. void printGraph(const int g[6][6])
  26. {
  27. int i, j;
  28. puts("printGraph:");
  29. for (i = 0; i < 6; ++i)
  30. {
  31. for (j = 0; j < 6; ++j)
  32. {
  33. printf("%2d ", g[i][j]);
  34. }
  35. putchar('\n');
  36. }
  37. }
  38. int main(void)
  39. {
  40. int (*graph)[6] = getGraph();
  41. printGraph(graph);
  42. return 0;
  43. }
  44. /* my output
  45. getGraph:
  46.  0 5 10 -1 -1 -1
  47. -1 0 -1 2 -1 -1
  48. -1 -1 0 -1 10 -1
  49. -1 -1 -1 0 1 -1
  50. -1 -1 -1 -1 0 10
  51. -1 -1 -1 -1 -1 0
  52. printGraph:
  53.  0 5 10 -1 -1 -1
  54. -1 0 -1 2 -1 4223327
  55. -1 1245004 10 1244919 4223327 4223339
  56.  0 11 -1 -1 1245028 4209022
  57. 4208532 4224044 4223339 1245044 1245056 4198704
  58. 4223339 4223339 0 4223088 0 1245068
  59. */
Last edited by Dave Sinkula; Jun 15th, 2004 at 7:39 pm. Reason: Added code sample.
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
Reply With Quote Quick reply to this message  
Join Date: May 2004
Posts: 15
Reputation: tlee is an unknown quantity at this point 
Solved Threads: 0
tlee tlee is offline Offline
Newbie Poster

Re: Return multidimension array

 
0
  #8
Jun 15th, 2004
Sorry! I take back my words. In the above case it is wrong since the above array is not allocated in the heap(unless using new operator), so you are 100% correct. (I messed up with Java since array is object).
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:



Similar Threads
Other Threads in the C Forum
Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC