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;Je n'ai pas posté le code complet. Je compléterai si nécessaire.
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));
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.
Partager