Studio:Scl struct sized: Difference between revisions

From STRIDE Wiki
Jump to navigation Jump to search
Line 51: Line 51:


=== Example 2 ===
=== Example 2 ===
This example shows the declaration of a sized struct containing a variable length array whose actual length is proportional to the value of the size field. In this case the array bound is defined as zero but another common bound by convention is 1. (An array bound of 0 is not offically ANSI C, and is usually supported only under specific compiler option.)
This example shows the declaration of a sized struct containing a variable length array whose actual length is proportional to the value of the size field. In this case the array bound is defined as zero but another commonly used bound is 1. (An array bound of zero is not officially ANSI C, and is usually supported only under specific compiler option.)
<source lang=c>
<source lang=c>



Revision as of 18:47, 5 November 2008

The scl_struct_sized pragma

The scl_struct_sized pragma is used to identify a sized structure. A sized structure is a C programming convention for representing a structure whose size is variable and defined by one of the members of the structure. This pragma is infrequently used, but must be used, whenever the programmer defined size does not match the C language size of the structure (as calculated by the sizeof macro).

STRIDE Version Support

Available in STRIDE 3.0.0103 (StoneSteps Tower 3) and later versions

Syntax

#pragma scl_struct_sized(type-name, size-field)

Parameters Type Description
type-name Structure Type Identifies a structure type or structure instance whose runtime size is not the same as its C language size and contains a field whose value is the runtime size.

The following restrictions apply:

  • The structure type may not be pointed to by a sized pointer.
  • The structure type may not be a member of any other structure or union.
  • The structure type may not be passed as a function parameter (but a pointer to it is allowed).
  • The structure type may reside only within IN or INOUT memory blocks.
  • If the last member of the structure is an array, the array's size is calculated based upon max-size - (size of struct's other members).
  • If the last member of the structure is an array, the array's element type may not contain a sized structure or a conformant array (see scl_conform).
size-field Member Identifies a field within the sized structure whose value determines the actual runtime size of the structure. The following restrictions apply:
  • The type of the size-field must be an integral type (int, short, char).
  • The value (at runtime) is expected to be greater than the type size of the structure (as determined by the sizeof macro).
  • The size-field must reside within the same payload block as the sized structure.

Examples

Example 1

This example shows the declaration for a simple sized struct.

typedef struct {
    int size;
    int someJunk;
    int moreJunk;
} SimpleSizedStruct;

extern void f(SimpleSizedStruct* ps);
#pragma scl_function(f)
#pragma scl_struct_sized(*f.ps, size);

Example 2

This example shows the declaration of a sized struct containing a variable length array whose actual length is proportional to the value of the size field. In this case the array bound is defined as zero but another commonly used bound is 1. (An array bound of zero is not officially ANSI C, and is usually supported only under specific compiler option.)

typedef struct {
    int size;
    int someJunk;
    int ary[0];  // variable length array whose length depends on the size
} ConformantArraySizedStruct;

extern void f(SimpleSizedStruct* ps);
#pragma scl_function(f)
#pragma scl_struct_sized(*f.ps, size);

See Also

  • For additional information on scl_string, including constraints, refer to the section on scl_struct_sized in the SCL Reference Guide.