Bonjour,

J'ai le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    { IAgent }
 
IAgent = interface
        procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
        procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
        procedure UpdateMoney(const ADelta : Single);
    end;
 
    { TOffer }
 
    TOffer = class
        { Commodity }
        FCommodity : Integer;
        { Agent }
        FAgent : IAgent;
        { Quantity }
        FQuantity : Integer;
        { Price }
        FPrice : Single;
        { Class constructor }
        constructor Create(ACommodity : Integer; AAgent : IAgent; AQuantity : Integer; APrice : Single);
    end;
 
    TSimpleAgent = class(TInterfacedObject, IAgent)
        procedure Notify(AMarket : TMarket; AAct : Char; ACommodity : Integer; APrice : Single; ASuccess : Boolean);
        procedure UpdateInventory(const ACommodity : Integer; const ADelta : Integer);
        procedure UpdateMoney(const ADelta : Single);
    end;
 
    TMarket = class
    private
        { Buy offer books }
        FBuyOfferBooks : TOfferMap;
        { Sell offer books }
        FSellOfferBooks : TOfferMap;
        FDemands : TIntegerMap;
        FSupplies : TIntegerMap;
        FPrices : TSingleMap;
    public
        constructor Create;
        procedure AddBuyOffer(AOffer : TOffer);
        procedure AddSellOffer(AOffer : TOffer);
        procedure ResolveOffers(ACommodity : Integer);
        function GetAveragePrice(const ACommodity : Integer) : Single; virtual;
        function GetDemand(const ACommodity : Integer) : Integer;
        function GetSupply(const ACommodity : Integer) : Integer;
        destructor Destroy; override;
    end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
    //une classe de test avec :
    FAgent := TSimpleAgent.Create;
 
    //offres d'achat
    FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 50, 2.8));
    FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
    FMarket.AddBuyOffer(TOffer.Create(WOOD, FAgent, 20, 2.7));
 
    //offres de vente
    FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 40, 4.3));
    FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 30, 3.2));
    FMarket.AddSellOffer(TOffer.Create(WOOD, FAgent, 20, 3.7));
    FMarket.ResolveOffers(WOOD);
 
    //2ème tour
    //offres d'achat
    FMarket.AddBuyOffer(TOffer.Create(WOOD, TMockAgent.Create, 60, 2.5));
Je n'ai pas posté le code complet. Je compléterai si nécessaire.

La classe TSimpleAgent implémente une interface IAgent.

La méthode FMarket.ResolveOffers traite les offres et libère les objets TOffer.

Tout fonctionne bien jusqu'à la fin de l'appel de ResolveOffers. Par contre lorsque j'appelle AddBuyOffer pour le deuxième tour j'obtiens une erreur (exception de class 'External: SIGSEGV').

Je constate que le destructeur de TSimpleAgent est appelé.

Si je crée un nouvel objet TSimpleAgent je n'ai pas cette erreur. Je n'ai pas d'erreur non plus si j'utilise une classe abstraite au lieu d'une interface.

J'ai l'impression que le problème est lié au compteur de référence et la libération automatique des objets qui descendent de TInterfacedObject.