Войти

Показать полную графическую версию : [решено] Проблемы с... условным оператором if ))


evg64
13-09-2009, 12:42
Есть небольшой код (впоследствии хочу сделать прогу, чтобы сама добавляла друзей из одной группы вконтакте):

$IE=_IECreate("http://vkontakte.ru/gsearch.php?from=people&basic=1&c[group]=11068474#c%5Bcountry%5D=0&c%5Bgroup%5D=11068474&c%5Bsection%5D=people&offset=40")
s(800)
if isobj($IE) then
$Links=_IELinkGetCollection($IE)
For $Link in $Links
if $Link.innertext="Добавить в друзья" then
msgbox(0,0,"innertext="&$Link.innerText)
if $Link.innertext<>0 then $Link.click
_IEAction($Link,"click")
endif
next
endif


При запуске скрипт почему-то выдает мсгбокс с сообщением innertext=0 и переходит на страницу участника вместо клика по ссылке добавить друзья. Следующий мсгбокс уже с сообщением "Добавить в друзья", но ссылки такой он не находит, потому что, понятное дело, уже перешел на другую страницу.
P.S. Вообще не пойму, как ссылка может называться "0", на той странице вообще таких ссылок нет.
P.P.S. Вдвойне удивляет, как после кода if $Link.innertext<>0 он совершает $Link.click в случаях, когда $Link.innertext=0

Creat0R
13-09-2009, 13:34
Вдвойне удивляет, как после кода if $Link.innertext<>0 он совершает $Link.click в случаях, когда $Link.innertext=0 »
Вы сравниваете переменные строкового типа с числовым типом, так нельзя....

$IE = _IECreate("http://vkontakte.ru/gsearch.php?from=people&basic=1&c[group]=11068474#c%5Bcountry%5D=0&c%5Bgroup%5D=11068474&c%5Bsection%5D=people&offset=40")
;~ s(800)
If IsObj($IE) Then
$Links = _IELinkGetCollection($IE)

For $Link In $Links
If $Link.innertext == "Добавить в друзья" Then
MsgBox(0, 0, "innertext=" & $Link.InnerText)
If $Link.Innertext <> "0" Then $Link.Click
_IEAction($Link, "click")
EndIf
Next
EndIf

evg64
13-09-2009, 14:01
Ого, спасибо, я в жизни бы не подумал. А как возможно, что автоит различает разные типы переменных, если внутри скриптов они все хранятся как Variant?

Creat0R
13-09-2009, 14:19
как возможно, что автоит различает разные типы переменных, если внутри скриптов они все хранятся как Variant? »
Не разные типы переменных, а разные типы данных в переменной.
У типа Variant как бы есть определения - массив, строка, число, объект, указатель, и т.п.

evg64
13-09-2009, 14:49
Почему в данном примере переменные с разным типом данных оказываются несравнимыми? Ведь переменные вариант (со строковым и числовым типом данных) вполне нормально взаимодействуют между собой, к примеру:
$a="4"
$b=5
if $a<$b then
...
endif

Creat0R
13-09-2009, 19:32
Почему в данном примере переменные с разным типом данных оказываются несравнимыми? »
Видимо потому что AutoIt производит сравнение байтов, а в "4" меньше чем в 5 :).
К примеру, если мы сравниваем буквы алфавита:

$a = "a"
$b = "b"

If $a < $b Then
ConsoleWrite("1: <" & $b & "> больше чем <" & $a & ">" & @CRLF)
Else
ConsoleWrite("2: <" & $a & "> больше чем <" & $b & ">" & @CRLF)
EndIf

То получается что «b» больше чем «a», также к примеру как «Я» больше чем «И», и латинская буква «A» в такой проверке, окажется меньше чем кириллическая буква «А» (в которой два байта, а не один).

На эту тему на оф. форуме было длинное обсуждение, но я его что то немогу найти.

P.S
Если нужно проверить учитывая типы данных, то для этого обычно используется StringCompare, где 5 будет больше чем "6".




© OSzone.net 2001-2012