Escolar Documentos
Profissional Documentos
Cultura Documentos
Tipo de Dados
Linguagens e Paradigmas de Programação
2
Registro
3
Registro: Definição
COBOL define registro por números de nível
01 EMPLOYEE-RECORD.
02 EMPLOYEE-NAME.
05 FIRST PICTURE IS X(20). 20 Caracteres
05 LAST PICTURE IS X(20).
02 HOURLY-RATE PICTURE IS 99V99. Decimal: ??,??
5
Registro: Definição
● Java e C# usam classes como registros
● C, C++ e C# possuem o tipo struct
● C++: struct é uma pequena variação de classe
● Declaração aninhada de registros em C/C++ (e outras)
employee = { employee = {
name = { name : {
first = “Pedro”, first : “Pedro”,
middle = “Alvares”, middle : “Alvares”,
last = “Cabral”, last : “Cabral”,
}, },
hourlyRate = 12.20 hourlyRate : 12.20
} } 7
Referenciando os Campos
● Em geral, usa-se a notação de ponto, começando com as estruturas
mais externas até chegar no campo
○ Employee_Record.Employee_Name.first
8
Operações sobre Registros
● Na atribuição, geralmente os dois tipos devem ser iguais
● Ada permite a comparação de registros (Go?)
● C realiza a cópia de memória entre registros
○ Cuidado com ponteiros!
10
Operações sobre Registros
01 REGISTRO-01. 01 REGISTRO-02.
02 NAME. 02 NAME.
05 FIRST PICTURE IS X(20). 05 LAST PICTURE IS X(20).
05 LAST PICTURE IS X(20). 05 FIRST PICTURE IS X(20).
02 HOURLY-RATE PICTURE IS 99V99. 02 EMPLOYEE-NUMBER PICTURE IS 99.
02 EMPLOYEE-NUMBER PICTURE IS 99. 02 NET-PAY PICTURE IS 99V99.
struct Person {
char name[32]; Delocamento: 0 (zero)
int age; Delocamento: 32
char address[32]; Delocamento: 36
};
Obs: a disciplina de Software Básico detalha melhor a definição de estrutura 12
Registro: Implementação
struct Person {
char name[32]; Delocamento: 0 (zero)
int age; Delocamento: 32
char address[32]; Delocamento: 36
};
13
Array VS Registro
16
União
18
Tipo União
● A variável armazena diferente tipos de valores em
diferentes momentos da execução
○ Alocar memória suficiente
100 101 102 103
union exemplo { ue
char c; 100 101 102 103
int i; ue.c
}; 100 101 102 103
19
Tipo União
● Exemplo: linguagens dinâmicas podem utilizar union para
representar variáveis
21
Uniões Livres
● C e C++ não proveem uma forma de verificar o tipo em
uniões
int i;
short s;
union exemplo { union exemplo var;
short curto;
int inteiro; var.string[0] = 'u';
var.string[1] = 'v';
char string[10]; var.string[2] = 'a';
}; var.string[3] = '\0';
i = var.inteiro;
s = var.curto;
22
Uniões Discriminadas
● Para garantir a verificação de tipo, algumas linguagens
incluem um identificador
23
Uniões Discriminadas: Ada
type Shape is (Circle, Triangle, Rectangle);
fig : Figure(Rectangle);
fig := (
Filled => True,
Color => Blue,
Form => Rectangle,
Side1 => 12,
Side2 => 3
);
26
Tipo Ponteiro
● As variáveis do tipo ponteiro têm como valores:
○ A faixa de endereço de memória
○ Ou um valor nil (ou null)
29
Ponteiro para Registro
● C/C++ usam duas notações struct Person {
○ (*ptr).field char name[32];
int age;
○ ptr->field
char address[32];
● Ada e Go possuem };
derreferenciação implícita
○ O '.' é usando tanto para registro com struct Person *p;
para ponteiro p = malloc(sizeof(struct Person));
p->age = 28;
(*p).age = 28;
30
Problema com Ponteiros
● Dangling Reference
○ Ponteiro mantém referência para uma área de memória que já foi desalocada
int *ptr;
int *vet = malloc(1024);
ptr = vet;
free(vet);
ptr[2] = 3; // ????
31
Problema com Ponteiros
● Dangling Reference
32
Problema com Ponteiros
● Dangling Reference
○ A área de memória foi realocada para outra variável
● Vazamento de memória
int *vet = malloc(1024);
● Área de memória alocada e que
vet = malloc(1024);
não é mais acessível por nenhuma free(vet);
variável (ponteiro)
34
Ponteiros em C/C++
● Flexíveis, pois podem apontar para qualquer
variável, independentemente de onde ela foi alocada
(pilha, head, global)
○ De fato, pode apontar para qualquer lugar da memória
○ Nota: Ada permite que os ponteiros apontem somente para
o heap
● Operador '*' para derreferenciação do ponteiro e '&'
para recuperar o endereço de uma variável
35
Ponteiros em C/C++
int main() {
int *ptr;
int var = 10;
ptr = &var;
???
ptr = var;
return 0;
}
36
Ponteiros em C/C++
● Permite a realização de aritmética com ponteiros
○ Semântica diferente de números
void run(Incremento f) {
● Permite apontar para funções int v = 100;
v = f(v);
}
int main() {
Incremento f = dobro;
run(f);
}
38
Tipo Referência
● Similar a um ponteiro, mas está associado com valores em memória
e objetos, não endereços
● Em C++, referência é um ponteiro constante, geralmente usado em
parâmetro de funções e métodos
○ Implicitamente derreferenciado
○ Deve ser inicializado na definição int result = 0;
○ Utiliza o símbolo '&' na definição int &ptr = result;
● Java usa referência não constantes para objetos
ptr = 3;
result = 5;
39
Verificação
de Tipo
40
Verificação de Tipo
● Verificação garante que as operações e os operandos são
compatíveis
○ Compatível → é legal segundo o operador ou é legal converter implicitamente de
acordo com as regras da linguagem
41
Tipagem Forte
● Uma linguagem é fortemente tipada se os erros de tipos são sempre
detectados
42
Tipagem Forte
● Java e C#: mais fortes que C/C++, mas cast explícito pode gerar erros
43
Equivalência de Tipos
● Compatibilidade de tipos define quais tipos são aceitáveis para as operações
● Para tipos escalares as regras são simples e rígidas, mas para tipos
estruturados ou definidos pelo usuários, as regras podem ser complexas
○ Como fazer coerção nos tipos estruturados?
44
Resumo
● Tipo Registro
● Tipo União
○ Uniões Livres
○ Uniões Discriminadas
● Tipo Ponteiro
○ Tipo Referência
● Verificação de Tipo
45