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 08-01-2017
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 71
Poder: 11
geolife Va por buen camino
Error declarando Array de constantes

Hola amigos,

Estoy trabajando con Delphi XE8 desarrollando un programa de I Ching y tengo el siguiente error: "E2026 Constant expression expected";
Se produce al declarar la constante de array Trigramas2 usando el método 1.

Disculpadme por favor, por lo que seguramente es muy básico... ¿Es posible declarar un array de constantes ya predefinidos como he intentado con el método 1?

Código:
Type

  TYao = (Yin, Yang, YinMutable, YangMutable);
  TAlmacenTrigrama = Array [1 .. 3] of TYao;

Const

  Kan:  AlmacenTrigrama = (Yin, Yang, Yin);
  Kun:  AlmacenTrigrama = (Yin, Yin, Yin);
  Zhen: AlmacenTrigrama = (Yang, Yin, Yin);
  Xun:  AlmacenTrigrama = (Yin, Yang, Yang);
  Qian: AlmacenTrigrama = (Yang, Yang, Yang);
  Dui:  AlmacenTrigrama = (Yang, Yang, Yin);
  Gen:  AlmacenTrigrama = (Yin, Yin, Yang);
  Li:   AlmacenTrigrama = (Yang, Yang, Yang);

  // METODO 1 ---- ERROR
  Trigramas2: array [1 .. 8] of AlmacenTrigrama = (Kan,Kun,Zhen,Xun,Qian,Dui,Gen,Li);


  // METODO 2 ---- OK
  CCodTrigramas: array [1 .. 8] of AlmacenTrigrama =
    ((Yin, Yang, Yin),
    (Yin, Yin, Yin),
    (Yang, Yin, Yin), 
    (Yin, Yang, Yang), 
    (Yang, Yang, Yang), 
    (Yang, Yang, Yin), 
    (Yin, Yin, Yang),
    (Yang, Yin, Yang));

Última edición por geolife fecha: 08-01-2017 a las 13:01:17.
Responder Con Cita
  #2  
Antiguo 08-01-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.668
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola.

Como indica el error, los elementos del arreglo constante "Trigrama2" deben ser expresiones constantes. Mientras que "Kan, Kun, ..., Li" no lo son, sino que son de tipo "TAlmacenTrigrama" que está declarado como un arreglo de tres elementos de tipo "TYao".

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 09-01-2017
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.470
Poder: 22
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Básicamente, es lo que dice ecfisa.

Y es que en Delphi existen dos grandes clases de constantes: las constantes verdaderas (true constants) y las contantes con tipo o tipificadas (typed constants). La declaración de una constante verdadera sirve para indicarle al compilador que asimile un nombre como "alias" de un valor literal. Así que en todos los lugares donde aparezca el alias utilizado, el compilador estará realmente copiando el valor literal. En cambio una constante tipificada es, en esencia, una variable global con un valor que no puede cambiar.
Código Delphi [-]
Const
  S1 = 'Foo';  // Constante verdadera
  S2 :String = 'Bar';  // Constante tipificada (con tipo explícito)
Para indicar el valor de otra constante (verdadera o no) o el valor predeterminado de un parámetro, el compilador de Delphi sólo admite valores literales o constantes verdaderas. Pero existe una salvedad: para indicar el valor de una constante con tipo explícito puntero, también se puede utilizar la dirección de memoria de algo que Delphi pueda ubicar en tiempo de compilación.

Lo anterior supone que si geolife desea evitar duplicidad de código (no tener que escribir más de una vez la conformación de los ocho vectores), podría declarar sus tipos y constantes así:
Código Delphi [-]
Type
  TYao = (Yin, Yang, YinMutable, YangMutable);
  PAlmacenTrigrama = ^TAlmacenTrigrama;  // Tipo puntero a TAlmacenTrigrama
  TAlmacenTrigrama = Array [1..3] Of TYao;

Const
  Kan :TAlmacenTrigrama = (Yin, Yang, Yin);
  Kun :TAlmacenTrigrama = (Yin, Yin, Yin);
  Zhen :TAlmacenTrigrama = (Yang, Yin, Yin);
  Xun :TAlmacenTrigrama = (Yin, Yang, Yang);
  Qian :TAlmacenTrigrama = (Yang, Yang, Yang);
  Dui :TAlmacenTrigrama = (Yang, Yang, Yin);
  Gen :TAlmacenTrigrama = (Yin, Yin, Yang);
  Li :TAlmacenTrigrama = (Yang, Yang, Yang);
  Trigramas :Array [1..8] Of PAlmacenTrigrama =
    (@Kan, @Kun, @Zhen, @Xun, @Qian, @Dui, @Gen, @Li);

Y obtendrá el mismo funcionamiento cuando pida algo como
Código Delphi [-]
Trigramas [1] [2]

(Recordar que la arroba, en Delphi, sirve para obtener la dirección de memoria —o puntero— de lo que esté expresado detrás de ese símbolo).

Saludos cordiales y feliz año 2017 a todos.

Al González.
__________________
Twitter
Código
Blog
Móvil y WhatsApp: +52 1 2711260117
Responder Con Cita
  #4  
Antiguo 09-01-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.747
Poder: 8
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Muy creativo, no lo hubiera pensado
Responder Con Cita
  #5  
Antiguo 09-01-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.099
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Al González Ver Mensaje
Básicamente
Saludos cordiales y feliz año 2017 a todos.
Al González.
Otra clase magistral
Responder Con Cita
  #6  
Antiguo 09-01-2017
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 71
Poder: 11
geolife Va por buen camino
Apreciados ecfisa, Al González

Muchísimas gracias, nunca deja uno de aprender algo sobre el lenguaje.

Ni se me había pasado por la cabeza declarar el tipo como un puntero y reverenciar el mismo directamente, lo que al final consigue lo que buscamos, evitar duplicar código innecesario y hacer más sencilla la referencia. Verdaderamente Delphi es un lenguaje lleno de grandes posibilidades y recursos y más acompañado de mentes talentosas como las vuestras. Me habéis alegrado el día!!

Quisiera saber si hay alguna dirección/forma dentro del club para realizar donaciones. En mi caso pocas veces intervengo para responder correos a otros usuarios y si en cambio para preguntar, y donde tengo que decirlo, siempre recibo gentilmente vuestra ayuda y conocimientos. Una manera de suplir esto es hacer de vez en cuando alguna donación que pueda servir para el mantenimiento de este espacio y que luego sea usada como la organización considere. Ya me diréis y gracias!!

Un abrazo!

Cita:
Empezado por Al González Ver Mensaje
Básicamente, es lo que dice ecfisa.

Y es que en Delphi existen dos grandes clases de constantes: las constantes verdaderas (true constants) y las contantes con tipo o tipificadas (typed constants). La declaración de una constante verdadera sirve para indicarle al compilador que asimile un nombre como "alias" de un valor literal. Así que en todos los lugares donde aparezca el alias utilizado, el compilador estará realmente copiando el valor literal. En cambio una constante tipificada es, en esencia, una variable global con un valor que no puede cambiar.
Código Delphi [-]
Const
  S1 = 'Foo';  // Constante verdadera
  S2 :String = 'Bar';  // Constante tipificada (con tipo explícito)
Para indicar el valor de otra constante (verdadera o no) o el valor predeterminado de un parámetro, el compilador de Delphi sólo admite valores literales o constantes verdaderas. Pero existe una salvedad: para indicar el valor de una constante con tipo explícito puntero, también se puede utilizar la dirección de memoria de algo que Delphi pueda ubicar en tiempo de compilación.

Lo anterior supone que si geolife desea evitar duplicidad de código (no tener que escribir más de una vez la conformación de los ocho vectores), podría declarar sus tipos y constantes así:
Código Delphi [-]
Type
  TYao = (Yin, Yang, YinMutable, YangMutable);
  PAlmacenTrigrama = ^TAlmacenTrigrama;  // Tipo puntero a TAlmacenTrigrama
  TAlmacenTrigrama = Array [1..3] Of TYao;

