STATIC
 Declara e inicializa variables y matrices estáticas
------------------------------------------------------------------------------
 Sintaxis

     STATIC <identificador> [[:= <inicializador>], ... ]

 Argumentos

     <identificador> es el nombre de la variable o matriz que se declara
     como estática. Si el <identificador> va seguido de corchetes ([ ]), se
     crea como una matriz. Si el <identificador> es una matriz, la sintaxis
     para especificar el número de elementos para cada dimensión puede ser
     matriz[<nElementos>, <nElementos2>,...] o matriz[<nElementos>]
     [<nElementos2>]... El número máximo de elementos por dimensión es
     4096. El número máximo de dimensiones está limitado sólo por la memoria
     disponible.

     <inicializador> es la asignación opcional de un valor a una nueva
     variable estática. Un <inicializador> para una variable estática consta
     de un operador de asignación en línea (:=) seguido de una expresión
     constante en tiempo de compilación formada por constantes y operadores
     o una matriz en forma literal. Si no se especifica un <inicializador>
     explícito, se asigna a la variable un valor inicial de NIL. En el caso
     de una matriz, cada uno de sus elementos es NIL. No pueden asignarse
     valores a identificadores de matrices con un <inicializador>.

     Nota: El operador de macro (&) no puede utilizarse en una
     declaración STATIC.

 Descripción

     La sentencia STATIC declara variables y matrices que tienen un tiempo
     de vida igual al del programa, pero que sólo son visibles dentro de la
     entidad que las crea. Estas variables sólo son visibles dentro de un
     procedimiento o función definida por el usuario si se declaran después
     de una sentencia PROCEDURE o FUNCTION. Las variables estáticas son
     visibles para todos los procedimientos y funciones de un fichero de
     programa .pgr (es decir, tienen un ámbito a nivel de módulo) si se
     declaran antes de la primera definición de procedimiento o función del
     fichero. Utilice la opción de compilador /N para compilar un programa
     cuyas variables tengan ámbito a nivel de módulo.

     Todas las variables estáticas de un programa se crean cuando se invoca
     al programa por primera vez y todos los valores especificados en un
     <inicializador> estático se asignan a la variable antes del inicio de
     la ejecución del programa.

     Las declaraciones de variables estáticas dentro de un procedimiento o
     función definida por el usuario deben realizarse antes de cualquier
     sentencia ejecutable, incluyendo PRIVATE, PUBLIC y PARAMETERS. Si se
     declara una variable del mismo nombre con FIELD, LOCAL o MEMVAR dentro
     de un procedimiento o función, se produce un error de compilación y no
     se genera ningún fichero objeto .OBJ.

     El número máximo de variables estáticas de un programa está limitado
     solamente por la memoria disponible.

 Notas

     ■ Inspección de variables estáticas dentro del Depurador: Para
        acceder a los nombres de las variables estáticas dentro del
        Depurador de     CA-Clipper, debe compilar los ficheros de programa
        .prg utilizando la opción /B, de modo que la información sobre
        variables estáticas se incluya en el fichero objeto .OBJ.

     ■ Expresiones de macro: No debe hacer referencia a variables
        estáticas dentro de expresiones de macro o variables que las
        contengan. Si así lo hace, se intentará acceder a una variable
        privada o pública que tenga el mismo nombre. Si no existe tal
        variable, se produce un error de ejecución.

     ■ Ficheros de memoria: Las variables estáticas no pueden
        guardarse ni recuperarse de ficheros de memoria .mem.

     ■ Tipo de una variable local estática: Puesto que TYPE() utiliza
        el operador de macro (&) para evaluar su argumento, no puede
        utilizar esta función para determinar el tipo de una variable local
        o estática o de una expresión que contenga una referencia a una
        variable local o estática. La función VALTYPE() ofrece esta
        posibilidad evaluando el argumento de la función y devolviendo el
        tipo de datos de su valor de retorno.

 Ejemplos

      Este ejemplo declara variables estáticas con y sin
        inicializadores:

        STATIC aMatriz1[20, 10], aMatriz2[20][10]
        STATIC cVar, cVar2
        STATIC cCadena := "mi cadena", var
        STATIC aMatriz := {1, 2, 3}

      Este ejemplo maneja una variable estática dentro de una
        función definida por el usuario. En este ejemplo, una variable de
        contador se incrementa cada vez que se llama a la función:

        FUNCTION MiContador( nValorNuevo )
           STATIC nContador := 0                // Valor inicial
           IF nValorNuevo != NIL
              nContador:= nValorNuevo           // Valor nuevo para nContador
           ELSE
              nContador++                       // Incremento nContador
           ENDIF
           RETURN nContador

      Este ejemplo muestra una declaración de variable estática que
        tiene ámbito a nivel de módulo. En este fragmento de código, aMatriz
        es visible para los dos procedimientos que siguen a la declaración:

        STATIC aMatriz := {1, 2, 3, 4}

        FUNCTION Uno
           ? aMatriz[1]              // Resultado: 1
           RETURN NIL

        FUNCTION Dos
           ? aMatriz[3]              // Resultado: 3
           RETURN NIL

 To download this example - click here.

See Also: FUNCTION LOCAL PARAMETERS PRIVATE PROCEDURE PUBLIC