Sie sind auf Seite 1von 22

Comprobacin de tipos.

Procesadores de Lenguaje II

Comprobacin de Tipos
Introduccin Sistemas de tipos
Expresiones de tipos Sistemas de tipos Comprobacin esttica y dinmica de tipos Tablas de Smbolos

Especificacin de un comprobador de tipos sencillo


Conversiones y sobrecarga de tipos

Equivalencia de expresiones de tipos

Comprobacin de tipos. Procesadores de Lenguaje II

Comprobacin de Tipos
Un comprobador de tipos
Calcula y mantiene la informacin de tipos (inferencia) informaci Comprueba que el tipo de una construccin tenga sentido en construcci su contexto segn el lenguaje seg

Ubicacin:

tokens

rbol sintctico abstracto Analizador Analizador sintctico sintctico Comprobador Comprobador De tipos De tipos

rbol sintctico abstracto

Cdigo intermedio Generador de Generador de Cdigo Cdigo intermedio intermedio

Comprobacin de tipos. Procesadores de Lenguaje II

Ejemplo Comprobacin de Tipos


Ej. 1:Tipos para not false && 1 < 2 * 3
&& : boolean not : boolean false : boolean 1 : int < : boolean * : int 2 : int 3 : int

Comprobacin de tipos. Procesadores de Lenguaje II

Ejemplo Comprobacin de Tipos


Ej. 2:Tipos para if (a=b) x=1; (error en Java, no en C)
S : error if (E) then S = : int b : int 1 x : int 1 : int

= : int a : int

Es una aplicacin de evaluacin de gramtica atribuida


No siempre es tan sencillo

Comprobacin de tipos. Procesadores de Lenguaje II

Comprobacin de Tipos
Un lenguaje especifica que operaciones son vlidas para cada tipo
Formalizacin de reglas semnticas de verificacin

Se detectan errores
Acceso incorrecto a memoria: Lmites de abstraccin, mal uso de estructuras, etc.

Tipos de lenguajes:
Estticamente tipificados: La mayora de comprobaciones se
realizan en tiempo de compilacin (C, Java) en ejecucin (Scheme, LISP) No tipificados: Ninguna comprobacin (cdigo ensamblador)

Dinmicamente tipificados: La mayora de comprobaciones

Comprobacin de tipos. Procesadores de Lenguaje II

Expresiones de tipos I
Representan el tipo de las construcciones
Valores posibles y operaciones que pueden aplicarse Especificaciones del lenguaje para operaciones:
Tipo de Expresin resultante de aplicar operadores aritmticos Resultado de aplicar operador & Tipo de llamada a funcin

Las clases en POO son una extensin

Pueden ser
Un tipo bsico
Boolean, Char, Integer, Real, Vacio, Error_tipo,

Un constructor de tipos aplicado a expresiones de tipos


array de variables de tipo bsico, puntero a variable, registro,

Comprobacin de tipos. Procesadores de Lenguaje II

Expresiones de tipos II
Expresiones de tipos
1. 2. 3.

a)

Tipos bsicos El nombre de un tipo es una expresin de tipo Constructores de tipos y expresiones de tipos son tipo Arrays
Si T es una expresin de tipo entonces array (I, T) es una expresin de tipo que indica una matriz con elementos de tipo T y conjunto de ndices I Var A: array[1..10] of integer es array (1..10, integer)

b)

Productos
Si T1 y T2 son expresiones de tipo, su producto cartesiano T1 x T2 es una expresin de tipo (x es asociativo por la izquierda)

Comprobacin de tipos. Procesadores de Lenguaje II

Expresiones de tipos III


c)

Registros
Tiene como tipo el producto de los tipos de los campos. El constructor de tipo record se aplica a una tupla formada con nombres de campos y tipos de campos. Ej: type fila = RECORD direccion: integer; lexema: array [1..15] of Char; END; var tabla: array [1..10] of fila
fila tiene el tipo: record ((direccin x integer) x (lexema x array(1..15, Char))) Tabla tiene el tipo: array(1..10, record ((direccin x integer) x (lexema x array(1..15,char))) o: array(1..10, Tipo_Fila)

Comprobacin de tipos. Procesadores de Lenguaje II

Expresiones de tipos IV
d)

