TYPE point REAL x, y END TYPE point TYPE triangle TYPE(point) a, b, c END TYPE triangle and for a variable of type triangle, as in TYPE(triangle) t each component of type point is accessed as t%a t%b t%c which, in turn, have ultimate components of type real: t%a%x t%a%y t%b%x etc. (Note that the % qualifier was chosen rather than dot (.) because of potential ambiguity with operator notation, like .OR.). Implicit and explicit typing Unless specified otherwise, all variables starting with letters I, J, K, L, M and N are default INTEGERs, and all others are default REAL; other data types must be explicitly declared. This is known as implicit typing and is a heritage of early FORTRAN days. Those defaults can be overridden by IMPLICIT TypeName (CharacterRange) statements, like: IMPLICIT COMPLEX(Z) IMPLICIT CHARACTER(A-B) IMPLICIT REAL(C-H,N-Y) However, it is a good practice to explicitly type all variables, and this can be forced by inserting the statement IMPLICIT NONE at the beginning of each program unit. Arrays Arrays are considered to be variables in their own right. Every array is characterized by its type, rank, and shape (which defines the extents of each dimension). Bounds of each dimension are by default 1 and size, but arbitrary bounds can be explicitly specified. DIMENSION keyword is optional and considered an attribute; if omitted, the array shape must be specified after array-variable name. For example, REAL:: a(10) INTEGER, DIMENSION(0:100, -50:50) :: map declares two arrays, rank-1 and rank-2, whose elements are in column-major order. Elements are, for example, a(1) a(i*j) and are scalars. The subscripts may be any scalar integer expression. Sections are parts of the array variables, and are arrays themselves: a(i:j) ! rank one map(i:j, k:l:m) ! rank two a(map(i, k:l)) ! vector subscript a(3:2) ! zero length Whole arrays and array sections are array-valued objects. Array-valued constants (constructors) are available, enclosed in (/ ... /): (/ 1, 2, 3, 4 /) (/ ( (/ 1, 2, 3 /), i = 1, 4) /) (/ (i, i = 1, 9, 2) /) (/ (0, i = 1, 100) /) (/ (0.1*i, i = 1, 10) /) making use of an implied-DO loop notation. Fortran 2003 allows the use of brackets: [1, 2, 3, 4] and [([1,2,3], i=1,4)] instead of the first two examples above, and many compilers support this now. A derived data type may, of course, contain array components: