Topic
IC4NOTICE: developerWorks Community will be offline May 29-30, 2015 while we upgrade to the latest version of IBM Connections. For more information, read our upgrade FAQ.
6 replies Latest Post - ‏2014-12-02T15:54:28Z by Robin400
markboonie
markboonie
9 Posts
ACCEPTED ANSWER

Pinned topic Calculating number of array elements

‏2013-06-25T18:38:22Z |

I'm trying to represent a data structure that consists of a header followed by a number of array elements.  I'd like the number of array elements to be as large as possible while not exceeding 4096 (including the header).  Is it possible to use the SIZE() function for this?  I'm getting message IBM1748I S, "Extents of automatic variables must not depend on the extents of automatic variables declared later in the same block."  My declaration is al follws:

    Dcl
       1 top1 Structure ,
          2 mid1,
             3 low1 Unsigned Bin Fixed (32),
             3 low2 Char (8),
          2 mid2 ((4096 - size(mid1)) / size(mid2)),
             3 low3 Unsigned Bin Fixed (64),
             3 low4 Char (48);

It appears to me that the size of mid2 should be able to be calculated first and then used in the calculation for the number of array elements.  Any ideas?

- mb

  • brataj
    brataj
    7 Posts
    ACCEPTED ANSWER

    Re: Calculating number of array elements

    ‏2013-06-25T19:59:50Z  in response to markboonie

    mid2 is an array, so you can't use it to define it's own size... but I think it goes further than that, as being a structure member the size can't really be determined until after all the alignment has been taken care of.  But size(mid2(1)) doesn't work either, I suspect because the compiler isn't as devious as humans.

    Anyway, this sort of thing works:

    dcl                                                          
    1   aMid1,                                                   
             3 low3 Unsigned Bin Fixed (32),                     
             3 low4 Char (8);                                    
    dcl                                                          
    1   aMid2,                                                   
             3 low3 Unsigned Bin Fixed (64),                     
             3 low4 Char (48);                                   
                                                                 
    Dcl                                                          
       1 top1 Structure ,                                        
          2 mid1 like aMid1,                                     
          2 mid2 ((4096 - size(aMid1)) / size(aMid2)) like aMid2;

    Possibly there are other variants.

     

    • brataj
      brataj
      7 Posts
      ACCEPTED ANSWER

      Re: Calculating number of array elements

      ‏2013-06-25T20:01:22Z  in response to brataj

      I see the new and improved communities apparently count posts by community...

    • markboonie
      markboonie
      9 Posts
      ACCEPTED ANSWER

      Re: Calculating number of array elements

      ‏2013-06-26T13:07:12Z  in response to brataj

      Interesting.  I would have thought that mid2 was the name not of the array but of the individual element(s) of which the array is composed.  That would explain the error message -- the code is trying to use the SIZE() of the array to define the array itself.  (The meaning of the message is still cryptic to me.  I'll go back now and try to decipher it.)

      Thanks for the bypass, though.  It's more logical, too -- define the smaller structures first, and then define the larger structures as compositions of the smaller ones.

      - mb

      • brataj
        brataj
        7 Posts
        ACCEPTED ANSWER

        Re: Calculating number of array elements

        ‏2013-06-26T13:34:35Z  in response to markboonie

        Both the dimension(s) and type are bound to a name...

        "declared later in the same block" is I believe applicable in this case because the compiler hasn't yet "committed" to some or all of the structure that you're in the process of defining, so it presumes a later definition is intended.

        Bernie

         

  • Robin400
    Robin400
    31 Posts
    ACCEPTED ANSWER

    Re: Calculating number of array elements

    ‏2013-06-27T08:34:26Z  in response to markboonie

    It's necessary to specify the number of elements for the array.

    Normally this is specified as a constant (e.g., declare x(25) float; )

    or as a variable whose value is read in or computed

    (e.g., get (m); begin; declare x(m) float; ... )

  • Robin400
    Robin400
    31 Posts
    ACCEPTED ANSWER

    Re: Calculating number of array elements

    ‏2014-12-02T15:54:28Z  in response to markboonie

    Further to the explanation of the error message:- the expression

    (4096 - size(mid1)) / size(mid2)

    as part of the declaration of the array

    mid2 ((4096 - size(mid1)) / size(mid2))

    requires the size of <mid2> which isn't known at the time that

    the expression is evaluated.