Punteros
Si T es una expresin de tipo, Pointer (T) es una expresin de tipo que es un puntero a un objeto de tipo T. Ej.: Var p: ^fila; p es de tipo: pointer (fila)

e)

Funciones
Si T1 y T2 son expresiones de tipos, entonces T1 T2 es la expresin de tipos de una funcin que toma argumentos de T1 y los transforma en T2 Function f (a, b : Char) : ^Integer; f tiene el tipo: (char x char) pointer (Integer)

Comprobacin de tipos. Procesadores de Lenguaje II

Representacin de tipos
En el lenguaje que implementa el compilador
Estructura especial de tabla de smbolos

Representaciones de expresiones de tipos


Representacin en rbol x char char pointer Integer

Representacin en Grafo dirigido acclico x char pointer Integer

Comprobacin de tipos. Procesadores de Lenguaje II

Representacin de tipos
Ejemplo representacin constructores de tipos
typedef struct{ char nombre[20]; char apellido[20]; int edad;} TipoPersona;

TipoPersona
x x x nombre array 0..19 char apellido x array 0..19 char x edad int

Comprobacin de tipos. Procesadores de Lenguaje II

Ciclos en la representacin de tipos


Representaciones recursivas
Representacin no cclica
Nodo = record x x dato integer x siguiente pointer Nodo Nodo = record x x x dato integer siguiente pointer

Representacin cclica

Comprobacin de tipos. Procesadores de Lenguaje II

Representacin de tipos
Representacin tabular
Si se definen tipos nuevos, preciso TS para aadirlos Ej.:
int a; float **b; float *c[10] int f(char,float,int); Tabla Smbolos
Id. a b c f Tipo 0 4 5 8

Tabla Tipos
Nm . 0 1 2 3 4 5 6 7 8 Tipo entero real caracter puntero puntero array pr. cart. pr. cart. funcin Tam/ Tipo1 4 8 1 1 1 10 2 6 7 1 3 3 1 0 0 Tipo Base

Comprobacin de tipos. Procesadores de Lenguaje II

Representacin de tipos
Tipos declarados y tipos annimos
struct{ char nombre[20]; char apellido[20]; int edad;} e1; char[20] n1; typedef struct{ char nombre[20]; char apellido[20]; int edad;} tipoPersona; typedef char[20] cadena; tipoPersona e2; cadena n2;

Tipos annimos

x x x nombre array apellido x array

Tipos declarados
x edad int

0..19 char

0..19 char

Comprobacin de tipos. Procesadores de Lenguaje II

Sistemas de tipos
Sistema de tipos: conjunto de reglas para asignar expresiones de tipos a construcciones de un programa
VAR x: RECORD p_real: real; p_imag: real; END; VAR y: RECORD p_imag: real; p_real: real; END; x=y; INCORRECTO x.p_real=y.p_imag; CORRECTO

Un comprobador de tipos implanta un sistema de tipos Se pueden implementar en la definicin dirigida por la sintaxis

Comprobacin del sistema de tipos

Esttica: Aquella que es realizada por el compilador antes de la ejecucin del programa Dinmica: Aquella que es realizada al ejecutar el programa objeto

Comprobacin de tipos. Procesadores de Lenguaje II

Comprobacin esttica y dinmica


Sistema de tipos seguro (sound type): no necesita comprobar dinmicamente errores de tipos Lenguajes fuertemente tipificados: garantizan que los programas que aceptan se ejecutarn sin errores de tipo Algunas comprobaciones slo pueden ser dinmicas:
Tabla: array[0..255] of Char; i: Integer; << se asigna valor a i >> Tabla [i] := 3; El compilador no puede garantizar estticamente que el valor de la variable i no exceda los lmite del array tabla Polimorfismo en lenguajes OO

Comprobacin de tipos. Procesadores de Lenguaje II

Tablas de Smbolos I
Recogen las diferentes declaraciones (explcitas) del programa
Declaraciones de constantes (nombre, tipo, valor,)
const int SIZE=20

Declaraciones de variables (nombre, tipo, direccin,)


Tabla TS; int var[SIZE];

Declaraciones de funciones (nombre, tipos, direccin,)


int buscar (int* vector);

Declaraciones de tipos (nombre, tipo, tamao,)


