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. |