Tablas del compilador

Anuncio
Página 1
Registros variables en C. (union)
Se usa la palabra reservada union que en Pascal era un case.
typedef enum { alumno , profesor } tTipo;
typedef struct {
tTipo tipo;
union { int padron;
long legajo;
} numero;
} persona;
Modo de uso:
En este caso padron y legajo usan la misma posición de memoria por lo que resulta en un gran ahorro en memoria. Teniendo en cuenta que la posición en memoria la usa padron o legajo.
persona gCarolo, eCalot;
gCarolo.tipo = profesor;
gCarolo.numero.legajo = 223456;
eCalot.tipo = alumno;
eCalot.numero.padron = 22988;
Nota: puede que al usuario se le ocurra modificar
gCarolo.numero.legajo = 223456;
gCarolo.numero.padorn = 8;
En este caso y según la arquitectura de la pc en donde se codifica puede suceder que 8 “pise” las primeras o las ultimas posiciones de 223456. Como usan la misma posición de memoria, padron es un entero y legajo un long, 8 “pisaría” las primeras o las ultimas posiciones correspondientes al tamaño de un entero. Gráficamente sucedería que;
8
256
en el caso de un intel
Página 2
en el caso de una mac
223
8
Esto no es solo a modo de ejemplo. Realmente no se cuanto se pisaría.
Tablas
Tener en cuenta que los cálculos se realizan suponiendo el uso de una pc con arquitectura de 32 bits (32 bits por palabra, es decir 4 bytes por palabra). Se tomara como ejemplo la estructura anteriormente definida.
Tabla de Registros (en bytes)
ID (interno)
U12
ID (nombre)1
­
IDdato
padron
legajo
Base
int
long
Tamaño
4
8
S1
Persona
tipo
numero
tTipo (E1)4
U1
4
8
offset
0
03
Tamaño tot 8
0
4
Tamaño tot 12
Tabla de Enumerados
ID (interno)
E1
ID (nombre)
tTipo
Limite Inferior
Limite Superior
Base
Tamaño
0
1
int
45
Tabla de Variables (suponiendo que se define: persona A,B,C;)
ID (interno)
V1
ID (nombre)6
A
Base
S1
Tamaño
127
offset
0
Solo si se tiene un tipo asociado (typedef) se llenara la celda correspondiente al ID nombre salvo en la tabla de “variables”.
2
Por convención se asignan los nombres Un a las uniones, Sn a las estructuras, En a los enumerados, Vn a las variables, An a los arreglos
1
3
En U1 se puede apreciar que padron y legajo poseen el mismo offset, esto es porque, al ser una union ocupan la misma posición de memoria
4
En la próxima tabla tipo recibirá el IDC “E1”
5
Los enumerados siempre ocupan 4 bytes
6
Nombre de las variables, no de typedef
Página 3
V2
V3
B
C
S1
S1
12
12
12
24
Tamaño tot 36
Ejemplos de Aplicación
Ejemplo 1: Supongamos que se codifica B.numero.legajo = 8, ¿en que posición relativa al offset sera almacenado el 8?
B empieza en 12, B.numero empieza en la posición 12 + 4 ( notar la celda offset correspondiente a numero), por ultimo B.numero.legajo empieza en la posición 12 + 4 + 0 (recordar que numero puede almacenar padron o legajo, y notar la celda offset correspondiente a legajo)
Respuesta: el 8 se almacenara en la posición 16 del offset relativo8 Corresponde al tamaño total de S1
Se dice offset relativo ya que no sabemos que posición reservara, el sistema operativo, para dichos almacenamientos. Si por ejemplo el offset inicial hubiera sido 14 el “8” estaría almacenado en la posición 30 de la memoria (si las posiciones reservadas por el OS son consecutivas) o en la posición 16 relativa. 7
8
Página 4
Ejemplo 2: Supongamos que se codifica la siguiente línea; 9(long)&C.numero.padron – (long)&B, ¿qué resultado dará la operación?
10
X
+
(long)&C.
24
Numero.
4
+
+
padron
0
­
­
X
+
(long)&B
12
=
16
Tablas de Arreglos supongamos que se define;
char Hola[20]; char Hola2[18];
char Hola2[20][5];
IDC
A1
IDnombre
­
Limite Inferior
0
Limite Superior
19
Base
char
Tamaño
20
A2
­
0
17
char
2011
A3
­
0
19
4
char
char
20
5
Dimensión
1
Tamaño tot 20
1
Tamaño tot 20
1
2
Tamaño tot 10012
Ejercicio 3: Supongamos que se codifica la siguiente línea; &Hola[5] –&Hola[0], ¿qué resultado dará la operación? Claramente la respuesta sera 5, porque estamos restando la posición 5 menos la posición 0. (recordar que un char = un Byte)
Ejercicio 4: Supongamos que se codifica la siguiente línea; &Hola[5] –&Hola[0], pero esta vez hola es un vector de enteros ¿qué resultado dará la operación? Claramente la respuesta sera 20, teniendo en cuenta el resultado obtenido en el ejercicio 3 y multiplicando dicho resultado por el tamaño que ocupa un entero. ( 5x4=20)
Se castea a long las dos expresiones para que sea valida la resta
Ponemos X porque no conocemos la posición reservada por el sistema operativo 11
Se tira para arriba el resultado del tamaño, según la arquitectura de la maquina, en este caso como trabajamos en 32 bits se busca un tamaño que sea múltiplo de 4. Aunque las posiciones 19 y 20 no puedan ser usadas.
12
Según la referencia 11 se tira para arriba, pero para dos dimensiones solo se lo hace una vez
9
10
Descargar