Upload
lavinia-cabral-barbosa
View
215
Download
0
Embed Size (px)
Citation preview
Transparência 1
Estruturas de Dados - T.332
Capítulo 3Parte 2:
Alocação Dinâmica de Memória
Transparência 2
3.1 As Funções de Alocação Dinâmica de Memória em "C"
Já visto até agora:Já visto até agora: ConstantesConstantes são " são "codificadascodificadas" dentro do código " dentro do código
objeto de um programa em tempo de compilação.objeto de um programa em tempo de compilação. Variáveis globais Variáveis globais ((estáticasestáticas) têm a sua alocação ) têm a sua alocação
codificada em tempo de compilação e são codificada em tempo de compilação e são alocadas logo que um programa inicia a execução.alocadas logo que um programa inicia a execução.
Variáveis locais Variáveis locais em funções (ou em funções (ou métodosmétodos) são ) são alocadas através da requisição de espaço na pilha alocadas através da requisição de espaço na pilha ((stackstack).).
Alocação Dinâmica Alocação Dinâmica é um meio pelo qual o é um meio pelo qual o programa pode obter memória enquanto programa pode obter memória enquanto está em execução.está em execução.
Transparência 3
Programa:Programa:#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
aabb
10010101...10010101...
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
Sist.OperacionalSist.Operacional
HeapPointerInício da ÁreaAlocável
StackPointerInicio da Pilha
Topo da Memória
Base da Memória
P r o g r a m a
Variáveis estáticas
Código objeto
Constantes
Transparência 4
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
aabb
10010101...
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
Sist.Operacional
HeapPointerInício da ÁreaAlocável
StackPointerInicio da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
Transparência 5
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
Transparência 6
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3localAlocalB
Transparência 7
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3localAlocalB
Transparência 8
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3&main-#3localAlocalAlocalBlocalB
&func_B-#2&func_B-#2local1local1local2local2
Transparência 9
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3&main-#3localAlocalAlocalBlocalB
&func_B-#2&func_B-#2local1local1local2local2
Transparência 10
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3localAlocalB
Transparência 11
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3&main-#3localAlocalAlocalBlocalB
&func_B-#3&func_B-#3local1local1local2local2
Transparência 12
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3&main-#3localAlocalAlocalBlocalB
&func_B-#2&func_B-#2local1local1local2local2
Transparência 13
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
&main-#3localAlocalB
Transparência 14
Programa:Programa:
#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;
int func_A ()int func_A (){{ int local1, local2;int local1, local2;
- - - - - - }}void func_B ()void func_B (){ {
int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();
}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}
Sist.OperacionalSist.Operacional
"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..
10010101...10010101...
aabb
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
Transparência 15
Alocação Dinâmica em "C" A memória alocada pelas funções de A memória alocada pelas funções de
alocação dinâmica é obtida do alocação dinâmica é obtida do heapheap.. O O heapheap é a região de memória livre que se é a região de memória livre que se
encontra entre o programa (com a área de encontra entre o programa (com a área de armazenamento permanente) e a pilha (armazenamento permanente) e a pilha (stackstack).).
O tamanho do heap é, a princípio, desconhecido O tamanho do heap é, a princípio, desconhecido do programa.do programa.
"C" possui duas funções básicas para "C" possui duas funções básicas para gerência de memória:gerência de memória: malloc(malloc(nº de bytesnº de bytes)) - aloca memória. - aloca memória. free(free(endereçoendereço)) - libera memória- libera memória
Transparência 16
Função malloc(): Protótipo: Protótipo: void *malloc(size_t void *malloc(size_t número_de_bytesnúmero_de_bytes););
DetalhesDetalhes : : Devolve um ponteiro do tipo Devolve um ponteiro do tipo voidvoid (sem tipo) para o início (sem tipo) para o início
(1º byte) da área de memória alocada.(1º byte) da área de memória alocada. Isto significa que o valor deste ponteiro pode ser Isto significa que o valor deste ponteiro pode ser
atribuído a qualquer variável do tipo ponteiro.atribuído a qualquer variável do tipo ponteiro. Para isto deve ser utilizado sempre um Para isto deve ser utilizado sempre um typecastingtypecasting. .
Ex.: se Ex.: se xx é ponteiro para inteiro então explicitar isto com é ponteiro para inteiro então explicitar isto comx = x = (int *)(int *) malloc( sizeof(int) ); malloc( sizeof(int) );
número_de_bytesnúmero_de_bytes é a quantidade de bytes alocada. é a quantidade de bytes alocada. Se a memória for alocada no topo do heap, o Se a memória for alocada no topo do heap, o
heapPointerheapPointer é atualizado (incrementado de é atualizado (incrementado de número_de_bytesnúmero_de_bytes).).
O tipo O tipo size_tsize_t é é definido em definido em stdlib.hstdlib.h. .
Transparência 17
Exemplo:Exemplo:
#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>
char char *p;*p;int int *q;*q;
main ()main (){{
p = p = (char *)(char *) malloc(1000); malloc(1000); // Aloca 1000// Aloca 1000 // bytes de RAM// bytes de RAM
q = q = (int *) (int *) malloc(50*sizeof(int));malloc(50*sizeof(int)); // Aloca espaço// Aloca espaço // para 50 inteiros. // para 50 inteiros.
}} Sist.OperacionalSist.Operacional
10010101...10010101...
ppqq
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
1000 bytes1000 bytes
50*int = 200 bytes50*int = 200 bytes
Transparência 18
malloc devolve:malloc devolve: um ponteiro para a área alocadaum ponteiro para a área alocada o ponteiro nulo (NULL) caso o ponteiro nulo (NULL) caso
não seja possível alocar a não seja possível alocar a memória requisitada.memória requisitada.
Convém verificar se foi pos-Convém verificar se foi pos-sível alocar a memória:sível alocar a memória:
#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>char char *p;*p;main ()main (){{ ................................
p = malloc(1000)p = malloc(1000) // Tenta alocar 1000// Tenta alocar 1000 // bytes de RAM// bytes de RAM
if (p == NULL)if (p == NULL) // Testa se p // Testa se p // diferente de 0// diferente de 0printf("Sem memória.");printf("Sem memória.");
}}
Sist.OperacionalSist.Operacional
"Sem memória""Sem memória"
10010101...10010101...
pp
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Variáveis estáticas
Código objeto
Constantes
Já alocado antesJá alocado antes
Espaço de variáveis Espaço de variáveis locais alocadolocais alocado
Transparência 19
Função free: Protótipo: Protótipo:
void free( void *p );void free( void *p ); DetalhesDetalhes : :
Devolve memória previamente alocada ao sistema.Devolve memória previamente alocada ao sistema. A memória devolvida é aquela que foi alocada com um A memória devolvida é aquela que foi alocada com um
ponteiro com o valor de ponteiro com o valor de pp.. O valor de O valor de pp deve ser um valor que foi alguma vez retornado por deve ser um valor que foi alguma vez retornado por
malloc(). malloc(). Não é possível alocar-se um vetor enorme e depois dealocar-se a Não é possível alocar-se um vetor enorme e depois dealocar-se a
parte dele que "sobrou". parte dele que "sobrou". A utilização de A utilização de freefree() com um valor de ponteiro qualquer () com um valor de ponteiro qualquer
poder ter resultados catastróficos.poder ter resultados catastróficos. A gerência de A gerência de buracosburacos no heap é responsabilidade do no heap é responsabilidade do
sistema operacional.sistema operacional.
Transparência 20
Exercício: Lista com um vetor de Ponteiros para Strings.
Uma lista ordenada pode conter Strings de Uma lista ordenada pode conter Strings de qualquerqualquer comprimento < 10000.comprimento < 10000.
Esta lista tem número de elementos máximo fixo = 100 e é Esta lista tem número de elementos máximo fixo = 100 e é implementada como um implementada como um vetor de ponteiros para Stringsvetor de ponteiros para Strings.. Utilize as rotinas de lista com vetor que você utilizou para Utilize as rotinas de lista com vetor que você utilizou para
a agenda.a agenda. Um novo String é lido primeiramente para dentro de uma Um novo String é lido primeiramente para dentro de uma
variável auxiliar qualquer.variável auxiliar qualquer. Então é alocada memória para exatamente o seu Então é alocada memória para exatamente o seu
tamanho e ele é copiado para esta área. Para copiar um tamanho e ele é copiado para esta área. Para copiar um String utilize String utilize strcpy()strcpy()..
Por fim um lugar na lista é encontrado para ele. A posição Por fim um lugar na lista é encontrado para ele. A posição escolhida do vetor de ponteiros da lista é instanciada escolhida do vetor de ponteiros da lista é instanciada através da atualização dos valores do ponteiro da posição através da atualização dos valores do ponteiro da posição do string na lista com o endereço do string.do string na lista com o endereço do string.
Transparência 21
Modelagem da estrutura
-1012341
Lista com Vetor de Ponteiros
Strings lidosdo usuário e alocados no Heap
S a b ã o \0
C o n s t i t u i r \0
Transparência 22
Modelagem da Lista
Pseudo-código:Pseudo-código:constantes Maxlista = 100;constantes Maxlista = 100;
tipo Lista {tipo Lista {caractercaracter **dados[Maxlista];dados[Maxlista];“ “ Vetor de ponteiros para char “Vetor de ponteiros para char “inteiro inteiro ultimo;ultimo;
};};
Importante: Observe que criando uma variável do Importante: Observe que criando uma variável do tipo Lista você não vai estar alocando memória para tipo Lista você não vai estar alocando memória para os strings a serem lidos, apenas para os ponteiros os strings a serem lidos, apenas para os ponteiros para eles.para eles.
Transparência 23
Organização de Organização de memória do memória do Exercício:Exercício:
Sist.OperacionalSist.Operacional
10010101...10010101...
HeapPointerTopo da ÁreaAlocável
StackPointerTopo da Pilha
Topo da Memória
Base da Memória
Vetor de char*
Código objeto
Constantes
str4str4str3str3str2str2str1str1
Espaço de variáveis Espaço de variáveis locais alocadolocais alocado
Var.Estáticas
Transparência 24
Para verificar o comprimento de um String:Para verificar o comprimento de um String: Utilize a função strlen().Utilize a função strlen(). Esta função devolve o comprimento (em caracteres Esta função devolve o comprimento (em caracteres
imprimíveis) de um String.imprimíveis) de um String. Protótipo: Protótipo: int strlen(char *p);int strlen(char *p);
#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <sting.h>#include <sting.h>
char char p[90] = "Carro";p[90] = "Carro";main ()main (){{
printf("%i", strlen(p) );printf("%i", strlen(p) );}}
Imprime: 5.Imprime: 5.
Transparência 25
Para copiar um String:Para copiar um String: Utilize a função Utilize a função strcpystrcpy().(). Esta função copia o conteúdo de um string (dado por um Esta função copia o conteúdo de um string (dado por um
apontador) para a posição de memória dada por outro apontador.apontador) para a posição de memória dada por outro apontador. Protótipo: Protótipo:
char *strcpy(char *destino, *fonte);char *strcpy(char *destino, *fonte);
#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <sting.h>#include <sting.h>
char char p[90] = "Carro";p[90] = "Carro";charchar lata[20];lata[20];main ()main (){{
strcpy(lata, p) );strcpy(lata, p) );printf("s%", lata);printf("s%", lata);
}}
Imprime: Carro.Imprime: Carro.
Transparência 26
Detalhes: Lista Ordenada com um vetor de
ponteiros para Strings. Como você não sabe o comprimento do String que o usuário vai Como você não sabe o comprimento do String que o usuário vai
digitar, use primeiro uma variável auxiliar grande (10000 digitar, use primeiro uma variável auxiliar grande (10000 posições) para guardar o que foi digitado.posições) para guardar o que foi digitado.
A lista deve ser passada como parâmetro para todas as funções A lista deve ser passada como parâmetro para todas as funções que a utilizam. que a utilizam.
Da mesma maneira as variáveis de controle da lista.Da mesma maneira as variáveis de controle da lista. Todas as funções de lista ordenada implementadas Todas as funções de lista ordenada implementadas
anteriormente devem ser reimplementadas para utilizar estes anteriormente devem ser reimplementadas para utilizar estes Strings.Strings.
Para a leitura de um String utilize Para a leitura de um String utilize scanf("%s", entrada) scanf("%s", entrada) onde onde char entrada[10000]char entrada[10000]..
Transparência 27
Exercício Nº 2: Trabalho com Passagem de Parâmetros Agora você vai fazer um programa que manipula mais de Agora você vai fazer um programa que manipula mais de
uma lista. uma lista. O programa fará isto com O programa fará isto com um únicoum único conjunto de funções e conjunto de funções e
passagem das diversas listas como parâmetros.passagem das diversas listas como parâmetros. Como aplicação imaginemos um Como aplicação imaginemos um sistema de contabilidadesistema de contabilidade
simples.simples. Você vai ter um Plano de Contas constituído por duas Você vai ter um Plano de Contas constituído por duas
listas: listas: débitos débitos ee créditos créditos.. O mesmo conjunto de funções (que você já implementou) O mesmo conjunto de funções (que você já implementou)
vai poder ser utilizado para isso: você somente precisa vai poder ser utilizado para isso: você somente precisa ampliar o conjunto de parâmetros da função para passar ampliar o conjunto de parâmetros da função para passar por referência também a lista que você quer alterar. por referência também a lista que você quer alterar. A passagem de parâmetro da lista A passagem de parâmetro da lista devedeve ser por referência porque ser por referência porque
você deseja que as alterações sejam você deseja que as alterações sejam persistentespersistentes..
Transparência 28
Modelagem de um Lancamento
Cada lista de débitos ou créditos é constituida Cada lista de débitos ou créditos é constituida de um lançamento. O lançamento possui:de um lançamento. O lançamento possui: Um valor real (positivo).Um valor real (positivo). Um nome, por exemplo “pagar proteção à Mafia”Um nome, por exemplo “pagar proteção à Mafia”
Estrutura:Estrutura:
tipo Lancamento {tipo Lancamento {
caractercaracter **nome;nome; ““ponteiro para char alocado no heap“ponteiro para char alocado no heap“real real valor; valor;
};};
Transparência 29
Modelagem de um tipo Lista para Débitos ou Créditos Pseudo-código:Pseudo-código:
constantes Maxlista = 100;constantes Maxlista = 100;
tipo ListaContabil {tipo ListaContabil {LancamentoLancamento dados[Maxlista];dados[Maxlista];“ “ Vetor de Estrutura Lançamento “Vetor de Estrutura Lançamento “inteiro inteiro ultimo;ultimo;
};};
ImportanteImportante: Observe que criando um vetro de lancamentos, : Observe que criando um vetro de lancamentos, você não vai estar reservando memória para os você não vai estar reservando memória para os nomesnomes destes, destes, pois o campo nome é só ponteiros. Lembre-se de alocar.pois o campo nome é só ponteiros. Lembre-se de alocar.
Transparência 30
Usando (pseudo código) Crie variáveis globais:Crie variáveis globais:
ListaContabilListaContabil debitos, creditos;debitos, creditos; Passe estas variáveis como parâmetro por Passe estas variáveis como parâmetro por
referência:referência:adiciona(adiciona(&&debitos, nomeLanc, valorLanc)debitos, nomeLanc, valorLanc)
Cabeçalho:Cabeçalho:Inteiro FUNÇÃO adiciona(Inteiro FUNÇÃO adiciona(ListaContabil *ListaContabil *plano;plano;
caracter caracter **nome;nome; real valor)real valor)
Importante: nome é passado como ponteiro para Importante: nome é passado como ponteiro para caracter. Use um buffer global para ler o nome do caracter. Use um buffer global para ler o nome do lancamento do usuário.lancamento do usuário.
Transparência 31
Desenho
-1012341
Lista de debitos ou de créditos com Vetor de Estruturas do tipoLançamento
Strings lidosdo usuário e alocados no Heap
S a b ã o \0
P a s s a g e n s \0
R$ 5,00
R$ 505,00
Transparência 32
Usando (código C) Referencie diferentemente se estiver usando Referencie diferentemente se estiver usando
ponteiros para a lista ou a lista diretamente:ponteiros para a lista ou a lista diretamente:ListaContabil debitos, creditos;ListaContabil debitos, creditos;
debitos.dados[2].valor = 5.0;debitos.dados[2].valor = 5.0;strcpy(debitos.dados[2].nome, buffer);strcpy(debitos.dados[2].nome, buffer);
Dentro das funções:Dentro das funções:Suponha: Suponha: ListaContabil ListaContabil **ponteiroponteiro ee ponteiro = &debitos; ponteiro = &debitos;
ponteiro->dados[2].valor = 5.0;ponteiro->dados[2].valor = 5.0;strcpy(ponteiro->dados[2].nome, buffer);strcpy(ponteiro->dados[2].nome, buffer);
Transparência 33
Headerfile: Como Garantir Inclusão Única
/* Arquivo: pilha.h *//* Arquivo: pilha.h */#ifndef EstruturaDaPilha #ifndef EstruturaDaPilha #define EstruturaDaPilha #define EstruturaDaPilha /* Definir uma estrutura para a pilha */ /* Definir uma estrutura para a pilha */ struct estruturaDaPilhastruct estruturaDaPilha { { int topo; int topo; int dados[MaxPilha];int dados[MaxPilha]; };}; /* Def. um tipo que tem a estrutura da pilha. */ /* Def. um tipo que tem a estrutura da pilha. */ typedef struct estruturaDaPilha pilha; typedef struct estruturaDaPilha pilha; #endif #endif
Transparência 34
Headerfiles: Importante A diretiva de compilação A diretiva de compilação #ifndef#ifndef (if not defined) diz que (if not defined) diz que
aquela área de código fonte entre o aquela área de código fonte entre o #ifndef#ifndef e o e o #endif#endif somente será levada em conta pelo compilador se o somente será levada em conta pelo compilador se o argumento de argumento de #ifndef#ifndef ainda não houver sido definido na ainda não houver sido definido na mesma sessão de compilação no escopo de um módulo. mesma sessão de compilação no escopo de um módulo.
Isso garante que código que a gente "por via das duvidas" Isso garante que código que a gente "por via das duvidas" inclui mais de uma vez em um modulo não seja considerado inclui mais de uma vez em um modulo não seja considerado duas vezes. duas vezes.
Um exemplo de como isto e útil esta na diretiva Um exemplo de como isto e útil esta na diretiva #include#include <stdio.h> que esta presente tanto em <stdio.h> que esta presente tanto em pilha.hpilha.h como em como em pilha.cpilha.c como em como em aplic.caplic.c. .
Como Como aplic.caplic.c carrega carrega pilha.hpilha.h "para dentro" de si mesmo, "para dentro" de si mesmo, carregara também carregara também stdio.hstdio.h. Como está explicitamente . Como está explicitamente também carregando também carregando stdio.hstdio.h, se não houver uma diretiva , se não houver uma diretiva #ifndef#ifndef em em stdio.hstdio.h, ele terá o mesmo código existente em , ele terá o mesmo código existente em stdio.hstdio.h duas vezes. duas vezes.
Transparência 35
Projetos de Implementação: Usando Make
MakeMake: : Utilitário que auxilia a Utilitário que auxilia a compilação de projetos formados por compilação de projetos formados por vários arquivos de programasvários arquivos de programas
Realiza checagem de dependências Realiza checagem de dependências entre o arquivo destino e os fontesentre o arquivo destino e os fontes
Baseia-se nas datas de arquivosBaseia-se nas datas de arquivos
Transparência 36
Projetos de Implementação: Sintaxe do Makefileaplicaplic: : aplic.o pilha.oaplic.o pilha.o
gcc -g -o aplic aplic.o pilha.ogcc -g -o aplic aplic.o pilha.o
aplic.oaplic.o: : aplic.c pilha.haplic.c pilha.hgcc -g - c aplic.cgcc -g - c aplic.c
pilha.opilha.o: : pilha.c pilha.hpilha.c pilha.hgcc -g -c pilha.cgcc -g -c pilha.c
metameta: : dependencia1 dependênciaNdependencia1 dependênciaN<tab><tab>um comando para atingir meta um comando para atingir meta <tab><tab>outro comando para atingir metaoutro comando para atingir meta
Transparência 37
Projetos de Implementação: Usando o Makefile Chamada:Chamada:make -f <nome do Makefile>make -f <nome do Makefile> Se o nome não for dado, make procurará por arquivos Se o nome não for dado, make procurará por arquivos
chamados chamados MakefileMakefile e e makefilemakefile, nesta ordem., nesta ordem. Para definir qual meta será a primeira a ser Para definir qual meta será a primeira a ser
considerada:considerada: Se você não diz nada, a primeira meta será Se você não diz nada, a primeira meta será
considerada.considerada. Voce pode passar como último parâmetro o nome da Voce pode passar como último parâmetro o nome da
meta:meta:make -f meuMakefile compilarmake -f meuMakefile compilar
Todas as dependencias de Todas as dependencias de compilarcompilar, se esta meta existir, , se esta meta existir, serão também levadas em consideração.serão também levadas em consideração.
Transparência 38
Módulo lista.c:Módulo lista.c:
#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include “lista.h”#include “lista.h”
lista *criaLista ()lista *criaLista (){{ lista *nova;lista *nova; nova = malloc( sizeof(lista) );nova = malloc( sizeof(lista) ); nova->max = 30;nova->max = 30; nova->ultimo = -1;nova->ultimo = -1; return (nova);return (nova);}}void destroiLista(lista *morta)void destroiLista(lista *morta){ { // Libera memória p/os strings// Libera memória p/os strings for (i=0; morta->ultimo; i++)for (i=0; morta->ultimo; i++)
free (morta->elemento[i]);free (morta->elemento[i]); // Libera memória da lista// Libera memória da lista free ( morta );free ( morta );}}
Módulo lista.h:Módulo lista.h:
#ifndef Lista#ifndef Lista#define Lista#define Lista
typedef struct estruLista {typedef struct estruLista {char *elemento[30];char *elemento[30];intint ultimo;ultimo;int int max;max;
};};
typedef struct estruLista lista;typedef struct estruLista lista;
#endif#endif