No se puede calcular el offset

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.

Ejemplo:
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.


Ver: Sintaxis - offset