Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-08-2006
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: Aug 2003
Posts: 460
Poder: 16
DarKraZY Va por buen camino
¿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
Responder Con Cita
  #2  
Antiguo 27-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.654
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.davidesperalta.com

Última edición por dec fecha: 27-08-2006 a las 14:15:29.
Responder Con Cita
  #3  
Antiguo 27-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.654
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
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".
__________________
David Esperalta
www.davidesperalta.com

Última edición por dec fecha: 27-08-2006 a las 14:47:18.
Responder Con Cita
  #4  
Antiguo 27-08-2006
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: Aug 2003
Posts: 460
Poder: 16
DarKraZY Va por buen camino
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Se puede pasar un objeto por valor? C# sakuragi .NET 2 18-01-2006 10:26:18
ShowHint Constante .. se puede? ingel Varios 5 14-11-2005 16:36:49
Valor constante en consulta UNION floren SQL 2 28-05-2004 17:44:01
Modificar valor Mastersource Asshole Conexión con bases de datos 1 28-05-2004 01:59:38
IBSQL puede devolver un valor haciendo INSERT? altp SQL 2 04-10-2003 23:09:49


La franja horaria es GMT +2. Ahora son las 17:00:12.


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