Bonjour à tous !
Fervent lecteur des solutions de ce forum, je n'ai point trouvé de solution à mon problème.
Je cherche à créer diverses fonctions "génériques" sous Delphi 5 (oula oui un ancêtre ^^') pour traiter des tableaux quelconques avec un unique algorithme.
Par exemple un algorithme de tri, ou un de recherche ou quoi que ce soit qui pourrait avoir en commun une logique.
Pour ce faire j'utilise des fonctions globales qui ont en paramètres des fonctions Templates
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 //ma fonction template de comparaison Fonction_De_Comparaison = function(Val1, Val2: Pointer): integer; //ici une utilisé pour comparer deux integers. function Compare_Integer_ET_Integer(Val1, Val2: Pointer): integer; function Compare_Integer_ET_Integer(Val1, Val2: Pointer): integer; begin try result := PInteger(Val1)^ - PInteger(Val2)^; except result := 0; end; end;
Ainsi je peux théoriquement créer un algorithme unique mais nuancé par une fonction de comparaison dédié au type de tableau qu'on lui passe
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 function Trouve_Element_Tab_Trie(Tab : Pointer;Val : pointer; SizeofRecord, SizeOfTab : integer; Fct_Cmp : Fonction_De_Comparaison) : integer; //algo qui se base sur la dichotomie function Trouve_Element_Tab_Trie(Tab : Pointer; Val : pointer; SizeofRecord, SizeOfTab : integer; Fct_Cmp : Fonction_De_Comparaison) : Integer; var Trouve : boolean; inf, sup, Cur : integer; ptr_tmp : Pointer; begin Trouve := false; try inf := 0; sup := SizeOfTab - 1; Cur := 0; if SizeOfTab = 0 then begin ptr_tmp := ptr(integer(Tab) + Cur * SizeofRecord); if Fct_Cmp(Val, ptr_tmp) > 0 then Cur := 1; end else begin while (inf <= sup) and not Trouve do begin Cur := (inf + sup) div 2; ptr_tmp := ptr(integer(Tab) + Cur * SizeofRecord); if Fct_Cmp(Val, ptr_tmp) = 0 then Trouve := true else if Fct_Cmp(Val, ptr_tmp) > 0 then inf := Cur + 1 else sup := Cur - 1; end; ptr_tmp := ptr(integer(Tab) + Cur * SizeofRecord); if (Cur <= SizeOfTab - 1) and (Fct_Cmp(Val, ptr_tmp) < 0) then inc(Cur); end; result := Cur; except result := -1; end; end;
D'après ma logique je pensais pouvoir utiliser la même fonction si dessus pour un tableau de Integer ou un tableau de String ou même avec des Records généraux en paramétrant uniquement la fonction de comparaison.
Mon problème est au niveau de l’accès des éléments, Pour moi, ce qui suit permet d'avoir un pointer directement sur l'élément numéro 'Cur' dans mon tableau. Puis avec le bon Cast devant on récupère la valeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ptr_tmp := ptr(integer(Tab) + Cur * SizeofRecord);
Mais avec un simple exemple de tableau d'entier, ou je remarque bien qu'on passe d'une adresse $7000 à $7040 pour accéder au 10ème element, le cast PInteger($7040)^ me renvoie une valeur juste incohérente.
Est ce que j'ai mal compris quelque chose? ou alors les tableaux dynamiques ne s'accèdent pas linéairement ?
Merci d'avance pour vos lumières![]()
Partager