Bonjour, j'utilise une DLL écrite en C. Il s'agit de "DDS.DLL" écrite par Bo Haglund (la référence en matière de Bridge)
http://privat.bahnhof.se/wb758135/br...mentation.html
Cette DLL comporte plusieurs fonctions.
J'utilise actuellement sans problème la fonction "CalcTTable" définie ainsi dans la doc :
CalcDDtable :struct ddTableDeal tableDeal,
struct ddTableResults * tablep
Les structures (packed records en delphi) sont définies de la manière suivante :
ddTableDeal : unsigned int cards[4][4]; //Encodes a deal. First index is hand. Hand encoding. Second index is suit. Suit encoding.
ddTableResults : int resTable[5][4]; // Encodes the solution of a deal ......
Lors de l'appel de la fonction, je passe comme paramètres la structure ddTableDeal (initialisée avec les valeurs nécessaires au calcul) et la structure ddTableResults qui me sert à récupérer les résultats du calcul.
Cette fonction renvoie un integer (1 si tout se passe bien, sinon un autre code approprié en fonction du type d'erreur) et "calcule " donc la structure ddTableResults que j'exploite ensuite dans mon programme. Pour cette fonction, tout va bien.
J'ai un problème pour la seconde fonction "Par" définie ainsi dans la doc :
Par : struct ddTableResults * tablep,
struct parResults *presp,
int vulnerable
Les structures de cette fonction sont définies de la manière suivante :
ddTableDeal : unsigned int cards[4][4]; //identique à la celle de la fonction "CalcTTable"
parResults : char parScore[2][16]; //First index is NS/EW.
char parContractsString [2][128]; //First index is NS/EW.
Lors de l'appel de cette fonction, je passe comme paramètres la structure ddTableDeal (initialisée avec les valeurs nécessaires calculées avec la fonction précédente ), vulnerable défini à 0, et la structure parResults qui doit me servir à récupérer les résultats du calcul.
Cette fonction me renvoie bien 1 (donc tout se passe sans erreur), mais les résultats que je récupère dans la structure "parResults" ne sont pas corrects. J'obtiens des caractères style asiatiques alors que je dois obtenir par exemple des résultats du style "NS:NS 23S,NS 23H"
voici un extrait de mon code :
Merci de votre aide (ça fait 8 jours que je bloque là-dessus !!)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 Type TddTableDeal=packed Record Cards:array [0..3,0..3] of Integer; end; TddTableResults=packed Record resTable:array [0..4,0..3] of Integer; end; PtrddTableResults =^TddTableResults; TparResults=packed Record parScore : array [0..1,0..15] of Char; parContractsString : array [0..1,0..127] of Char; vulnerable:integer; end; PtrparResults =^TparResults; .......... implementation uses unit1; var MyDeal:Tdeal; futp:PtrFutureTricks; MyTableDeal:TddTableDeal; Tablep:PtrddTableResults; presp:PtrparResults; function CalcDDtable(TableDeal:TddTableDeal;Tablep:PtrddTableResults):integer; stdcall; external 'DDS.dll'; //Pas de problème pour cette fonction function Par(Tablep:PtrddTableResults;presp:PtrparResults;vulnerable:integer):integer; stdcall; external 'DDS.dll'; procedure CalculDuPar(donne:string); // Calcul du Par var i,j:integer; CodeRetour:integer; S:string; begin Resoudre_CalcDDtable(donne); // Procédure qui fonctionne et qui me permet de récupérer le tableau resTable:array [0..4,0..3] of Integer // avec les bonnes valeurs. Ces valeurs sont stockées dans le tableau NbreLevees[i,j] new(Tablep); for i:=0 to 4 do begin for j:=0 to 3 do begin Tablep.resTable[i,j]:=NbreLevees[i,j]; end; end; new(presp); CodeRetour:=Par(Tablep,presp,0); // La function de Bo Haglund (renvoie 1 si tout se passe bien sinon autre code d'erreur) for i:=0 to 1 do begin for j:=0 to 15 do begin S:=S+presp.parScore[i,j]; end; end; showmessage(S); // C'est là que j'obtiens des caractères asiatiques au lieu par exemple de "NS:NS 23S, NS23 H" for i:=0 to 1 do begin for j:=0 to 127 do begin S:=S+presp.parContractsString[i,j]; end; end; showmessage(S);// C'est là que j'obtiens des caractères asiatiques au lieu par exemple de "NS:NS 23S, NS23 H" dispose(Tablep); dispose(presp); end;
Jean-Louis
Partager