Aula 19: Definindo novos tipos e estruturas

Traduzido por Ana Paula Costa

Tipo

Por vezes é útil poder definir um novo tipo de variável que possa ser depois utilizado no programa. É útil para tornar o código mais legível, ou para evitar ter que se forçar muitas vezes o tipo. A definição de novos tipos de variáveis pode ser feito com a palavra typedef.
 
 typedef descrição nomedotipo

com nomedotipo o nome que queremos dar ao novo tipo e decrição qualquer um dos tipos de variável que aprendemos até agora, incluindo arrays, ponteiros e todos os tipos de variável simples.

Exemplos:

 typedef float real;
Isto pode ser útil para pessoas que estão acostumadas a programar em PASCAL. Após se escrever a linha de cima, podemos usar variáveis do tipo real, exactamente como em PASCAL. Variáveis do 'tipo' real serão traduzidas pelo compilador em variáveis do tipo float.

 typedef float floatarray[10];
Define um novo tipo de variável. O novo tipo é chamado floatarray e uma variável deste tipo será igual a um array de 10 floats.

De notar que a definição de um novo tipo não cria uma variável! Não reserva espaço em memória e não atribui um nome a uma variável. É apenas uma descrição de um tipo que será depois utilizado para declarar uma variável.
 

... definindo novas caixas para variáveis.

Utilizando um novo tipo

Após definir um tipo, podemos declarar variáveis desse tipo:
 
 nomedotipo nomevar

com nomevar o nome da nova variável e nomedotipo o tipo dessa variável, como foi descrito antes. Depois da declaração, podemos utilizar a variável tal como se tivesse sido declarada da forma normal.

Exemplos:
depois da declaração do novo tipo typedef float real; podemos usar
 real x;
Isto já se parece mais com PASCAL (em PASCAL seria "Var x: real")

 floatarray ra;
E no código podemos utilizar este array:
 ra[1] = 2.68;
Isto é equivalente a
 float ra[10];
 ra[1] = 2.68;


Mais exemplos

/* example with typedef */

/* definig a new type of variable: */
typedef int ra[6];
/* declare two global variables: */
ra x;
int y[7];

int AreEqual(ra r)
  /* Note that the definition can also be used for parameters */
{
  if (r[0]==r[1])
    return(1);
  else
    return(0);
}

void main()
{
  x[1] = 1;
  x[2] = 0;
  if AreEqual(x)
    printf("First two elements are equal");
  else
    printf("First two elements are different");
  y[1] = 1;
  y[2] = 0;
   /* The following instruction is bad code, because the type of value we pass to
      the function is different than the type of value the function expects: *\
  AreEqual(y);
}



#include <stdio.h>

typedef struct {
  hour, minute, second: integer;
} time;

void showtime(time t);
  /* Will show the time in format h:m:s */
{
  printf("%d:%d.%d\n", t.hour, t.minute, t.second);
}

void main()
{
 time atime;

 atime.hour = 23;
 atime.minute = 16;
 atime.second = 9;
 showtime(atime);
}


estrutura de estruturas:

typedef struct {
   int day, month, year;
} date;

typedef struct {
   int hour, minute, second;
} time;

typedef struct {
    time dattime;
    date datdate;
} dateandtime;

dateandtime x;

x.dattime.hour = 1;

x é uma variável do tipo dateandtime que é uma estrutura que contém dois campos. Um campo é dattime que é do tipo time. O outro campo é do tipo date. Um dos campos da estrutura time é hour que é um int.


Teste Rápido:
Para testar os conhecimentos sobre o que aprendeu nesta aula, prima aqui para fazer um teste on-line. De notar que este Não é o formato que será utilizado no teste final!

Peter Stallinga. Universidade do Algarve, 30 November 2002