(New page: {{TOCright}} == The Problem (in Portuguese) == <p>Considere quatro ficheiros <tt> <span style="color: #990000">recurs.cpp</span></tt> (contendo a função <tt> <span style=...) |
|||
Line 1: | Line 1: | ||
{{TOCright}} | {{TOCright}} | ||
== The Problem (in Portuguese) == | == The Problem (in Portuguese) == | ||
− | <p>Considere quatro ficheiros <tt> <span style="color: #990000">recurs.cpp</span></tt> (contendo a função <tt> <span style="color: #990000">factrecurs</span> </tt>), <tt> <span style="color: #990000">recurs.h</span> </tt> (contendo a declaração da função <tt> <span style="color: #990000">factrecurs</span>),</tt> <tt> <span style="color: #990000">iter.cpp</span> </tt> (contendo a função <tt> <span style="color: #990000">factiter</span> </tt>), <tt> <span style="color: #990000">iter.h</span> </tt> (contendo a declaração da função <tt> <span style="color: #990000">factiter</span>)</tt> e <tt> <span style="color: #990000">main.cpp</span></tt> (contendo a função <tt> <span style="color: #990000">main</span></tt> que invoca sequencialmente ambas as funções anteriores e que inclui <tt> <span style="color: #990000">recurs.h</span> </tt> e <tt> <span style="color: #990000">iter.h</span> </tt>).</p> | + | <p>Considere quatro ficheiros <tt> <span style="color: #990000">recurs.cpp</span></tt> (contendo a função <tt> <span style="color: #990000">factrecurs</span> </tt>), <tt> <span style="color: #990000">recurs.h</span> </tt> (contendo a declaração da função <tt> <span style="color: #990000">factrecurs</span>),</tt> <tt> <span style="color: #990000">iter.cpp</span> </tt> (contendo a função <tt> <span style="color: #990000">factiter</span> </tt>), <tt> <span style="color: #990000">iter.h</span> </tt> (contendo a declaração da função <tt> <span style="color: #990000">factiter</span>)</tt> e <tt> <span style="color: #990000">main.cpp</span></tt> (contendo a função <tt> <span style="color: #990000">main</span></tt> que invoca sequencialmente ambas as funções anteriores e que inclui <tt> <span style="color: #990000">recurs.h</span> </tt> e <tt> <span style="color: #990000">iter.h</span> </tt>).</p> |
+ | # Construa, com estes cinco ficheiros, um projecto designado <strong>factorial</strong>, indicando os comandos para o colocar sob o controlo de versões do CVS. Admita que o repositório já existe em <tt> <span style="color: #990000">/cvs</span> </tt>. | ||
+ | # Construa uma <tt> <span style="color: #990000">Makefile</span></tt> para gerar o executável <tt> <span style="color: #990000">fact</span></tt>, a partir dos ficheiros anteriores. Indique os comandos necessários para colocar a <tt> <span style="color: #990000">Makefile</span> </tt> no repositório CVS. | ||
+ | # Considere agora que vai ter dois executáveis, cada um invocando a sua função. Indique as alterações à <span style="color: #990000"> <tt>Makefile</tt></span> para que passe a gerar os executáveis <tt> <span style="color: #990000">recurs</span></tt> e <tt> <span style="color: #990000">iter</span></tt>, utilizando ambos o mesmo ficheiro <tt> <span style="color: #990000">main.cpp</span></tt> (mas diferentes implementações do factorial). Indique as operações do CVS para criar a nova versão do projecto, assumindo que o projecto está checked-out no directório corrente. | ||
+ | # Considere uma nova versão do projecto: pretende-se construir um único executável <span style="color: #990000"> <tt>fact</tt></span>, mas a escolha da implementação do factorial é efectuada em tempo de execução. Considere que os ficheiros <tt> <span style="color: #990000">recurs.cpp</span> </tt> e <tt> <span style="color: #990000">recurs.h</span> </tt> existem num subdirectório <tt> <span style="color: #990000">recurs</span> </tt> e, analogamente, existe um directório <tt> <span style="color: #990000">iter</span> </tt> para a outra versão. Cada um dos conjuntos apresenta agora a mesma interface para a função que calcula o factorial: <tt> <span style="color: #990000">fact</span> </tt>. Construa duas bibliotecas dinâmicas, ambas designadas por <span style="color: #990000"> <tt>fact.so</tt></span>, cada uma em seu directório ( <tt> <span style="color: #990000">recurs/fact.so</span> </tt> e <tt> <span style="color: #990000">iter/fact.so</span></tt>). A selecção da variante a utilizar faz-se definindo a variável de ambiente <tt> <span style="color: #990000">LD_LIBRARY_PATH</span></tt> com o directório apropriado. Indique quais os ficheiros iniciais modificados, face à alínea anterior, a nova <tt> <span style="color: #990000">Makefile</span></tt> e os comandos CVS necessários para que o repositório passe a conter a nova versão. | ||
+ | # Modifique a alínea anterior para que o utilizador possa escolher a variante a utilizar através de um argumento na linha do comando <tt> <span style="color: #990000">fact</span></tt>, respectivamente <tt> <span style="color: #990000">recurs</span></tt> ou <tt> <span style="color: #990000">iter</span></tt>. Indique quais os ficheiros iniciais modificados, a nova <tt> <span style="color: #990000">Makefile</span></tt> e os comandos CVS necessários para registar a nova versão.</li> </ol> | ||
== Implementation == | == Implementation == | ||
The following sections present possible implementations. | The following sections present possible implementations. |
Considere quatro ficheiros recurs.cpp (contendo a função factrecurs ), recurs.h (contendo a declaração da função factrecurs), iter.cpp (contendo a função factiter ), iter.h (contendo a declaração da função factiter) e main.cpp (contendo a função main que invoca sequencialmente ambas as funções anteriores e que inclui recurs.h e iter.h ).
The following sections present possible implementations.