Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Se puede modificar el valor de una constante? (https://www.clubdelphi.com/foros/showthread.php?t=34971)

DarKraZY 27-08-2006 12:14:01

¿Se puede modificar el valor de una constante?
 
Hola! Buenos días,

Puede alguien pensar que me he vuelto loco al hacer la pregunta, ya que la teoría lo deja bien claro. Un valor constante es un valor que no va a cambiar.

Pero os voy a explicar el porqué de la pregunta.

Llevo unos días instalando, probando y aprendiendo las DirectX para Delphi de JEDI http://www.clootie.ru/index.html y también los componentes DelphiX http://www.micrel.cz/Dx/. Y con todo esto he encontrado ejemplos con el siguiente código o muy similar:
Código Delphi [-]
procedure TD3DApplication.ShowStats;
const 
  dwFrames: Cardinal = 0;
var 
  fTime: FLOAT;
begin
  // Keep track of the time lapse and frame count
  fTime := timeGetTime * 0.001; // Get current time in seconds
  Inc(dwFrames);

¡Declaran una constante y después la usan! Como si fuesen variables globales o algo así.

Por todo esto he pensado si era posible hacerlo, quizás cambiando alguna opción del compilaro o algo similar. Ya que dudo que gente que realiza unos componentes, conversiones de cabeceras en C... pueda cometer "este error".

Gracias por leerme ;)

dec 27-08-2006 13:13:28

Hola,

El código de más arriba no lo acabo de comprender. He tratado de localizar la clase "TD3Application" pero no la encuentro, se ve que no tengo instalados los componentes en que viene. Pero, parece que sí es posible cambiar el valor de una constante, aunque ignoro si esto puede decirse así, propiamente.

Código Delphi [-]
const
  // Constante string
  FConstante: string = '¡Hola ';

var
  // Puntero a string
  PFConstante: ^string;

begin
  // Apuntamos a la constante
  PFConstante := @FConstante;

  // Cambiamos su valor
  //PFConstante^ := FConstante + ' mundo!';
  PFConstante^ := PFConstante^ + ' mundo!';

  // Muestra ¡Hola mundo!
  ShowMessage( FConstante );

end;

Algún monstruo de los que hay por aquí nos comentará algo más sobre este tema, seguro. :)

dec 27-08-2006 13:34:35

Hola,

Bueno. Pues, buscando un poco en los Foros me topo con este mensaje del amigo Federico que parece aclarar bastante las cosas respecto de lo que nos ocupa.

En palabras de Federico:

Cita:

Empezado por Federico Firenze
Modificar constantes en tiempo de ejecución es imposible, ya que el compilador reemplaza la constante por el valor, por lo que no existe una "variable" con su contenido.

Pero, en el caso en que nos encontramos:

Cita:

Empezado por Federico Firenze
Pero... si utilizas constantes tipada, si puedes hacerlo ya que estas constantes funcionan como variables, a no ser que la directiva {$J-} este activa.

Por cierto que, la directiva del compilador {$J} ó {$WRITEABLECONST} nos lo termina de aclarar:

Cita:

Empezado por Ayuda de Delphi
The $J directive controls whether typed constants can be modified or not. In the {$J+} state, typed constants can be modified, and are in essence initialized variables. In the {$J-} state, typed constants are truly constant, and any attempt to modify a typed constant causes the compiler to report an error.

Es decir, que esto es posible:

Código Delphi [-]
{$J+}
procedure TForm1.Button1Click(Sender: TObject);
const
  FConstante: string = '¡Hola ';
begin
  ShowMessage( FConstante + ' mundo!');
end;
{$J-}

Y es lo que se hace en el código que tú has expuesto, utilizar una constante a modo de variable previamente inicializada. Probablemente porque:

Cita:

Empezado por Ayuda de Delphi
In early versions of Delphi and Borland Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.

PD: Puede comprobarse cómo el código fuente que he puesto en mi anterior mensaje no funcionaría con constantes "no tipadas". ;)

DarKraZY 27-08-2006 14:13:07

Muchas gracias Dec!

Había buscado por los foros, pero tampoco sabía exactamente como buscarlo. Ahora queda todo resuelto, tan sólo sirve para inicializar variables.

Por cierto, el pequeño código que había puesto es de un ejemplo (aunque no sé muy bien si de DelphiX o de los headers de DirectX). Los he bajado de los enlaces que puse al principio por si te interesan ;)


La franja horaria es GMT +2. Ahora son las 19:31:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi