ПредишенСледващото

Uniform начин за сравняване на масиви?

Писане единица тестове, често е необходимо да се сравнят две динамичен масив за самоличност. И все пак глупаво сравняване точка по точка. възможно в Делфи ли е да се приложи някаква функция, която сравнява два масива на идентичност, независимо от типа на елементите, съдържащи се в тях, за да бъде в състояние да използвате тази функция и да сравнявате масиви от низове, масиви от числа, и така нататък. Г.?

Така например, в Perl е възможно да се сравни масиви от всякакъв тип за идентичността, минавайки позоваване на тях като параметър в една единна функция. На следващо място, самата функция разбере им пишете и измерение, и връща истина, ако броят на елементи и техния вид и стойност съвпадат. Мога ли да се направи в Delphi?

Благодаря ви предварително за съветите.

Тогава разбрах, че въпросът е всъщност въпрос за възможността за сравнение на променлива от всякакъв тип (обект, масив, запис и т.н.), с всяка друга променлива.

ако MegaEqual (PVarA, PVarB: Pointer), след това
# XA0; ShowMessage ( "променлива е равна на");
още
# XA0; ShowMessage ( "Variable не е равно");

където PVarA, PVarB - указател към променлива от всякакъв вид.

П. С. Не съдете строго, ако нещо не е наред с указатели са работили много малко.

По принцип да, ако всеки масив променливи са последователни. След това те могат да бъдат представени като двама яки масив от байтове за сравнение байт по байт.


> По принцип да, ако всеки масив променливи са последователни.
> # XA0, тогава те могат да бъдат представени като две едър масив
> Byte и байт сравнение.
>

И как може да се направи? Можете да покажете на един малък пример?

XOR от големината на масива?

Ексес. Точно сега просто е написал. Аз не изпитва, но на теория би трябвало да работи. Лен - дължината на по-големи масиви. Разположен чрез дължина (масив). Чрез Пойнтър не го получи. А да - ако една от масиви е по-кратък от Лен, след това или има AV, или продължаване на масива ще се избира произволно от паметта.

процедура TForm1.Button1Click (Sender: TObject);

Sompare функция (а, б: указател; sizeOfElement: байт): булева;
Var La, LB, й: цяло число;
# XA0; # XA0; ва, CB: Pchar;
започвам
резултат: = фалшива;
ако (а = нула) или (б = нула) след излизане;
La: = PInteger (цяло число (а) -4) ^ * sizeOfElement;
Lb: = PInteger (цяло число (б) -4) ^ * sizeOfElement;
ако La<>Lb след излизане;
Ca: = Pchar (а);
Вб: = Pchar (б);
резултат: = CompareMem (а, Ь, La)
приключи;

Var х, у: масив от байт;
I: цяло число;
започвам
SetLength (х 3);
защото: = ниско (х) към висока (х) се # XA0 х [п]: = (I + 1);
SetLength (у, 3);
защото: = ниско (у) към висока (у) направи # XA0 у [п]: = (I + 1);
// у [2]: = 5;

ако се сравни (X, Y, sizeof (х [666])), след това
надпис: = "Равен" друг надпис: = "не е равно на";
приключи;
за сравнение - сравнява две динамичен масив (ред възможно и ако е така да причини за сравнение (@ s1 [1], @ s2 [1], 1)) на масива трябва да бъде от същия тип. Ако елементите на масива - препратки към обекти (струни, класове), е естествено не работи.

-г FFF2: 93F1
FFF2: 93F0 # XA0; # XA0; BF 5С 00 8А 1С F3 A4-33 С0 AB AB 59 5Е 1F 1Е # XA0; # XA0 ;. \. 3. Y ^ ..
FFF2: 9400 # XA0; 56 C5 74 0A 8А 3C F3 A4-AB AB 5Е 1F С5 74 02 80 # XA0; V.t ..<. ^..t..
FFF2: 9410 # XA0; С9 80 8В F9 F3 А4 FE C9-8A С7 32 FF E8 А7 0 ° С 73 # XA0. 2. ите
FFF2: 9420 # XA0; 02 8А F9 8А С3 32 DB E8-9C 0 ° С 73 02 8А D9 E8 36 # XA0. 2. а. 6
FFF2: 9430 # XA0; A4 66 FF 74 12 66 FF 74-12 66 26 8F 06 00 33 0A # XA0; .f.t.f.t.f. 3
FFF2: 9440 # XA0; С0 8Е D8 66 8F 06 88 00-36 С7 06 2С 03 80 00 36 # XA0. е. 6. 6
FFF2: 9450 # XA0; 8E 1E 30 Март 36 8C 1E 2E-F6 03 46 FB 01 74 27 36 # XA0. 0.6. F..t "6
FFF2: 9460 # XA0 С5 36 BF 0E С4 7E FC 26-8C 5D 4Е 4Е 10 89 1С 26 # XA0; 0.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.

> Резултати: = CompareMem (а, Ь, Len);

Хм. И тук е решението! Добре, нека приемем, че аз просто показва принципа.

Не, защото няма начин да се потвърди, че звената за показалецът подобна структура.

Благодаря ви много за съвета. Опитах следния код:


Var
# XA0; PA, PB: Pointer;
# XA0 А, В: масив от низ;
започвам
# XA0; SetLength (А, 2);
# XA0 А [0] = "1";
# XA0 А [1] = "2";
# XA0; SetLength (Б, 2);
# XA0; Б [0] = "1";
# XA0, В [1] = "2";

# XA0; PA: = Стрелката (А);
# XA0; PB: = Стрелката (В);

# XA0; ако CompareMem (PA, PB, Дължина (A)), след това
# XA0; # XA0; ShowMessage ( "равни")
# XA0; останало
# XA0; # XA0; ShowMessage ( "не");

Array Integer работи за масиви от низове - не.


> Или е скритата въпроса "защо не работи за струни"?

) Да, това е скрит проблем. Съжалявам, че не обръщат внимание на думата "линия".

Като цяло, общото заключение, най-вероятно се крие във факта, че тя е по-лесно да се направи един елемент-мъдър сравнение, и Delphi не позволява на "желязо", за да сравните променливите от неизвестен тип. Ех.

Подкрепете проекта - споделете линка, благодаря!