next up previous contents
Next: Uniões Up: Tipos agregados e derivados Previous: Strings   Sumário


Estruturas

Através do conceito de estrutura, C oferece um mecanismo uniforme para a definição de registros, unidades de informação organizadas em campos de tipos que podem ser não-homogêneos. A definição de estruturas foi descrita na Seção 2.1.3.

Como um exemplo, esse mecanismo pode ser aplicado tanto a uma linha de código assembly, com campos associados a rótulo, código de operação, operandos e comentários, como a tabelas, com campos símbolo e valor. Considere a definição de uma entidade linha, composta por quatro componentes -- rotulo, opcode, operand, comment. Cada componente é um arranjo de caracteres de tamanho adequado à recepção de um dos campos das linhas de um programa assembly. Em uma estrutura C,

    #define LINSIZE 80
    #define LABSIZE 8
    #define OPCSIZE 10
    #define OPRSIZE 20
    #define CMTSIZE (LINSIZE-(LABSIZE+OPCSIZE+OPRSIZE))
    typedef struct linha {
        char rotulo[LABSIZE];
        char opcode[OPCSIZE];
        char operand[OPRSIZE];
        char comment[CMTSIZE];
    } Linha;

Variáveis deste tipo de estrutura podem ser definidas como

    Linha  l;

Apesar deste exemplo só ter como componentes seqüências de caracteres, qualquer tipo válido pode estar presente em uma estrutura -- até mesmo outra estrutura, como em

    struct linCode {
        int    posicao;
        Linha  linha;
    };

Usando essa estrutura Linha, uma versão simplificada da função getLabel usada na Seção 4.2.1 seria:

    char *getLabel(Linha linha) {
        char term;
        int pos;
        do {
          term = linha.rotulo[pos];
          if (term == ':' || term == ' ') {
             linha.rotulo[pos] = '\0';
             return(linha.rotulo);
          }
          ++pos;
        } while (pos < LABSIZ);
        linha.rotulo[pos] = '\0';
        return(linha.rotulo);
    }

Em aplicações sucessivas do operador . -- quando for necessário acessar estruturas aninhadas -- a associativadade é da esquerda para a direita.

Em situações onde há a necessidade de se minimizar o espaço ocupado por dados de um programa, pode ser preciso compartilhar uma palavra da máquina para armazenar diversas informações. Neste caso, é preciso trabalhar a nível de subseqüências de bits internas à representação de um número inteiro.

A forma básica de manipular bits em um inteiro seria através dos operadores bit-a-bit, trabalhando com máscaras e deslocamentos para isolar as informações individuais. Entretanto, a linguagem C suporta o conceito de campos de bits internos a um inteiro para facilitar este tipo de manipulação. Campos são baseados em estruturas.

Por exemplo, considere uma instrução de um dado dispositivo que está sendo programado em C. Cada instrução neste dispositivo têm um formato binário de codificação em quatro bits que especificam a operação, seguidos por dois campos de seis bits cada que especificam a fonte e o destino associados à operação dada. Com o uso de campos, uma variável poderia ser definida como

    struct {
        unsigned int opcode: 4;
        unsigned int fonte: 6;
        unsigned int dest: 6;
    } instrucao;

Campos são acessados exatamente da mesma forma que membros de estruturas, comportando-se como inteiros sem sinal.


next up previous contents
Next: Uniões Up: Tipos agregados e derivados Previous: Strings   Sumário
Ivan L. M. Ricarte 2003-02-14