Profil supprimé  | 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 :
 type User_Type is       record          Id  : access String;          Sum : Float := 0.0;       end record; type User_Access is access all User_Type;   type Donation_Type is       record          Source  : access String;          Target  : access String;          Sum     : Float := 0.0;       end record;    type Donation_Access is access all Donation_Type; 
 
  |  
 
  
  Code :
 procedure Create(User : out User_Access;                     Id   : in  String;                     Sum  : in Float) is    begin         User := new User_Type ' (Id => new String ' (Id),                                Sum => Sum);    end Create; 
 
  |  
 
  Code :
 procedure Add(User : in User_Access;                  To   : in out Users_Access) is       Temp : Users_Access;    begin         if (To /= null) then          Temp := new Users_Table(1..To'Length + 1);       else          Temp := new Users_Table(1..1);       end if;       if (To /= null) then          for Index in 1..To'length loop             Temp(Index) := To(Index);          end loop;       end if;       Temp(Temp'Length) := User;       To := Temp;    end Add; 
 
  |  
 
  Code :
 procedure Create(Donation : out Donation_Access;                     Source   : access String;                     Target   : access String;                     Sum      : in Float) is    begin       if ((Source = null) or (Target = null)) then          raise Donation_Error;       end if;       Donation := new Donation_Type ' (Source,                                        Target,                                        Sum);    end Create; 
 
  |  
 
  Code :
 procedure Print (Donation : in Donation_Access) is    begin         if (Donation /= null) then          raise Donation_Error;       end if;       New_Line;       Put_line("Source : " & Donation.Source.all);       Put_line("Target : " & Donation.Target.all);       Put     ("Sum    : " );       Put(Donation.Sum); end Print; 
 
  |  
 
  Code :
 function Total(Users : in Users_Table) return Float; 
 
  |  
 
  Code :
 procedure Balance(Users     : in Users_Table;                      Donations : out Donations_Access) is       Total_Sum : Float := Total(Users);       Equi_Sum : Float := Total_Sum/Float(Users'Length);       Donate : Float;       Temp : Donations_Access;    begin       New_Line;       Put("Equi_Sum : " );       Put(Equi_Sum);       New_Line;       for Index in reverse Users'Range loop          exit when Users(Index).Sum < Equi_Sum;          Donate := Users(Index).Sum - Equi_Sum;          Put(Users(Index).Id.all);          Put(" donate : " );          Put(Donate);          New_Line;          while Donate > 0.0 loop             for Ki in 1..Index-1 loop                Put(" to " );                if Users(Ki).Sum < Equi_Sum then                   Put(Users(Ki).Id.all);                   Put(" the sum : " );                   Put(Equi_Sum - Users(Ki).Sum);                   if Donations = null then                      Temp := new Donations_Table(1..1);                      Create(Temp(1),                             Users(Index).Id,                             Users(Ki).Id,                             Equi_Sum - Users(Ki).Sum);                      New_Line;                      Put("init temp" );                      New_Line;                   else                      Temp := new Donations_Table(1..Donations'Length + 1);                      Create(Temp(Temp'length),                             Users(Index).Id,                             Users(Ki).Id,                             Equi_Sum - Users(Ki).Sum);                      New_Line;                      Put("Add temp" );                      New_Line;                   end if;                   Donate := Donate - (Equi_Sum - Users(Ki).Sum);                   Free(Donations);                   Donations := Temp;                end if;                New_Line;             end loop;          end loop;       end loop; end Balance; 
 
  |  
 
   J'arrive pas à trouver l'erreur.        |