Const
  Kan :TAlmacenTrigrama = (Yin, Yang, Yin);
  Kun :TAlmacenTrigrama = (Yin, Yin, Yin);
  Zhen :TAlmacenTrigrama = (Yang, Yin, Yin);
  Xun :TAlmacenTrigrama = (Yin, Yang, Yang);
  Qian :TAlmacenTrigrama = (Yang, Yang, Yang);
  Dui :TAlmacenTrigrama = (Yang, Yang, Yin);
  Gen :TAlmacenTrigrama = (Yin, Yin, Yang);
  Li :TAlmacenTrigrama = (Yang, Yang, Yang);
  Trigramas :Array [1..8] Of PAlmacenTrigrama =
    (@Kan, @Kun, @Zhen, @Xun, @Qian, @Dui, @Gen, @Li);

Y obtendrá el mismo funcionamiento cuando pida algo como
Código Delphi [-]
Trigramas [1] [2]

(Recordar que la arroba, en Delphi, sirve para obtener la dirección de memoria —o puntero— de lo que esté expresado detrás de ese símbolo).

Saludos cordiales y feliz año 2017 a todos.

Al González.
Responder Con Cita
  #7  
Antiguo 09-01-2017
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.470
Poder: 22
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por geolife Ver Mensaje
Quisiera saber si hay alguna dirección/forma dentro del club para realizar donaciones. En mi caso pocas veces intervengo para responder correos a otros usuarios y si en cambio para preguntar, y donde tengo que decirlo, siempre recibo gentilmente vuestra ayuda y conocimientos. Una manera de suplir esto es hacer de vez en cuando alguna donación [...]
Qué bueno que lo mencionas, geolife, porque estoy seguro de que entonces te interesará esto: http://www.clubdelphi.com/foros/showthread.php?t=91282 (leer los tres primeros mensajes del hilo).

Y adicionalmente, para impulsar la causa, puedes hacer o conseguir algunos retweets de esto.

Apoyar a los colegas que más ayudan en el Club, como es ecfisa, es apoyar al club mismo. Si cumplimos esa meta, significa que podremos ayudar a otros más que también lo merecen y al foro mismo para su mantenimiento.

Un cordial saludo.

Al.
__________________
Twitter
Código
Blog
Móvil y WhatsApp: +52 1 2711260117
Responder Con Cita
  #8  
Antiguo 10-01-2017
Avatar de geolife
[geolife] geolife is offline
Miembro Premium
 
Registrado: nov 2006
Ubicación: Barcelona
Posts: 71
Poder: 11
geolife Va por buen camino
Apreciado Al,

Claro, me parece muy buena idea . Voy a ponerme en contacto con newtron para que me facilite el medio de poder llevar a cabo esta acción. Es importante que todos pongamos nuestro pequeño grano de arena.

Gracias otra vez


Cita:
Empezado por Al González Ver Mensaje
Qué bueno que lo mencionas, geolife, porque estoy seguro de que entonces te interesará esto: http://www.clubdelphi.com/foros/showthread.php?t=91282 (leer los tres primeros mensajes del hilo).

Y adicionalmente, para impulsar la causa, puedes hacer o conseguir algunos retweets de esto.

Apoyar a los colegas que más ayudan en el Club, como es ecfisa, es apoyar al club mismo. Si cumplimos esa meta, significa que podremos ayudar a otros más que también lo merecen y al foro mismo para su mantenimiento.

Un cordial saludo.

Al.
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
Error en Array Jere_84 Varios 5 26-04-2013 00:21:59
Error con Array of String orlando9427 Varios 1 25-01-2011 04:26:20
Declarando un Array dinámicamente dec Trucos 1 25-11-2006 23:25:20
Declarando un array dinámicamente Neftali Trucos 0 30-06-2006 11:23:51
Error en Array Trecord. alfredosg19 Varios 1 20-03-2005 16:55:04


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


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