Hay una manera de hacerlo usando una funcion que le pases parametors por referencia y no por valor así podes modificar la variable que pasaste por parametro.
La otra es usando los registros del procesador con las sentencisas ASM en el lenguaje esamblador.
El resultado de una funcion, el valor que devuelve, no es más que una simple asignacion del valor que devuelve al registro AX o mejor dicho EAX (en 32bit). Los registros de 16 bit que podes usar son BX,CX,DX y el más comun que es el AX.
en una aplicacion de Windows tendríasn que ser de EAX, EBX, ECX, EDX. Si de verdad te interesa más esta manera no tengo problema en postearla, no lo hago ahora porque estoy seguro que te interesa mas la promera.
Cada ves que le pasas un parametro a una funcio por ejemplo esta
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
function Cuadrado(x : integer) : integer;
begin
Cuadrado := x * x;
end;
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
El valor de X nunca se modifica porque lo que ´lo que se pasa es el valor numerico de X (por ejemplo 5)
En cambio si los pasas por referencia......
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
procedure CuadradoCubo(x : integer; var y, z : integer);
{todos los parametros despues de var son por referencia}
begin
y := x * x;
z := y * x; {x * x * x}
end;
{como y,z se pasan por referencia..}
VAR
a,b,c : integer;
BEGIN { proncipal}
a := 5;
CuadradoCubo(a, b, c); {b=25, c=125}
END.
{tambien podrias hacer una funcion ue te devuelva el cubo y a la vez
te "devuelva" el cubo}
function Cubo(x : integer; var Cuadrado : integer) : integer;
begin
Cuadrado := x * x;
Cubo := Cuadrado * x;
end;
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Cualquier duda no dudes en preguntar.