typedef struct Tabla{ {char* nombre; int contador; Tabla* siguiente; }

Comprobacin de tipos. Procesadores de Lenguaje II

Tablas de Smbolos II
Estructura de Datos para almacenar identificadores definidos en el programa
Se utiliza en diferentes fases del anlisis y sntesis Funciones de insercin, bsqueda y eliminacin Solucin habitual con tabla de hash
Optimizacin del compilador
Identificador aux Hashing ndices 0 1 2 N-1
a temp aux

Registros

Lista elementos

Almacena la informacin de inters: tipo, direccin en memoria,

Comprobacin de tipos. Procesadores de Lenguaje II

Tablas de Smbolos III


Ej.:
int a,b; float c,d; char e,f;
NOMBRE a b c d e f TIPO Entero Entero Real Real Caracter Caracter TAMAO 4 4 8 8 1 1 DIRECCIN 100 104 112 120 121 122

Dos usos en la verificacin semntica


En la declaracin de una variable no hay colisiones (buscar e insertar) El uso de una variable, es el esperado segn su tipo (buscar)

Comprobacin de tipos. Procesadores de Lenguaje II

Tablas de Smbolos IV
Gestin de mbitos en la tabla se smbolos
Los lenguajes con estructura de bloques permiten declaraciones en distintos mbitos, se puede dar anidamiento
{ int x = 0; foo(x); { int x = 1; bar(x); } baz(x); }

Idea (variable x declarada en un bloque):


Al aadir la definicin de x en un nuevo mbito, ocultar las definiciones previas (sin eliminar) Al salir del bloque, eliminar esta definicin de x y restaurar las anteriores

Lectura hacia atrs de la tabla

Comprobacin de tipos. Procesadores de Lenguaje II

Tablas de Smbolos V
Tablas para estructuras registro
Los registros tienen campos con desplazamiento fijo typedef struct cplx{ cplx.real double real; cplx.imag double imag; }; Tabla Tipos cplx a, b;
Nm . 0 1 Tipo real pr. cart. 4 0 0 base de cplx desplaz. campo imag

Tam/ Tipo1

Tipo Base

Tabla Smbolos
Id. a b Tipo 1 1 direccin 100 116

Tabla Registros
Nombre real imag Tipo 0 0 direccin 0 8

Un Comprobador de Tipos Sencillo


Un lenguaje sencillo Comprobacin de tipos en expresiones Comprobacin de tipos en proposiciones Comprobacin de tipos de funciones

Comprobacin de tipos. Procesadores de Lenguaje II

Un lenguaje sencillo I
Ejemplo de lenguaje, con todos los identificadores declarados antes de uso
Objetivo: comprobar el tipo de toda expresin

Tipos del lenguaje


Tipos bsicos
Char Integer Error_Tipo

Tipos complejos
Array[n] of T es de tipo array (T, 1..n) ^T es de tipo pointer (T)

Comprobacin de tipos. Procesadores de Lenguaje II

Un lenguaje sencillo II
Gramtica del lenguaje
P Ds E P Ds E Ds Ds D ;; Ds || D Ds D D id :: T id T T T char || integer || array [num] of T || ^T char integer array [num] of T ^T E literal || num || id || E mod E || E [[ E ]] || E^ E literal num id E mod E E E E^ D es cada declaracin T es el tipo E es la expresin

Comprobacin de tipos. Procesadores de Lenguaje II

Un lenguaje sencillo III


Acciones semnticas de construccin de tipos
P Ds E P Ds E Ds Ds D ;;Ds D Ds Ds Ds D D id ::T id T T T char char T T integer integer T0 T0 ^T11 ^T T0 T0 array [num] of T11 array [num] of T

{{aadeTipo (id.entrada, T.tipo) }} aadeTipo (id.entrada, T.tipo) {{T.tipo := char }} T.tipo := char {{T.tipo := integer }} T.tipo := integer {{T0.tipo := pointer (T1.tipo) }} T0.tipo := pointer (T1.tipo) {{T0.tipo := array(1..num.val, T0.tipo := array(1..num.val, T1.tipo) }} T1.tipo)

Comprobacin de tipos. Procesadores de Lenguaje II

Un lenguaje sencillo IV
Acciones semnticas de verificacin de tipos en expresiones
Constantes E E literal literal E E num num Identificadores E E id id Operadores E E E mod E E mod E {{E.tipo := Char }} E.tipo := Char {{E.tipo := Integer }} E.tipo := Integer {{E.tipo := buscaTipo (id.entrada) }} E.tipo := buscaTipo (id.entrada) {{if (E1.tipo = Integer) and if (E1.tipo = Integer) and (E2.tipo = Integer) (E2.tipo = Integer) E0.tipo = Integer E0.tipo = Integer else E0.tipo = Error_Tipo }} else E0.tipo = Error_Tipo

Comprobacin de tipos. Procesadores de Lenguaje II

Un lenguaje sencillo V
Acciones semnticas de verificacin de tipos en expresiones
Arrays E E E [[E ]] E E {{if (E1.tipo = Integer) and if (E1.tipo = Integer) and (E2.tipo = array(s, t) (E2.tipo = array(s, t) )) E0.tipo = tt E0.tipo = else E0.tipo = Error_Tipo }} else E0.tipo = Error_Tipo

Punteros E E E^ E^ {{if (E1.tipo = pointer(t)) if (E1.tipo = pointer(t)) E0.tipo = tt E0.tipo = else E0.tipo = Error_Tipo }} else E0.tipo = Error_Tipo

Comprobacin de tipos. Procesadores de Lenguaje II

Ejemplo Verificacin Tipos


a: array [10] of ^char b: char b=a[4 mod 3] ^
D id : T TS
a cpa b c

(a)
array [ T ]
n

cpa

of ^

T T

cp

(10)

num

char

Comprobacin de tipos. Procesadores de Lenguaje II

Ejemplo Verificacin Tipos


a: array [10] of ^char b: char b=a[4 mod 3] ^
S id = E E ]
n

