Estude o ciclo de desenvolvimento de aplicações em linguagem C no ambiente Unix (slide).
Copie o ficheiro aula1-eg1.tgz para a sua área de trabalho e descomprima o seu conteúdo com o comando:
tar -zxvf aula1-eg1.tgz
1. Geração do executável (slide)
a) Visualize e compreenda o conteúdo dos ficheiros.
b) Compile os ficheiros e faça a sua ligação de modo a produzir o executável denominado main.
gcc -g -c list.c main.c
gcc -o main list.o main.oc) Execute a aplicação main e compreenda o resultado.
2. Utilização do debugger ddd (slide)
a) Execute a aplicação no debugger ddd:
ddd mainb) Coloque um breakpoint na primeira instrução
lst_insert
e execute a aplicação pressionando o botão run. O que observa?c) Execute a aplicação utilizando os botões next e step. Qual é a diferença entre ambos?
3. Utilização da ferramenta make (slide)
a) Crie um ficheiro Makefile na sua área de trabalho com o conteúdo descrito no slide e execute make. O que aconteceu?
b) Apague o ficheiro list.o. Re-execute make. Interprete o sucedido.
c) Simule uma alteração ao ficheiro main.c com o comando seguinte e re-execute make. Compreenda o resultado.
touch main.c
1. Implemente a função lst_insert
do exemplo anterior que adiciona um valor no final da lista.
Sugestões:
lst_insert
e observe o conteúdo actual das variáveis.ddd main core
.
2. Implemente a função lst_print
do ficheiro list.c
que imprime o conteúdo de uma lista (inteiros separados por vírgulas). Utilizando
o ddd, verifique que a lista impressa pela função lst_print
corresponde ao conteúdo
efectivo da lista em memória.
3. Compreenda melhor o funcionamento do make.
a) Simule a alteração do ficheiro list.h e execute
make
. Porque razão todos os ficheiros foram gerados?b) Simule a alteração do ficheiro list.o. O que acontece quando faz
make list.o
? E se agora fizermake
?c) Retire a dependência do ficheiro list.h da regra list.o da Makefile. Repita procedimento da alínea a). Explique a diferença no resultado?
d) Adicione a regra seguinte no fim do ficheiro. O que descreve esta regra? Identifique: o alvo, as dependências e o comando.
clean: rm -f *.o maine) Execute
make clean
. O que aconteceu? Porque razão o comando é executado sempre que esta regra é invocada explicitamente?
4. Implemente as função lst_destroy
e lst_remove
. A função lst_destroy
liberta toda a memória alocada pela lista. A função lst_remove
recebe uma lista e um valor e remove
o primeiro item com aquele valor.
Gestor de tarefas pessoais
Construa uma aplicação de organização pessoal que permite gerir as tarefas pendentes de uma pessoa.
Cada tarefa:
A aplicação tem os seguintes comandos:
> nova <id-nova-tarefa> <prioridade>
> lista <prioridade>
> completa <id-nova-tarefa>