• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Сравнение двух Variant

  • Автор темы IsAvailable
  • Дата начала
I

IsAvailable

Есть две переменные типа Variant: v1, v2
В них записываются значения, полей типа DialogList, которые иногда просто строки, иногда - список строк. Необходимо производить сравнение на равенство этих элементов. Если оба элемента однострочные, то всё ок, а когда один элемент строка, а другой - список, то вываливается ошибка Type mismatch : (
И что-то никак не соображу, как в этой ситуации лучше обойти эту ошибку.
 
L

LuMee

Думаю, для начала следует определиться, каким образом следует сравнивать, скажем, строку со списком. Сравнивать ее с каждым элементом, а потом выдумывать "сводный" результат? Или собрать список в одну строку с определенным разделителем (например Tab), и уже сравнивать две строки?
 
I

IsAvailable

Сравнивать нужно таким образом: одно и то же это или нет : )

"а1":"с1" и "а1" ==> false
"а1" и "а1" ==> true
"а1" и "а1":"с1" ==> false
"а1":"с1" и "а1":"с1" ==> true
"с1":"а1" и "а1":"с1" ==> false

Вроде, все варианты разобрал : )
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Можно так:
f = Evaluate({поле1 = поле2}, doc)
if f(0) = "1" then ...
Или так: if join(doc.поле1) = join(doc.поле2) then ...
 
I

IsAvailable

Для: Morpheus
Ага. Прочитал. Спасибо за линк. И хэлп за одно по второму разу перечитал те главы )
В принципе мне нужно эквивалентное сравнение.
По идее подходить должно обычное "=", но в этом случае вываливается Type mismatch, когда один Variant список, а другой - строка
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Medevic+13:03:2007, 11:00 -->
<span class="vbquote">(Medevic @ 13:03:2007, 11:00 )</span><!--QuoteEBegin-->f = Evaluate({поле1 = поле2}, doc)
[snapback]58869" rel="nofollow" target="_blank[/snapback]​
[/quote]
Хотя это не совсем верно. :)
Нужно еще сравнить количество элементов в списке.
 
I

IsAvailable

Для: Medevic
Значения в переменные типа Variant не непосредственно из дока берутся, а через вьюху с помощью AllEntries и потом через Columnvalues(x).
Соответственно Evaluate и не пробовал, а Join выдает всё тот же Type mismatch :-о
 
30.05.2006
1 345
12
BIT
0
Для: Medevic
Значения в переменные типа Variant не непосредственно из дока берутся, а через вьюху с помощью AllEntries и потом через Columnvalues(x).
Соответственно Evaluate и не пробовал, а Join выдает всё тот же Type mismatch :-о
Да, Evaluate - это для полей, а не переменных.
Для переменных в 6-ке появились замечТательные функции Implode/Join и Split - аналоги "собачьих" @Implode и @Explode.

Так что превращайте массивы в строки и сравнивайте их! Impode декларирует всеядность к типам...
 
I

IsAvailable

Сделал так:

Код:
If Isarray(v1) Then s1$ = Implode(v1,",") Else s1$ = Cstr(v)
If Isarray(v2) Then s2$ = Implode(v2,",") Else s2$ = Cstr(v2)
И потом уже сравниваю s1$ и s2$

Если без проверки на array делать Implode, то ругается на тип уже при обычных строках...
Ну а так работает, вроде : )
 
S

Shandrik

Только учтите, что использование Implode подразумевает, что вам при сравнении важен порядок.

Т.е. если v1="1":"2", а v2="2":"1", но после Implode они будут НЕ равны.
 

Domino-Designer

Людям надо поморгать!
Lotus Team
06.12.2011
616
223
BIT
9
ОФФТОП
Я шизею от постановки вопроса и : "Есть две переменные типа Variant: v1, v2"
Сравнивать Variant ... это круто.
Мой наглый совет, вот откуда вы этот вариант/значения получали, вот там сравнивайте
 
A

anna

ОФФТОП
Я шизею от постановки вопроса и : "Есть две переменные типа Variant: v1, v2"
Сравнивать Variant ... это круто.
Мой наглый совет, вот откуда вы этот вариант/значения получали, вот там сравнивайте
В общем-то, конечно, но не всегда годится: таких мест, откуда вызывается функция, слишком много, и не править же везде, если нужно один какой-то вариант параметра обработать иначе.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Насколько я помню, разных типов в Variant массиве быть не может, там будет единый, но variant (с максимально подходящим типом).
Если преобразовать оба параметра в массив, то задача сведется к сравнению массивов...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!