Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra...
-
Upload
adriana-valente-padilha -
Category
Documents
-
view
217 -
download
3
Transcript of Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra...
Sistemas Operativos
Paulo MarquesDepartamento de Eng. InformáticaUniversidade de [email protected]
2006
/200
7
Breve Introdução àLinguagem C
2
Bibliografia
C How to Program, 5th Editionby Deitel & Associates Prentice Hall, August 2006 ISBN 0132404168
The C Programming Language, 2nd Editionby Kernighan & RitchiePrentice Hall, March 1988 ISBN 0131103628
3
Cálculo de uma Raíz Quadrada
Qual o algoritmo para calcular a raiz quadrada de um número x?
x 49y0 20
n y0 201 11.2252 7.7951283 7.0405534 7.0001175 76 77 7
)(21
nnn y
xyy
“Mét
odo
Bab
ilóni
co”
4
Programa de Cálculo da Raíz Quadrada
5
Compilar e Executar
$ gcc –Wall raiz.c –o raiz$ ./raiz
6
Notas
#include <stdio.h> Inclui a biblioteca “stdio” (Standard IO)
#define ERRO_MAXIMO 0.0001 Definição de uma constante
Inexistência de classes As funções (métodos) existem directamente no ficheiro
Controlo de fluxo de execução / tipos Semelhante ao Java
main() / printf() main() Função principal do programa e seu ponto de
entrada printf() Permite escrever dados para o ecrã
7
Tipos de Dados Básicos
O tamanho de cada tipo de dados varia de plataforma para plataforma. sizeof(datatype) Retorna o tamanho, em bytes do tipo
de dados
8
Controlo de Fluxo de Execução
9
Tabelas
double pessoas[10]; Cria uma tabela de 10 elementos do tipo double na stack Acesso como em Java (pessoas[i]) O tamanho é pré-definido e fixo!
double matrix[3][3];
0 1 2 3 4 5 6 7 8 9pessoas
matrix [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2]
10
Pequeno exemplo com tabelas simples
11
Notas
As tabelas quando são declaradas têm de indicar o tamanho dos dados que vão conter! Para ultrapassar esta limitação tem de se utilizar ponteiros
(mais sobre isso daqui a pouco…)
scanf(“%d”, &variavel_int) Lê do teclado um inteiro scanf(“%lf”, &variavel_double) Lê do teclado um
double O & representa o endereço da variável destino. Isto é, um
ponteiro(mais sobre isso daqui a pouco…)
media = 0.0; desvio_padrao = 0.0;
Inicialização EXPLÍCITA de variáveis!!! O C não inicializa as variáveis automaticamente.
12
Strings
char nome[6] = “JORGE”;
A tabela tem de conter 6 elementos: Cinco para os caracteres: ‘J’, ‘O’, ‘R’, ‘G’, ‘E’ Um para o terminador da string: ‘\0’
char nome[] = “JORGE”; char nome[] = { ‘J’, ‘O’, ‘R’, ‘G’, ‘E’, ‘\0’ }; char* nome = “JORGE”;
Funções úteis: #include <string.h> strcpy(), strncpy(), strcmp(), strncmp(), strcat(), strncat(),
strstr(), strchr(), sprintf()
13
Ponteiros (1)
Um ponteiro representa um endereço de memória, permitindo aceder a outras variáveis ou buffers explicitamente reservados
int* ptr; ptr é um ponteiro para uma variável inteira ptr é o ponteiro (endereço) em si *ptr valor apontado por ptr
&var representa o endereço da variável var
NULL ponteiro nulo (não aponta para nada)
14
Exemplo Simples – Notação
// Um inteiroint idade = 20;
// Um ponteiro para um inteiroint* ptrIdade = NULL;// Uma atribuição...ptrIdade = &idade;
// Acesso à idade original...printf(“%d”, *ptrIdade);
“20”idade (0x5490)
0ptrIdade (0x6000)
0x5490ptrIdade (0x6000)
// Acesso à idade original...*ptrIdade = 30;
“30”idade (0x5490)
(Nota para a versão impressa: este slide contém uma uma animação em que o 20 originalmente em idade passa a 30)
15
Quiz
16
Alocação dinâmica de memória
As tabelas têm de ter um tamanho fixo Para resolver esse problema, utiliza-se:
Alocação dinâmica de memória Ponteiros
void* malloc(size_t total_size) Reserva total_size size bytes retornando um ponteiro para
a zona de memória reservada. É necessário converter o ponteiro retornado num ponteiro
“real”
void free(void* ptr) Liberta a zona de memória apontada por ptr,
anteriormente reservada
17
Exemplo de uso de memória dinâmica
Notas: Muitas vezes é possível utilizar os ponteiros como se fossem tabelas,
assim como usar tabelas como se fossem ponteiros Ao utilizar ponteiros como tabelas, o compilador gera o código para
aceder correctamente aos valores apontados pelos índices. Exemplo: tabela[i] é equivalente a *((char*) tabela + sizeof(double)*i)
Ao utilizar-se um ponteiro directamente, fazendo-se aritmética com o mesmo, os avanços são em múltiplos do tipo de dados base. Exemplo: tabela[2] é equivalente a *(tabela+2), que é sensivelmente equivalente a *((char*) tabela + sizeof(double)*i) (na verdade é um “bug” subtil…)
18
Passagem de parâmetros por referência
Por vezes é necessário ter funções cujos argumentos sejam passados por referência…
Função que trocadois valores passadoscomo argumento
Função que calcula os quadrados deelementos passados numa tabela, porreferência
19
CUIDADO
Nunca retornar referências para memória reservada na stack!!!!
20
Possível solução
Existem outras soluções possíveis (e até mais seguras)… Qual é o problema desta abordagem?
21
Estruturas
Uma estrutura permite agrupar a informação em blocos Há diferentes formas de o fazer, todas equivalentes
Original
Abreviada
Mais prática
22
Estruturas e Ponteiros
Quando se utilizam estruturas e ponteiros, existe um operador especial de acesso: ->
É equivalente escrever: ptrPessoa->nome ou (*ptrPessoa).nome
23
Mais um exemplo de ponteiros…
Uma lista ligada é uma estrutura de dados que permite armazenar um número arbitrário de elementos não pré-definidos
Consiste num encadear de elementos, em que cada elemento possui um ponteiro para o próximo elemento
30list
value next
20value next
10value next
NULL
24
Programa (Parte I)
25
Programa (Parte II)
NOTA: É muito mais fácil adicionar “à cabeça” do que no final da lista! TODO:
Implementar as funções: remove_list(), remove_element(), is_present() A memória não está a ser liberta no final do programa!!!
26
Leitura e Escrita básica de disco
Existem dois tipos de leitura e escrita: Baixo nível: open()/close()/read()/write() Alto nível: fopen()/fclose()/fprintf()/fscanf()/fread()
27
write_random_int_file()
28
print_int_file()
29
» Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning « Winston Churchill