EGL resuelve una referencia de variable mediante el acceso estático o dinámico:
- Cuando el acceso dinámico está en vigor, el nombre del campo y el tipo se conocen solo
en tiempo de ejecución. El código determina el nombre de un valor en el código o de la entrada en
tiempo de ejecución.
El acceso dinámico está en vigor cuando el código hace referencia a
cualquiera de los elementos siguientes:
- Cuando el acceso estático está en vigor, el nombre del campo y el tipo se conocen
durante la generación y el nombre siempre se ajusta al convenio de denominación de los
identificadores de EGL. El nombre no se utiliza en tiempo de ejecución.
El acceso estático está
en vigor cuando el código hace referencia a cualquiera de los elementos siguientes:
- Una variable que está fuera de cualquier contenedor y cuyo tipo es distinto de ANY
- Un campo de un registro fijo
- Un campo de un registro no fijo cuando la cadena de relaciones que llevan a ese campo (de
variable a campo y a subcampo) es tal que cada referencia utiliza el acceso estático
Considere un ejemplo en el que los valores de un diccionario incluyen un registro fijo y un
registro no fijo:
// un componente de registro fijo
Record ExampleFixedRecordPart type=serialRecord
{
fileName = "myFile"
}
10 ID INT;
10 Job CHAR(10);
end
// un componente de registro (no fijo)
Record ExampleDynamicRecordPart type=basicRecord
ID INT;
Job CHAR(10);
end
Program myProgram
dynamicPerson ExampleDynamicRecordPart;
myFlexID INT;
fixedPerson ExampleFixedRecordPart;
myFixedID INT;
Function main()
dynamicPerson.ID = 123;
dynamicPerson.Job = "Student";
fixedPerson.ID = 456;
fixedPerson.Job = "Teacher";
relationship Dictionary
{
dynamicRecord=dynamicPerson,
staticRecord=fixedPerson
};
end
end
end
Se aplican las siguientes normas:
- Una referencia a un valor de diccionario es dinámica y cada referencia subordinada es dinámica. Considere el efecto en caso de que el código incluya las sentencias siguientes:
myDynamicID INT;
myDynamicID = relationship.dynamicRecord.ID;
La referencia a dynamicRecord sería dinámica y la referencia
a ID sería dinámica, con el identificador ID visible en tiempo de ejecución.
- Una referencia que empieza por una estructura fija solo puede hacer referencia a la memoria
interna de esa estructura. En el ejemplo actual, una referencia que empieza por fixedPerson puede
acceder a los campos ID y JOB en el registro fijo, pero no puede acceder a otros campos.
- El código puede acceder dinámicamente a una estructura fija pero la misma sentencia de
referencia no puede acceder a los campos de ese campo. En el ejemplo actual, la referencia
siguiente no será válida porque el ID de identificador no está disponible en tiempo de
ejecución:
myFixedID INT;
// NO válido
myFixedID = relationship.fixedRecord.ID;
Puede manejar el problema declarando otro registro fijo y asignándole valores del
registro fijo que está en el diccionario:
myFixedID INT;
myOtherRecord ExampleFixedRecordPart;
myOtherRecord = relationship.staticRecord;
myFixedID = myOtherRecord.ID;
El acceso dinámico es válido en las asignaciones (en los lados izquierdo o derecho); en
expresiones lógicas y en las sentencias set,for
y openUI.