TS

a cpa

b c

(b)
id [ E

E
cp

(a)

mod E

(1)

num

(1)

num

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos en sentencias
Por defecto, una sentencia es de tipo nulo (vaco), salvo si es errnea Proposiciones if y while
S S S S S S S S id := E id := E if E then S if E then S {{if (id.tipo = E.tipo) then S0.tipo = vaco if (id.tipo = E.tipo) then S0.tipo = vaco else S0.tipo := Error_Tipo }} else S0.tipo := Error_Tipo {{if (E.tipo = boolean) then S.tipo = S1.tipo if (E.tipo = boolean) then S.tipo = S1.tipo else S0.tipo := Error_Tipo }} else S0.tipo := Error_Tipo

while E do S {{if (E.tipo = boolean) then S.tipo = S1.tipo while E do S if (E.tipo = boolean) then S.tipo = S1.tipo else S0.tipo := Error_Tipo }} else S0.tipo := Error_Tipo S ;;S S S {{if (S1.tipo = vaco) and (S2.tipo = vaco) if (S1.tipo = vaco) and (S2.tipo = vaco) then S0.tipo = vaco then S0.tipo = vaco else S0.tipo := Error_Tipo }} else S0.tipo := Error_Tipo

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos en sentencias
Ampliar G para permitir declaracin de funciones T T
Ej.:

T T T T

{{T0.tipo = T1.tipo T0.tipo = T1.tipo

T2.tipo }} T2.tipo

int f(double x, char y) { ... } tipo de f: double x char int tipos argum. tipo devolucin

Llamada a la funcin, con parmetros E E E ((E )) E E {{if (E2.tipo = s) and (E1.tipo = ss t) t) if (E2.tipo = s) and (E1.tipo = then E0.tipo = tt then E0.tipo = else E0.tipo := Error_Tipo }} else E0.tipo := Error_Tipo

Comprobacin de tipos. Procesadores de Lenguaje II

Conversiones de tipos
Algunos operadores pueden aplicarse a operandos de distintos tipos (promocin o coercin): x+y ? Si el tipo de x es double y el de y int, tipo resultado? (afecta al cdigo a generar)
E E E op E E op E {{if (E1.tipo = Integer) and if (E1.tipo = Integer) and (E2.tipo = Integer) then E0.tipo = Integer (E2.tipo = Integer) then E0.tipo = Integer else if (E1.tipo = Integer) and else if (E1.tipo = Integer) and (E2.tipo = real) then E0.tipo = real (E2.tipo = real) then E0.tipo = real else if (E1.tipo = real) and else if (E1.tipo = real) and (E2.tipo = Integer) then E0.tipo = real (E2.tipo = Integer) then E0.tipo = real else if (E1.tipo = real) and else if (E1.tipo = real) and (E2.tipo = real) then E0.tipo = real (E2.tipo = real) then E0.tipo = real else E0.tipo = tipo_error} else E0.tipo = tipo_error}

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos sobrecargados I
Algunos operadores y funciones pueden tener distintos significado segn su contexto:
(4 + a) y (4+a) son expresiones distintas en Java No siempre es posible resolver slo con los operandos cuando hay promocin automtica:
function * (k,j: integer) return integer function * (x,y: real) return real Hay sobrecarga en Ada y en C++, no en C y Pascal * Puede tener los tipos posibles:
integer x integer integer x integer integer real

real real x real As: 3.1*5 pasa a ser 3.1*(real)5 3*5 es ambiguo: puede ser integer o real: (real)3 * (real) 5 i en la expresin 2*(3*5) tiene tipo (i*i) en la expresin z*(3*5) tiene tipo (r*r) r

Verificaciones de larga distancia

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos sobrecargados II
Tipado sobrecargado: si permite que las construcciones tengan ms de un tipo
Procedure swap(var x,y:anytype): plantilla (template)

La sobrecarga permite varias declaracions del mismo nombre El extremo es una declaracin para cualquier tipo:

Se generalizan las verificaciones para considerar conjuntos de tipos posibles de una expresin:

Ejemplo DDS E E E E E E E E id id

Se supone que la tabla de smbolos puede contener el conjunto de posibles tipos El tipo conjunto vaco se asimila con tipo_error Problema similar a la inferencia de tipos

{{E.tipos=E.tipos} E.tipos=E.tipos} {{E.tipos=consulta(id.entrada)} E.tipos=consulta(id.entrada)} {E0.tipos= {t ||existe un {E0.tipos= {t existe un tal que ss tal que tipo ssen E2.tipos tipo en E2.tipos t, con tten E1.tipos} t, con en E1.tipos}

E ((E )) E E

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos sobrecargados III


Algunos lenguajes, como Ada, obligan a que una expresin finalmente tenga un tipo nico, sino es un error Se introducen un nuevo atributo: unico
E E E E E E id id {{E.tipos:=E.tipos E.tipos:=E.tipos E.unico:= if E.tipos={t} then tt E.unico:= if E.tipos={t} then else tipo_error} else tipo_error} {{E.tipos:=consulta(id.entrada)} E.tipos:=consulta(id.entrada)} {E0.tipos:= {s ||existe un tipo ssen {E0.tipos:= {s existe un tipo en E2.tipos tal que ss s est en E1.tipos s est en E1.tipos E2.tipos tal que t=E0.unico t=E0.unico S= {s tal que ssen E2.tipos yyss tten E1.tipos} S= {s tal que en E2.tipos en E1.tipos} E2.unico:=if S== {s} then {s}, else tipo_error E2.unico:=if S== {s} then {s}, else tipo_error E1.unico:=if S== {s} then ss t, else tipo_error }} E .unico:=if S== {s} then t, else tipo_error
1

E0 E1 ((E2 )) E0 E1 E2

Implementacin en dos pasadas para evaluar tipos y unico

Comprobacin de tipos. Procesadores de Lenguaje II

Tipos sobrecargados IV
Ej.: a: cplx; a=3 + 4 * 1.2 *, + sobrecargados: int x int int real x real real cplx x cplx cplx

P D S T cplx

atributos: tipos, unico ?

(a)

id :

(a)

id = E

(3)

E+ E

(4)

E * E

(1.2)

Evaluacin combinada en dos pasadas


Atributo heredado: tipo Atributo sintetizado: esReal, valor

Comprobacin de tipos. Procesadores de Lenguaje II

Ejemplo (promocin en expresiones):


real real S::=E E::=E / E | num | num.num E 2.5 cierto

E v=2.5 cierto

Sentencia: 5/2/1.0 Resultado: 2.5 No en Java/C (2.0)

real

E v=1.0 cierto num . num v=1.0 / E E v=5.0 v=2.0 1.0 falso falso num num v=5 v=2 2 5 real

/ E v=2.5 falso

Comprobacin de tipos. Procesadores de Lenguaje II

Equivalencia de tipos
Aspecto esencial en las verificaciones semnticas Dos posibilidades bsicas:

La equivalencia de nombres considera cada nombre de un tipo La equivalencia de nombres considera cada nombre de un tipo como un tipo distinto, de modo que dos expresiones de tipo como un tipo distinto, de modo que dos expresiones de tipo tienes equivalencia de nombres si yyslo si son idnticas tienes equivalencia de nombres si slo si son idnticas Con la equivalencia estructural, los nombres se sustituyen por las Con la equivalencia estructural, los nombres se sustituyen por las expresiones de tipos que definen. Dos expresiones de tipos son expresiones de tipos que definen. Dos expresiones de tipos son estructuralmente equivalentes si yyson idnticas al sustituidos los estructuralmente equivalentes si son idnticas al sustituidos los tipos por sus expresiones de tipo correspondientes tipos por sus expresiones de tipo correspondientes

Comprobacin de tipos. Procesadores de Lenguaje II

Equivalencia estructural I
Dos expresiones de tipos son estructuralmente equivalentes si son el mismo tipo bsico o se forman aplicando el mismo constructor de tipos a expresiones de tipos estructuralmente equivalentes
integer es equivalente a integer pointer (integer) es equivalente a pointer (integer)

Las expresiones estructuralmente equivalentes se corresponden con rboles o grafos acclicos iguales

Comprobacin de tipos. Procesadores de Lenguaje II

Equivalencia estructural II
Algoritmo para comprobar la equivalencia estructural:
Function Equivale (s, t) ::boolean Function Equivale (s, t) boolean if ssyyttson del mismo tipo bsico then return true if son del mismo tipo bsico then return true else if ss= array(s1,,ss ))and tt= array (t1,,tt ))then else if = array(s1 22 and = array (t1 22 then return Equivale (s1,,tt ))and Equivale (s2,,tt )) return Equivale (s1 11 and Equivale (s2 22 else if ss= ss xxss and tt= tt xxtt then else if = 11 22 and = 11 22 then return Equivale (s1,,tt ))and Equivale (s2,,tt )) return Equivale (s1 11 and Equivale (s2 22 else if ss= pointer (s1))and tt= pointer (t1))then else if = pointer (s1 and = pointer (t1 then return Equivale (s1,,tt )) return Equivale (s1 11 else if ss= ss 2 and = 1 2 then else if = 11 ss2and tt= tt1 tt2then return Equivale (s1,,tt ))and Equivale (s2,,tt )) 11 and Equivale (s2 22 return Equivale (s1 else return false else return false Algunas comprobaciones pueden relajarse (arrays)

Comprobacin de tipos. Procesadores de Lenguaje II

Nombres de expresiones de tipos I


Algunos lenguajes permiten nombrar tipos
Type enlace = ^nodo; Type enlace = ^nodo; Var siguiente ::enlace; Var siguiente enlace; ultimo: enlace; ultimo: enlace; pp::^nodo; ^nodo; q, rr::^nodo; q, ^nodo;

Tienen igual tipo las variables siguiente, ultimo, p, q, r?


depende de la implementacin

Un lenguaje puede forzar el uso de tipos nombrados:


record x: pointer to real y:array[10] of int end t1=pointer to real t2=array[10] of int t3=record x:t1 y:t2 end

Comprobacin de tipos. Procesadores de Lenguaje II

Equivalencia de nombres
Algoritmo para comprobar la equivalencia de nombres:
Function Equivale (s, t) ::boolean Function Equivale (s, t) boolean if ssyyttson del mismo tipo bsico then return true if son del mismo tipo bsico then return true else if ssy ttson nombres de tipo else if y son nombres de tipo if son iguales return true if son iguales return true else return false else return false

Comprobacin de tipos. Procesadores de Lenguaje II

Equivalencia de nombres
Solucin ms comn en lenguajes imperativos
Ms restrictiva, ms fcil de implementar
typedef struct{ char nombre[20]; char apellido[20]; int edad;} cliente; void registrar (cliente*p){...} empleado e; registrar(&e); //error
x x x nombre array apellido x array edad x int

typedef struct{ char nombre[20]; char apellido[20]; int edad;} empleado;

0..19

char

0..19

char

Das könnte Ihnen auch gefallen