Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Проблемы с... условным оператором if )) (http://forum.oszone.net/showthread.php?t=150392)

evg64 13-09-2009 12:42 1217792

Проблемы с... условным оператором if ))
 
Есть небольшой код (впоследствии хочу сделать прогу, чтобы сама добавляла друзей из одной группы вконтакте):
Код:

$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 1217812

Цитата:

Цитата evg64
Вдвойне удивляет, как после кода 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 1217837

Ого, спасибо, я в жизни бы не подумал. А как возможно, что автоит различает разные типы переменных, если внутри скриптов они все хранятся как Variant?

Creat0R 13-09-2009 14:19 1217855

Цитата:

Цитата evg64
как возможно, что автоит различает разные типы переменных, если внутри скриптов они все хранятся как Variant? »

Не разные типы переменных, а разные типы данных в переменной.
У типа Variant как бы есть определения - массив, строка, число, объект, указатель, и т.п.

evg64 13-09-2009 14:49 1217874

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

Creat0R 13-09-2009 19:32 1218094

Цитата:

Цитата evg64
Почему в данном примере переменные с разным типом данных оказываются несравнимыми? »

Видимо потому что 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".


Время: 12:04.

Время: 12:04.
© OSzone.net 2001-