Cherchez l'erreur : access check failed.

Cherchez l'erreur : access check failed. - Ada - Programmation

Marsh Posté le 28-02-2011 à 12:22:56    

Bonjour,
J'écris un petit programme qui redistribue un montant équitablement entre les utilisateur.
Bon, mis à par que mon algo principale n'est peut-être pas le meilleur, j'ai un problème d'initialisation de pointeur sur une chaîne de caractère.
 
A l'appel de "Print" pour une 'donation', après appel à "Balance", procédure dans laquelle je construit un tableau de 'Donation' , à l'exécution j'ai droit à un "acces check failed" sur la ligne 8 du code de "print".
 
Quelques définition :

Code :
  1. type User_Type is
  2.      record
  3.         Id  : access String;
  4.         Sum : Float := 0.0;
  5.      end record;
  6. type User_Access is access all User_Type;
  7.  
  8. type Donation_Type is
  9.      record
  10.         Source  : access String;
  11.         Target  : access String;
  12.         Sum     : Float := 0.0;
  13.      end record;
  14.   type Donation_Access is access all Donation_Type;


 

Code :
  1. procedure Create(User : out User_Access;
  2.                    Id   : in  String;
  3.                    Sum  : in Float) is
  4.   begin
  5.  
  6.      User := new User_Type ' (Id => new String ' (Id),
  7.                               Sum => Sum);
  8.   end Create;


Code :
  1. procedure Add(User : in User_Access;
  2.                 To   : in out Users_Access) is
  3.      Temp : Users_Access;
  4.   begin
  5.  
  6.      if (To /= null) then
  7.         Temp := new Users_Table(1..To'Length + 1);
  8.      else
  9.         Temp := new Users_Table(1..1);
  10.      end if;
  11.      if (To /= null) then
  12.         for Index in 1..To'length loop
  13.            Temp(Index) := To(Index);
  14.         end loop;
  15.      end if;
  16.      Temp(Temp'Length) := User;
  17.      To := Temp;
  18.   end Add;


Code :
  1. procedure Create(Donation : out Donation_Access;
  2.                    Source   : access String;
  3.                    Target   : access String;
  4.                    Sum      : in Float) is
  5.   begin
  6.      if ((Source = null) or (Target = null)) then
  7.         raise Donation_Error;
  8.      end if;
  9.      Donation := new Donation_Type ' (Source,
  10.                                       Target,
  11.                                       Sum);
  12.   end Create;


Code :
  1. procedure Print (Donation : in Donation_Access) is
  2.   begin
  3.  
  4.      if (Donation /= null) then
  5.         raise Donation_Error;
  6.      end if;
  7.      New_Line;
  8.      Put_line("Source : " & Donation.Source.all);
  9.      Put_line("Target : " & Donation.Target.all);
  10.      Put     ("Sum    : " );
  11.      Put(Donation.Sum);
  12. end Print;


Code :
  1. function Total(Users : in Users_Table) return Float;


Code :
  1. procedure Balance(Users     : in Users_Table;
  2.                     Donations : out Donations_Access) is
  3.      Total_Sum : Float := Total(Users);
  4.      Equi_Sum : Float := Total_Sum/Float(Users'Length);
  5.      Donate : Float;
  6.      Temp : Donations_Access;
  7.   begin
  8.      New_Line;
  9.      Put("Equi_Sum : " );
  10.      Put(Equi_Sum);
  11.      New_Line;
  12.      for Index in reverse Users'Range loop
  13.         exit when Users(Index).Sum < Equi_Sum;
  14.         Donate := Users(Index).Sum - Equi_Sum;
  15.         Put(Users(Index).Id.all);
  16.         Put(" donate : " );
  17.         Put(Donate);
  18.         New_Line;
  19.         while Donate > 0.0 loop
  20.            for Ki in 1..Index-1 loop
  21.               Put(" to " );
  22.               if Users(Ki).Sum < Equi_Sum then
  23.                  Put(Users(Ki).Id.all);
  24.                  Put(" the sum : " );
  25.                  Put(Equi_Sum - Users(Ki).Sum);
  26.                  if Donations = null then
  27.                     Temp := new Donations_Table(1..1);
  28.                     Create(Temp(1),
  29.                            Users(Index).Id,
  30.                            Users(Ki).Id,
  31.                            Equi_Sum - Users(Ki).Sum);
  32.                     New_Line;
  33.                     Put("init temp" );
  34.                     New_Line;
  35.                  else
  36.                     Temp := new Donations_Table(1..Donations'Length + 1);
  37.                     Create(Temp(Temp'length),
  38.                            Users(Index).Id,
  39.                            Users(Ki).Id,
  40.                            Equi_Sum - Users(Ki).Sum);
  41.                     New_Line;
  42.                     Put("Add temp" );
  43.                     New_Line;
  44.                  end if;
  45.                  Donate := Donate - (Equi_Sum - Users(Ki).Sum);
  46.                  Free(Donations);
  47.                  Donations := Temp;
  48.               end if;
  49.               New_Line;
  50.            end loop;
  51.         end loop;
  52.      end loop;
  53. end Balance;


 
J'arrive pas à trouver l'erreur.  :(

Reply

Marsh Posté le 28-02-2011 à 12:22:56   

Reply

Marsh Posté le 28-02-2011 à 13:37:42    

J'ai oublié de copier le tableau de tab N à tab N + 1;

Reply

Marsh Posté le 28-02-2011 à 13:49:33    

Mais en fait, c'est ça qui couine.
Dans print...

Code :
  1. if (Donation /= null) then
  2.            raise Donation_Error;
  3.         end if;


 
Je ne sais pas comment j'ai pu mettre "/=" au lieu de "="  :lol:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed