En la expresión indicada en el programa se utiliza el operador offset (o el símbolo sinónimo &) con el fin de obtener la dirección (desplazamiento) de un objeto. Dicho objeto no tiene dirección, pues no es una variable, una tabla o una estructura, por lo que el compilador no puede resolver la expresión.
Probablemente se haya pretendido obtener la dirección de una expresión constante o una que involucre varios operandos.
A continuación se muestra un programa con varios ejemplos de uso válido del operador offset, y otros tantos inválidos.
PROGRAM mi_juego; CONST mi_constante=0; GLOBAL mi_offset=0; mi_variable=0; mi_tabla[10]; STRUCT mi_estructura[10] variable; END BEGIN // Ejemplos correctos mi_offset=offset mi_variable; mi_offset=offset mi_tabla; mi_offset=offset mi_tabla[mi_variable]; mi_offset=offset mi_estructura[0].variable; mi_offset=offset id.x; // Ejemplos erróneos mi_offset=offset (mi_variable*2); mi_offset=offset mi_constante; mi_offset=offset 0; write_int(0, 0, 0, 0, offset (mi_variable+1)); END
No hay ninguna diferencia entre el uso de la palabra reservada offset o el símbolo &.
Las constantes como mi_constante no tiene una dirección pues son simples sinónimos del valor numérico que representan.
La sentencia mi_offset=offset (mi_variable*2); es errónea debido a que la multiplicación se realiza en primer lugar y, una vez realizada, el valor mi_variable*2 se convierte en un resultado numérico que no tiene ninguna dirección asignada.
En cambio, la expresión offset mi_variable*2 sí es correcta pues, en este caso, se obtiene primero la dirección de mi_variable y luego será esta dirección la que se multiplique por 2.