PDA

Ver la Versión Completa : Tipo de Estructura variable


pplacido
02-01-2004, 21:22:59
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....

marcoszorrilla
02-01-2004, 23:31:23
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:


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.

pplacido
02-01-2004, 23:47:55
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

marcoszorrilla
03-01-2004, 00:05:30
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.

Al González
04-01-2004, 01:50:16
¡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:

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 :).