Upload
internet
View
113
Download
0
Embed Size (px)
Citation preview
Modificadores de tipos e Arquivos
Curso de aprofundamento na linguagem C
Visibilidade e acesso Modificadores de tipos
Modo de acesso Tempo de vida Espaço de endereçamento
Classes de armazenamento Qualificadores de tipos
Classes de armazenamento Automatic (auto) Static Register Typedef Extern
Automatic Variáveis de escopo local Armazenamento na pilha Tipo default
Static Espaço de endereçamento estático
Pode ser acessado a qualquer momento no programa
Variáveis globais Modifica a classe de armazenamento Restrição de visualização
Static Pode ser aplicado a variáveis locais Variáveis locais com
armazenamento estático transformam-se em variáveis globais com visibilidade local
Static Pode ser aplicado a funções e
variáveis globais Restringe a visualização ao arquivo
fonte (.c)
Extern Classe de armazenamento externa Endereços desconhecidos em tempo
de compilação Resolvidas em tempo de link Declaração de globais inicializadas
externamente Pode ser utilizado em funções
Register Variáveis com armazenamento em
registradores Armazenamento sugerido Utilizada para otimizar laços Máquinas RISC Desuso por otimização
typedef Não é considerado um modificador
de classe de armazenamento nos compiladores modernos
Alias para tipos Declarações menores Aumento de portabilidade entre
sistemas
Qualificadores de tipo Influem no modo de acesso Restrições de modificação
const Restrições de otimização
volatile
const Restringe a modificação de variáveis
com este qualificador Não podem sofrer atualização Regra diferente para ponteiros Inicialização junto com definição Garantia pelo compilador que o
conteúdo da variável não vai ser modificado
const Área de memória read-only Modificação forçada leva a um
comportamento indefinido Pode ser aplicado a structs e unions Pode ser burlado e gerar erros de
execução Ver apostila
volatile Restrição de otimização do
compilador Variáveis que podem ser acessadas
e modificadas por processos concorrentes
Acesso a IO mapeado em memória
volatile/** Busy-wait function to read a byte from* device n.* check range of device number.* Wait until READY or ERROR* if no error, read byte, return it* otherwise reset error, return 0xffff*/unsigned int read_dev(unsigned devno){
struct devregs *dvp = DEVADDR + devno;
if(devno >= NDEVS) return(0xffff);
while((dvp->csr & (READY | ERROR)) == 0) ; /* NULL - wait till done */
if(dvp->csr & ERROR){ dvp->csr = RESET; return(0xffff); }
return((dvp->data) & 0xff);}
struct devregs{/* control & status */ unsigned short csr; /* data port */ unsigned short data;};
/* bit patterns in the csr */#define ERROR 0x1#define READY 0x2#define RESET 0x4
/* absolute address of the device */#define DEVADDR ((struct devregs *)0xffff0004)
/* number of such devices in system */#define NDEVS 4
volatile Memória de hardware mapeada em
structstruct devregs{ unsigned short volatile csr; unsigned short const volatile data;};
volatile struct devregs{ unsigned short csr; unsigned short const data;} *device;
struct devregs{ unsigned short csr; unsigned short const data;};
volatile struct devregs *device;
E/S baseada em arquivos Streams <stdio.h> Streams default
stdin stdout stderr
Operações com Arquivos Abertura/criação
Arquivos texto Arquivos binários
Leitura e Escrita Byte a byte Blocos Formatada
Acesso randômico/seqüencial
Abertura FILE *fopen(char *name, char *mode);
Modo R leitura W escrita A Concatenação B binário T texto (default)
Retorna NULL se falhar Checagem recomendada
Leitura e Escrita int fgetc(FILE *stream); int fputc(char c, FILE *stream); Char *fgets(char *s, int size, FILE
*stream); Int ungetc(int c, FILE*stream); Int fputs(const char *s, FILE
*stream);
Leitura e Escrita int fprintf(FILE *stream, const char
*format, ...); int fscanf(FILE *stream, const char
*format, ...);
Leitura e Escrita size_t fread(void *ptr, size_t size,
size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t
size, size_t nmemb, FILE *stream); int feof(FILE *stream);
Acesso randômico int fseek(FILE *stream, long offset,
int whence); SEEK_SET SEEK_END SEEK_CUR
long ftell(FILE *stream); void rewind(FILE *stream);
Exercício Escrever um array de estruturas
diretamente no arquivo e depois recuperá-lo e imprimir na tela