home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / c / 12423 < prev    next >
Encoding:
Text File  |  1992-08-17  |  2.2 KB  |  73 lines

  1. Path: sparky!uunet!mcsun!sun4nl!and!jos
  2. From: jos@and.nl (Jos Horsmeier)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Ragged arrays of type long?
  5. Message-ID: <3241@dozo.and.nl>
  6. Date: 17 Aug 92 15:04:39 GMT
  7. References: <1992Aug15.052649.20308@CS.ORST.EDU>
  8. Organization: AND Software BV Rotterdam
  9. Lines: 62
  10.  
  11. In article <1992Aug15.052649.20308@CS.ORST.EDU> warninm@xanth.CS.ORST.EDU (Michael Warning) writes:
  12. |Is it possible to create a ragged array of type long?  My references goes on
  13. |for two pages about how neat ragged arrays of strings are, but says nothing
  14. |about any other data type.
  15. |
  16. |For example:
  17. |
  18. |    static char   *try1[] = {"abc",
  19. |                 "wxyz"};
  20. |
  21. |This works fine, but:
  22. |
  23. |    static long   *try2[] = {{1, 2, 3},
  24. |                 {5, 6, 7, 8}};
  25. |                
  26. |This causes the various flavors of MS-C that i've tried to come up with a 
  27. |'Different levels of indirection' error. [ ... ]
  28.  
  29. It is a bit tricky I must admit. It seems that the standard made a bit
  30. of an exception to the rule (but they didn't). Let me try to explain:
  31.  
  32. pointer types and arithmetic types are both called `scalar' types.
  33. Arithmetic types are split up in `floating point' types and `integer'
  34. types. Somewhere in the standard it reads:
  35.  
  36. 3.5.7 Initialization
  37.  
  38. The initializer for a scalar shall be a single expression, optionally
  39. enclosed in braces. [ ... ]
  40.  
  41. Every element of your try2 array is a scalar type object, i.e. a pointer
  42. to a long. So, every element can be initialized with just one initializer.
  43. A string literal is considered _one_ initializer. Just take a look at
  44. this, maybe it clarifies things a bit:
  45.  
  46. char *p = "abc";
  47.  
  48. is perfectly legal, but
  49.  
  50. char *p = { 'a', 'b', 'c', '\0' };
  51.  
  52. is not. It only works for an agregate type (an array.) 
  53.  
  54. The (ugly) trick you can do here is: introduce separate arrays,
  55. one for every row of the try2 array. Something like this would do it:
  56.  
  57. static long try2_row0[] = { 1, 2, 3 };
  58. static long try2_row1[] = { 5, 6, 7, 8 };
  59.  
  60. Defining those arrays without an explicit dimension causes the comiler
  61. to allocate just enough memory for those array, i.e. 7 slots. Hook 
  62. them all together like this:
  63.  
  64. static long *try2[] = { try2_row0, try2_row1 };
  65.  
  66. And presto: there's your `ragged' array.
  67.  
  68. I hope this helps a bit,
  69.  
  70. kind regards,
  71.  
  72. Jos aka jos@and.l
  73.