O modalitate unificată de a compara matricele

O modalitate unificată de a compara matricele?

Scriu teste de module, de multe ori devine necesar să comparăm două matrice dinamice pentru identitate. Până acum, comparăm prost elementul după element. Este posibil să implementăm o funcție în Delphi care ar compara două matrice pentru identitate, indiferent de tipul elementelor conținute în ele, astfel încât această funcție să poată fi de asemenea folosită pentru a compara rețelele de șiruri de caractere, o serie de numere etc.







De exemplu, în Perl, este posibilă compararea matricelor de orice tip cu o identitate, transmițând referințele la acestea ca parametru pentru o funcție unificată. În continuare, funcția în sine determină tastarea și dimensiunea acestora și returnează adevărat dacă numărul de elemente și tipul și valoarea acestora se potrivesc. Este posibil să faceți același lucru și în Delphi?

Vă mulțumesc anticipat pentru sfatul dvs.

Am înțeles aici că întrebarea este de fapt o întrebare despre posibilitatea de a compara o variabilă de orice tip (obiect, matrice, înregistrare etc.) cu orice altă variabilă.

dacă MegaEqual (PVarA, PVarB: Pointer) atunci
# xA0; ShowMessage ("Variabilele sunt egale");
altfel
# xA0; ShowMessage ("Variabilele nu sunt egale");

unde PVarA, PVarB - indică variabilele de orice tip.

P. S. Nu judecați strict, dacă există ceva în neregulă, au existat foarte puține indicii.

În principiu, da, dacă variabilele sunt secvențiale în fiecare matrice. Apoi, ele pot fi reprezentate ca două magistrale de byte și comparate prin byte.


> În principiu, da, dacă în fiecare matrice variabilele sunt secvențiale.
> # xA0; Apoi pot fi reprezentate ca două matrice grele
> octeți și să compare byte cu octet.
>

Și cum se poate face asta? Poți să arăți un mic exemplu?

Pentru dimensiunea matricei?

Xs. Chiar acum a scris. Nu este testat, dar teoretic ar trebui să funcționeze. Len este lungimea celei mai mari dintre matrice. Se găsește utilizând lungimea (Array). Prin Pointer nu se poate obține. Și, da - dacă una dintre matrice este mai scurtă decât Len, fie va exista AV, fie continuarea matricei va fi luată la întâmplare din memorie.







procedura TForm1.Button1Click (expeditor: TObject);

funcția Comparați (a, b: pointer; sizeOfElement: octet): Boolean;
var La, Lb, j: întreg;
# xA0; # xA0; ca, cb: Pchar;
începe
rezultat: = false;
dacă (a = zero) sau (b = zero) atunci ieșim;
La: = Pintegrator (Integer (a) -4) ^ * sizeOfElement;
Lb: = Pintere (Integer (b) -4) ^ * sizeOfElement;
dacă La<>Lb apoi ieșiți;
Ca: = Pchar (a);
Cb: Pchar (b);
rezultat: = ComparaMem (a, b, La)
se încheie;

var x, y: array de byte;
i: întreg;
începe
SetLength (x, 3);
pentru i: = scăzut (x) la Ridicat (x) # xA0; x [i]: = (i + 1);
SetLength (y, 3);
pentru i: = joasă (y) la ridicată (y) # [y]; y [i]: = (i + 1);
// y [2]: = 5;

dacă se compară (x, y, sizeof (x [666])) atunci
caption: = "Egal" Alt caption: = "Nu este egal";
se încheie;
compara - compară două matrice dinamice (este posibil și liniile dacă ați apelat astfel comparați (@ s1 [1], @ s2 [1], 1)) tipul de matrice trebuie să fie același. Dacă elementele unei matrice sunt referințele la obiecte (rânduri, clase), nu funcționează natural.

-d FFF2: 93F1
FFF2: 93F0 # xA0; # xA0; BF 5C 00 8A 1C F3 A4-33 C0 AB AB 59 5E 1F 1E # xA0; # xA0 ;. \. 3. Y ^ ..
FFF2: 9400 # xA0; 56 C5 74 0A 8A 3C F3 A4-AB AB 5E 1F C5 74 02 80 # xA0; V.t ..<. ^..t..
FFF2: 9410 # xA0; C9 80 8B F9 F3 A4 FE C9-8A C7 32 FF E8 A7 0C 73 # xA0;. 2. s
FFF2: 9420 # xA0; 02 8A F9 8A C3 32 DB E8-9C 0C 73 02 8A D9 E8 36 # xA0;. 2. s. 6
FFF2: 9430 # xA0; A4 66 FF 74 12 66 FF 74-12 66 26 8F 06 0A 00 33 # xA0; .f.t.f.t.f. 3
FFF2: 9440 # C0 8E D8 66 8F 06 88 00-36 C7 06 2C 03 80 00 36 # xA0;. f. 6. 6
FFF2: 9450 # xA0; 8E 1E 30 03 36 8C 1E 2E-03 F6 46 FB 01 74 27 36 # xA0;. 0.6. F..t "6
FFF2: 9460 # xA0; C5 36 BF 0E C4 7E FC 26-8C 5D 10 4E 4E 89 1C 26 # xA0; .6.

.] NN ..
FFF2: 9470 # xA0; 89 # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0;.

> rezultat: = CompareMem (a, b, Len);

Hmm. Iată soluția! Să presupunem că arăt doar principiul.

Nu, deoarece nu există metode care să confirme că indicatorul indică o structură similară.

Vă mulțumim mult pentru sfatul dvs. Am încercat acest cod:


var
# xA0; PA, PB: Pointer;
# xA0; A, B: matrice de șir;
începe
# xA0; SetLength (A, 2);
# xA0; A [0]: = "1";
# xA0; A [1]: = "2";
# xA0; SetLength (B, 2);
# xA0; B [0]: = "1";
# xA0; B [1]: = "2";

# xA0; PA: = Pointer (A);
# xA0; PB: = Pointer (B);

# xA0; dacă CompareMem (PA, PB, Lungime (A)) atunci
# xA0; # xA0; ShowMessage ("Egal")
# xA0; altceva
# xA0; # xA0; ShowMessage ("NU este egal");

Pentru tablouri Integer funcționează, pentru tablouri de șiruri - nu.


> Sau este o intrebare ascunsa "de ce nu functioneaza pentru siruri de caractere"?

) Da, a fost o întrebare ascunsă. Îmi cer scuze, nu am acordat atenție cuvântului "linii".

În general, concluzia generală este probabil că este mai ușor să faci o comparație elementală, iar Delphi nu vă permite să "călcați" comparați variabile de tip necunoscut. Eh.







Trimiteți-le prietenilor: