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 02-01-2004
pplacido pplacido is offline
Registrado
 
Registrado: ene 2004
Ubicación: Lima - Perú
Posts: 2
Poder: 0
pplacido Va por buen camino
Tipo de Estructura variable

Hola amigos... tengo una consulta con un codigo en Delphi (Cabe señalar que no se Delphi)

Type
TMem_Register = Record
Case Integer Of
1: (Check_Sum : WORD; );
2: (Crc_move : Array[1..2] Of Byte; );
end;


La siguiente declaración no se lo que hace: Parecería que declarara una estructura variable con la instrucción case Integer. lo que no entiendo es que lineas abajo la declaración es la siguiente:

Temp_Ccitt : TMem_Register;
Crc_Ccitt : TMem_Register;

No veo que en ningun momento se establezca que tipo de variables tendrá la estructura


Si algunos de ustedes me puede decir o interpretar este código me la hace llegar. Gracias de antemano....
Responder Con Cita
  #2  
Antiguo 02-01-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Se trata de una estructura de tipo registro variable, es decir de acuerdo con la definición, el registro se compone de dos tipos de datos posibles pero solamente podrá almacenar uno de los 2,
un ejemplo siguiendo tu código:

Código:
procedure TForm1.Button1Click(Sender: TObject);
Type
TMem_Register = Record
Case Integer Of
1: (Check_Sum : WORD; );
2: (Crc_move : Array[1..2] Of Byte; );
end;
var
Temp_Ccitt : TMem_Register;
Crc_Ccitt : TMem_Register;

begin
Temp_Ccitt.Check_Sum:=5000;
Crc_Ccitt.Crc_move[1]:=2;
Crc_Ccitt.Crc_move[2]:=33;
end;
En este caso la estructura puede soportar una variable numérica de tipo Word o una matriz del tipo Byte de 2 posiciones.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 02-01-2004
pplacido pplacido is offline
Registrado
 
Registrado: ene 2004
Ubicación: Lima - Perú
Posts: 2
Poder: 0
pplacido Va por buen camino
Si el registro solo puede almacenar uno de los 2 tipo de datos posibles,

* Quiere decir que ya no lo puedo cambiar a otro tipo, osea si empiezo con tipo WORD solo me acepta WORD.
* Si puedo cambiar de tipos: Al asignar un dato de tipo Array (por ejemplo si anteriormente habia un dato de tipo Word) ¿me va a reemplazar el dato ingresado anteriormente o me saldrá error?.

Gracias por ayuda amigo
Responder Con Cita
  #4  
Antiguo 03-01-2004
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
No lo que quiere decir es cada vez que utilices una variable instanciada a partir de este registro, podrá contener cada vez solamente uno de los dos tipos de datos, pero no los dos a la vez, es una especie de sobrecarga.

Temp_Ccitt.Check_Sum:=5000;
Temp_Ccitt.Crc_move[1]:=2;

Al añadir el punto verás que puedes elegir uno de los tipos de dato.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 04-01-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
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
¡Buen día a todos!

Complementando un poco lo que nos comenta Marcoszorrilla, agrego que este tipo de estructuras se conocen como registros con parte variante.

Un registro con parte variante, consiste en una estructura Record, donde dos o más de sus campos ocupan el mismo espacio de memoria. Por lo tanto, al modificar el valor (contenido) de uno de estos campos, se estará modificando también el valor de los demás campos que compartan el mismo bloque de bytes.

Debo aclarar que esto de la "parte variante" no tiene nada que ver con el tipo de dato "Variant". Por otra parte, el término sobrecarga se aplica más bien a los casos donde el compilador determina cuál de varias posibles opciones tomar. En el caso de los registros con parte variante, todas las opciones de la parte variante están disponibles siempre, aun en tiempo de ejecución.

La finalidad de la parte variante de un registro, es permitir dos o más interpretaciones de un mismo dato, o bien facilitar el acceso de lectura/escritura a sólo una parte del bloque de bytes ocupado por otro campo.

La estructura que se plantea:
Código:
TMem_Register = Record
  Case Integer Of
    1 : (Check_Sum :Word);
    2 : (CRC_Move :Array [1..2] Of Byte);
End;
contiene dos campos que ocuparán exactamente el mismo espacio de memoria: Check_Sum, de tipo Word, y CRC_Move, arreglo de dos Bytes. Como los dos campos ocupan el mismo espacio de memoria (un Word es un par de Bytes), CRC_Move [1] será el primer Byte de Check_Sum, mientras que CRC_Move [2] será el segundo.

Esto permite que una variable de tipo TMem_Register, pueda ser interpretada como un valor de tipo Word, o bien como un arreglo de dos Bytes.

Se puede acceder a cualquiera de los campos de la parte variante en cualquier momento. Siempre están disponibles todos, no hay restricción de acceso. Pero debe tenerse presente que modificar uno de esos campos es modificar también aquellos que tengan por lo menos un byte en común con el primero.

Espero esto sea de utilidad. Seguimos en contacto.

Al González .
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


La franja horaria es GMT +2. Ahora son las 06:35:53.


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