TP1

Commentaires générals

Le rapport

Lorsque vous rendez un rapport de tp, il est de bon goût d'inscrire vos noms et groupes lisiblement sur la première page. En ce qui concerne le code source, pensez à fournir l'ensemble de fichiers que vous avez modifié. De plus pour ne pas pauser de problèmes de compatibilité, il serai bien de dire sous quel environnement vous avez développer votre TP (50% des tp ne compile pas du premier coup sur ma machine ...)

Le code

En ce qui concerne l'archive :

tar -zcvf nom_archive.tar.gz Repertoire
Les options (les lettres après le tiret) correspondent à comprésser (z), faire une archive (c), écrire ce qui est fait (v : verbose), dans le fichier (f). Pour plus d'informations, utiliser les page du manuel (man tar) . Dans votre archive : les fichier sources *.ads *.adb de vos sources, vos testes, et aussi des tps d'avant (typiquement : l'analyseur que vous avez utilisé). Comme ça quand je reçoit une archive, je la décompresse, je copie les fichiers communs (sans écraser les votre) dans le répertoire, et ça compile.

Pour le nom du répertoire, quelque chose comme Login1_Login2_tpX, par exemple Combes_Vanderha_tp2

Notation

Pour les tps que j'ai corrigé, j'ai facilement donnée la moyenne, par exemple même si la fonction ne marche pas, j'ai donné les points pour les commentaires, les explications, et même parfois les tests ;) Mais le mieux quand vous avez une fonction qui ne marche pas, c'est de le voir et de le dire !
D'une copie à l'autre la comparaison est difficile, j'ai essayer de suivre au mieux mon barème pour faire le moins d'écart non justifiés.

Les erreurs récurrentes

Oublie de vérifier Coin_HG dans Est_present : dans ce cas, dès qu'une partie de l'âne rouge couvre la case (3,1) l'état est trouvé gagnant.

__________________________
|  ___   _________   ___  |
| |   | |         | |   | |
| |   | |_________| |   | |
| |   |  ___   ___  |   | |
| |   | |   | |   | |   | |
| |___| |___| |___| |___| |
|  ___   _________   ___  |
| |   | |         | |   | |
| |   | |         | |   | |
| |   | |         | |   | |
| |   | |         | |   | |
| |___| |_________| |___| |
|  ___               ___  |
| |   |   1     2   |   | |
| |___|             |___| |
|______             ______|
        |           |      
Bravo, coup gagnant en 0 coups !
Alors que la partie ne devrai pas être fini.

Essayer de factoriser votre code : moins de lignes pour plus de cas.

case NP is
    when Carre1 =>
        begin
            if PiecesAVoir(Carre1)/=0 then
                Occupation(Pos.L,Pos.C).N:=Carre1;
                Occupation(Pos.L,Pos.C).Coin_HG:= Pos;
                PiecesAVoir(Carre1):=PiecesAVoir(Carre1)-1;
            else
                raise ErreurConfig;
            end if;
        end;
    when Carre2 =>
      begin
        if PiecesAVoir(Carre2)/=0 then 
            if (Occupation(Pos.L,Pos.C+1).N = Trou
                and Occupation(Pos.L+1,Pos.C).N = Trou
                and Occupation(Pos.L+1,Pos.C+1).N = Trou) then
                Occupation(Pos.L,Pos.C).N := Carre2;
                Occupation(Pos.L,Pos.C).Coin_HG:= Pos;
                Occupation(Pos.L,Pos.C+1).N := Carre2;
                Occupation(Pos.L,Pos.C+1).Coin_HG := Pos;
                Occupation(Pos.L+1,Pos.C).N := Carre2;
                Occupation(Pos.L+1,Pos.C).Coin_HG := Pos;
                Occupation(Pos.L+1,Pos.C+1).N := Carre2;
                Occupation(Pos.L+1,Pos.C+1).Coin_HG := Pos;
                PiecesAVoir(Carre2):=PiecesAVoir(Carre2)-1;
                else
                  raise ErreurConfig;
              end if;
            else
                  raise ErreurConfig;
            end if;
          end;
.
.
.
devient
            if PiecesAVoir(NP)/=0 then
                for I in Pos.L .. Pos.L+Hauteur(NP)-1 loop
                    for J in Pos.C .. Pos.C+Largeur(NP)-1 loop
                        if Occupation(I,J).N /= Trou then
                            raise ErreurConfig ;
                        end if ;
                    Occupation(I,J):=(NP,Pos) ;
            else
                  raise ErreurConfig;
            end if;

Les tests

Faites des tests, mais les bons. En générale dire "on regarde si ça marche sur un exemple : ça marche" ne sert à rien. Il faut trouver les tests pertinents qui entrent dans chacune des parties de vos fonctions. Si vous faites 50 cas (if, cases ... ) faites 50 tests, un pour ces chacun des cas.
Vous comprendrez vite qu'il vaut mieux réduire le nombre de cas pour faire moins de tests avant d'arriver à une fonction dont on est "sûr".