A .NET array (DNA) consists of a header and a block of memory to hold
the elements of the array. The header contains information about the
array such as the rank and bounds for each dimension. This means
that it is not possible to pass part of a DNA to another routine and treat
this as another array because the head would be missing or invalid.
Fortran constructions such as EQUIVALENCEs that involve arrays can not be
implemented using DNAs. Furthermore, DNAs are considerably less
efficient to access than normal Fortran arrays, partly because
the array bounds are always checked. For this reason, despite the
advent of .NET, no fundamental change has been made in FTN95 with respect
to the way in which Fortran arrays are implemented. They
are implemented using portions of non-garbage collected memory just
as on a Win32 platform.
FTN95 prevents you from declaring arrays whose elements are .NET objects
because such objects would not be found by the garbage collector. However,
it is possible to manipulate .NET arrays directly. They are objects in their
own right and can be declared using the OBJECT keyword. For example:
The variable STR1 is a one-dimensional DNA of strings, whilst STR2 is a
corresponding two-dimensional DNA. Like all other objects, you must use NEW@
to allocate memory for a DNA before using it:
After executing these two lines of code, STR1 refers to a DNA with one
index that is in the range 0:9 (note carefully the zero lower bound)
and STR2 refers to a DNA with two indexes in the range (0:9,0:19). It is
now possible to access these arrays using subscript syntax:
mystr is either a Fortran character string or a DNA. Objects stored in such
arrays will be safe if a garbage collection is required.
You cannot use the Fortran substring syntax with a DNA. Also when you
pass an element of a DNA to a routine, you will not have implicit
access to subsequent elements as is sometimes the case with normal
It is important to note that DNAs can be created externally in which
case NEW@ will not be used to create the array. For example, a
DNA could be a member of a class. In which case the array will be created
externally when NEW@ is used for an object of this containing class.
Alternatively you might receive a .NET object as an
argument in a routine and this object might contain an
See Object and string arrays for an
easier, though less fexible way to access .NET arrays.