A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra 2006/2007 Breve Introdução à Linguagem C.

Apresentações semelhantes


Apresentação em tema: "Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra 2006/2007 Breve Introdução à Linguagem C."— Transcrição da apresentação:

1 Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra pmarques@dei.uc.pt 2006/2007 Breve Introdução à Linguagem C

2 2 Bibliografia C How to Program, 5th Edition by Deitel & Associates Prentice Hall, August 2006 ISBN 0132404168 The C Programming Language, 2nd Edition by Kernighan & Ritchie Prentice Hall, March 1988 ISBN 0131103628

3 3 Cálculo de uma Raíz Quadrada Qual o algoritmo para calcular a raiz quadrada de um número x? “Método Babilónico”

4 4 Programa de Cálculo da Raíz Quadrada

5 5 Compilar e Executar $ gcc –Wall raiz.c –o raiz $./raiz

6 6 Notas #include Inclui a biblioteca “stdio” (Standard IO) #define ERRO_MAXIMO0.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 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 8 Controlo de Fluxo de Execução

9 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]; 0123456789 pessoas  matrix  [0][0][0][1][0][2][1][0][1][1][1][2][2][0][2][1][2][2]

10 10 Pequeno exemplo com tabelas simples

11 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 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 strcpy(), strncpy(), strcmp(), strncmp(), strcat(), strncat(), strstr(), strchr(), sprintf()

13 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 14 Exemplo Simples – Notação // Um inteiro int idade = 20; // Um ponteiro para um inteiro int* ptrIdade = NULL; // Uma atribuição... ptrIdade = &idade; // Acesso à idade original... printf(“%d”, *ptrIdade); “20” idade (0x5490) 0 ptrIdade (0x6000) 0x5490 ptrIdade (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 15 Quiz

16 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 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 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 troca dois valores passados como argumento Função que calcula os quadrados de elementos passados numa tabela, por referência

19 19 CUIDADO Nunca retornar referências para memória reservada na stack!!!!

20 20 Possível solução Existem outras soluções possíveis (e até mais seguras)… Qual é o problema desta abordagem?

21 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 22 Estruturas e Ponteiros Quando se utilizam estruturas e ponteiros, existe um operador especial de acesso: -> É equivalente escrever: ptrPessoa->nome ou (*ptrPessoa).nome

23 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 30 list value next 20 value next 10 value next NULL

24 24 Programa (Parte I)

25 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 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 27 write_random_int_file()

28 28 print_int_file()

29 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


Carregar ppt "Sistemas Operativos Paulo Marques Departamento de Eng. Informática Universidade de Coimbra 2006/2007 Breve Introdução à Linguagem C."

Apresentações semelhantes


Anúncios Google