Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Concatenar vectores en tiempo de diseño

Hola a todos!

Tengo una dudilla sobre vectores, os cuento:

Tengo un vector definido como constante como sigue:

Código:
const vect1: array [0..2] of integer=(0,1,2);
y otro vector que me gustaría que fuese (varios elementos,los elementos de vect1, mas elementos), y me gustaría hacerlo en tiempo de diseño (es decir, escrito en código). Algo del estilo:

Código:
const vect2: array [0..2+length(vect1)-1] of integer=(-2,-1,vect1,3);
Evidentemente, el compilador no traga que ponga vect1 como constante (me da error: Constant expression expected), aunque sí que me permite que la longitud se la dé con la función length.

¿Hay alguna forma de conseguir hacer esto?
Gracias de antemano,
Un saludo,
LoPiTaL
Responder Con Cita
  #2  
Antiguo 25-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Hola otra vez. Haciendo pruebas he intentado lo siguiente, y tampoco me deja:

Lo he intentado hacer como records y tampoco me deja hacerlo. Os pongo el código:

Código:
type vect1_def=record
  f1: array [0..1] of integer;
end
const vect1: vect1_def=(
  f1: (1,2);
);
 
{Hasta aquí bien}
 
type vect2_def=record
  f1: array [0..1] of integer;
  f2: vect1_def;
  f3: array [0..1] of integer;
end
const vect2: vect2_def=(
  f1: (-1,0);
  f2: vect1;  //<-----Aquí falla!
  f3: (3,4);
)
Esta vez el error que da es: '(' expected but identifier 'vect1' found.

¿Ideas?

Un saludo,
LoPiTaL
Responder Con Cita
  #3  
Antiguo 25-02-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,
¿no te seria mas practico no utilizar vectores constantes?
Responder Con Cita
  #4  
Antiguo 25-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Me daría igual que estuviesen declarados como const o como var, nunca voy a escribirlos, así que no tengo problema en eso.
Lo que sí que me gustaría es poder inicializarlo por código, sin tener que ejecutar nada, con el fin de que simplemente cambiando la definición de vect1, automáticamente me cambien el resto de definiciones en las que vect1 aparece (ya que no sólo aparecerá en vect2, sino que aparecerá en bastantes otras definiciones).

El último recurso es hacerlo en un bloque "initialization", pero no me gustaría tener que hacerlo así.

Implementándolo como var tampoco me deja compilar.

Gracias por la respuesta,
Un saludo,
LoPiTaL
Responder Con Cita
  #5  
Antiguo 25-02-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¿Podrías subir tu archivo .pas real o una versión simplificada del mismo? Tal vez observando más información de contexto (como el propósito de esos vectores) podríamos idear otras soluciones.
Responder Con Cita
  #6  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
El problema está en declarar vectores como constantes, asignándole un vector a otro.
Hacelo con variables, creo que funciona. En unos 10 minutos me fijo, ahora no puedo.
Veo y te digo, nos vemos!!!
Responder Con Cita
  #7  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Recién vuelvo, tuve problemas con una note que no detectaba la webcam.
Bueno, mirá.
Toqueteando D2010 llegué a la única conclusión de que no se puede hacer esa asignación en diseño (o sea, "codeando") porque no hay ningún dato almacenado en memoria como para que el compilador puede asignar.
Me refiero a que, cuando el compilador lee algo como "f2: vect1;" o "const vect2: array [0..2+length(vect1)-1] of integer=(-2,-1,vect1,3);" dice "bueno, yo no almacené ningún dato, no puedo hacer eso, te tiro un error". Espero que con esa explicación ligeramente tonta se pueda entender mi concepto.
A mi limitado entender, lo único que podés hacer es asignar los datos en ejecución.

Saludos y espero haberte ayudado a entender!
Responder Con Cita
  #8  
Antiguo 26-02-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Editado por confusión.
Responder Con Cita
  #9  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Question

Cita:
Empezado por Al González Ver Mensaje
Editado por confusión.
Yo quiero saber cuál fue la confusión
Responder Con Cita
  #10  
Antiguo 26-02-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por BrunoBsso Ver Mensaje
Yo quiero saber cuál fue la confusión
Es que pensé que tú eras el autor original del hilo.

-----------------------------------------------------

CONFUSIÓN:
Cita:
Empezado por BrunoBsso, creyendo Al que se trataba de LoPiTaL
Saludos y espero haberte ayudado a entender!
No, si entendido está desde hace varias horas. Como todos los lenguajes, Delphi tiene sus limitantes. Mi inquietud está en ver qué hay detrás de la tuya. Claro, si tú quieres.


END CONFUSIÓN

Última edición por Al González fecha: 26-02-2010 a las 07:09:34.
Responder Con Cita
  #11  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Ahhhhh me habías escrito eso? Jajajajjajajaja
END CONFUSIÓN jajajajjajaja
Responder Con Cita
  #12  
Antiguo 26-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Hola a todos! Gracias por las respuestas.

Pues no puedo daros el pas real, ya que son muchos todos con defines de este estilo, y no dan mucha información.
Lo que sí puedo daros es para qué quiero estas definiciones, os comento:

Estoy haciendo una aplicación cliente-servidor, en la que el servidor es el PC que corre la aplicación, y los clientes son dispositivos con un microcontrolador. El problema es que Delphi (no sé si Delphi o los PCs) trabajan en little-endian, y el uC que utilizo trabaja en big endian. Uso estructuras de datos, para transmitir de PC a uC o viceversa, que mezclan enteros, singles, words y booleans (ya me encargo yo de alinear a 4 bytes para que no hayan huecos de memoria en C -sí, otro problema es que los uC los programo con C), y para realizar la conversión he hecho un procedure que lee un puntero a estructura y un vector con los tamaños de los campos de la estructura, y entonces puede hacer el cambio de endian a estructuras más completas sin necesidad de ir campo a campo, como he visto en muchos ejemplos que hay por la web.

Hasta aquí bien. El problema me ha aparecido cuando he pasado a realizar estructuras más complejas, en el que uno de los campos es otra estructura, por lo que necesitaría un vector de vectores (en el caso más básico) o un vector de vector de vector de vectores (si la estructura contenida en un campo contiene a su vez otra estructura, etc, etc...). Y no sólo es un vector de vectores, sino que en el vector "padre" hay enteros y uno de los items del vector (el relacionado con la estructura hija) es otro vector con la info de la otra estructura.
Utilizo el vector como un indicador del tamaño de cada uno de los campos de tal forma que la función sea capaz de reconocer qué tamaño tiene cada campo y realizar el cambio de endian de manera correcta.
Entonces, si cambio un campo en una estructura que está dentro de otra, me gustaría que cambiando exclusivamente su vector de definición, se actualizasen los vectores de definición de las estructuras "padre".

¿Por qué no me gustaría hacerlo en código? Porque pierdo un poco la noción de qué estoy haciendo, además de quedar separadas la declaración de la estructura y la declaración de su vector de datos, siendo más fácil que se me olvide cambiar la definición del vector cuando cambio la estructura.

Espero haber sido bastante claro. Sé que es algo enrevesada la idea, pero es lo único que se me ha ocurrido, desde el momento en que me dí cuenta que no existía información RTTI para estructuras.

Dicho todo esto, ¿se os ocurre alguna forma más sencilla de trabajar con cambios de endian para estructuras complejas? A mí no se me ocurre nada sencillo, y he estado dándole muchas vueltas, desde todo lo dicho anteriormente, hasta el uso de clases y tal, pero no se me ha ocurrido cómo usar clases para realizar la tarea de la forma más automatizada posible.

NOTA: donde digo estructura me estoy refiriendo a record

Gracias nuevamente por las respuestas,
Un saludo,
LoPiTaL
Responder Con Cita
  #13  
Antiguo 26-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Cita:
Empezado por BrunoBsso Ver Mensaje
Recién vuelvo, tuve problemas con una note que no detectaba la webcam.
Bueno, mirá.
Toqueteando D2010 llegué a la única conclusión de que no se puede hacer esa asignación en diseño (o sea, "codeando") porque no hay ningún dato almacenado en memoria como para que el compilador puede asignar.
Me refiero a que, cuando el compilador lee algo como "f2: vect1;" o "const vect2: array [0..2+length(vect1)-1] of integer=(-2,-1,vect1,3);" dice "bueno, yo no almacené ningún dato, no puedo hacer eso, te tiro un error". Espero que con esa explicación ligeramente tonta se pueda entender mi concepto.
A mi limitado entender, lo único que podés hacer es asignar los datos en ejecución.

Saludos y espero haberte ayudado a entender!
Hola otra vez,
Revisando los posts me he dado cuenta de que es curioso que sí que me permite hacer length(vect1) , así que por lo menos algo sabrá sobre vect1, ¿no?

Un saludo,
LoPiTaL
Responder Con Cita
  #14  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Wink

Cita:
Empezado por LoPiTaL Ver Mensaje
Hola otra vez,
Revisando los posts me he dado cuenta de que es curioso que sí que me permite hacer length(vect1) , así que por lo menos algo sabrá sobre vect1, ¿no?

Un saludo,
LoPiTaL
Porque la función Length(Vect1) es en tiempo de ejecución, no le da ningún dato al programa al compilar
O sea, Length la usa el programa en tiempo de ejecución, no mientras estás codeandolo, y es ahí en la ejecución cuando devuelve algún dato.
Un saludo
Responder Con Cita
  #15  
Antiguo 26-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por BrunoBsso Ver Mensaje
Porque la función Length(Vect1) es en tiempo de ejecución, no le da ningún dato al programa al compilar
O sea, Length la usa el programa en tiempo de ejecución, no mientras estás codeandolo, y es ahí en la ejecución cuando devuelve algún dato.
Me parece que no puede ser como lo dices. Una construcción del tipo

Código Delphi [-]
const
  V: array[A..B] of Integer = (...)

requiere que A y B sean constantes, es decir, que sean conocidos al momento de la compilación, ya que el tipo de datos corresponde a un arreglo de tamaño fijo.

En una construcción como:

Código Delphi [-]
const
  U: array[0..2] of Integer = (...);
  V: array[0..Length(U) - 1] = (...);

seguramente el compilador calcula el valor de Length, cosa que puede hacer porque el mismo vector U es constante y ya está determinada su longitud desde la compilación. Esto debe ser "magia" del compilador, pues no sucedería lo mismo con otra función.

Si cambiamos la definición a algo como:

Código Delphi [-]
var
  U: array of Integer;

const
  V: array[0..Length(U) - 1] = (...);

ya no compila, pues, siendo U un vector dinámico, el compilador no tiene manera de saber cuál es su longitud y requiere una constante para el índice superior de V.

// Saludos
Responder Con Cita
  #16  
Antiguo 26-02-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Según recuerdo la teoría de compiladores, no obtiene un resultado de Length en compilación, lo obtiene solo en ejecución.
Y al hacer un vector estático y querer asignarle la longitud a otro vector dinámico no puede hacerlo porque el dinámico no tiene ningún dato todavía.
Me parece a mí, no se.
Responder Con Cita
Respuesta



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
No veo, en tiempo de diseño los nombres de los componentes QuarkBcn Varios 3 19-12-2007 09:38:31
Diseño de reportes en tiempo de ejecución jzginez Impresión 2 17-04-2007 16:46:10
eventos en tiempo de diseño jar OOP 0 27-01-2007 22:09:11
Indices En Tiempo De Diseño?? amadis Conexión con bases de datos 0 12-04-2006 20:22:01
Diseño en tiempo de ejecucion Nelson Alberto Impresión 2 26-01-2006 09:34:12


La franja horaria es GMT +2. Ahora son las 07:34:18.


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
Copyright 1996-2007 Club Delphi