Что нового

[Ошибки] Как определить шибку возникающую после компилирования

forfrends

Новичок
Сообщения
176
Репутация
3
Всем добрый день!
Столкнулся с проблемой, которая ввела меня в ступор... :stars:
Все как обычно: написал программу (3000 строчек) запустил через F5, в течение часа тестировал - все отлично!
После скомпилировал через AutoIt3Wrapper ver.2.0.1.24 (правой клавишей по скрипту - Compile with options - Compile Script). В результате получаю Экзешник...
При запуске выдает ошибку:
Код:
Line 7945 (File "C:.........programm.exe"): Error: Variable used without being declared
Подобной ошибки при запуске через F5 не было.
Я попробовал в код добавить следующее:
Код:
Opt("MustDeclareVars", 1)

в результате получил длинный список якобы не задекларированных переменных...
Ладно, взял и задекларировал их все (что были в списке). Получилось следующее:
Код:
Opt("MustDeclareVars", 1)
Dim $x, $x1, $x2, $x3....., $xn

Скомпилировал...
Предыдущая ошибка пропала, но появилась другая:
Код:
Line .... (File "C:.........programm.exe"): Error: Subscript used with non-Array vaiable

что делать - ума не приложу :'(
Можете что-то посоветовать?
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
Читал еще до того как создать топик...
я не использую масивы, разве что их использует сам Аутоит, а я об этом не знаю...
Почему возникает ошибка относительно масивов - для меня вопрос.
Но есть одно "Но".
Программа "ругалась" (после
Код:
Opt("MustDeclareVars", 1)
) что не задекларированы такие вещи как:
Код:
$Form
$Button
$Tab
$Combo
$Checkbox
$Radio
$Label
$nMsg

Которые используются в GUI. Я их задекларировал через
Код:
DIM
, может какие-то из них есть масив? Например
Код:
$Form
$Tab
$Combo
$nMsg
.
Может их задекларировать через
Код:
Global / Local
?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
forfrends [?]
я не использую масивы
Я уже натыкался на то, что в некоторых встроенных UDF нет “проверки на массивность”, т.ч нужно видеть код полностью, чтобы определить ошибку.


P.S.
И поправь заголовок, там опечатка.
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
CreatoR,
таки нашел ошибку, точнее место на которое "ругается" аутоит.
И таки да - это массив.
привожу часть кода:
Код:
If $PM = 1 Then $coordPs = PixelSearch( $x1-5, $y1-5, $x1+5, $y1+5, 0x8CB6B9, 20)
If $PM = 2 Then $coordPs = PixelSearch( $x2-5, $y2-5, $x2+5, $y2+5, 0x8CB6B9, 20)
If $PM = 3 Then $coordPs = PixelSearch( $x3-5, $y3-5, $x3+5, $y3+5, 0x8CB6B9, 20)
    If Not @error Then
	MouseClick("left", $coordPs[0], $coordPs[1]); вот на эту строчку ругается
    ...
    EndIf


Несколько интересных моментов:
1) как скрипт так и скомпилированный файл на некоторых компах выдают ошибку на некоторых работают без проблем... В чем разница - так и не понял.
2) До этой части кода я несколько раз использую $coordPs = PixelSearch и нигде ошибок небыло...
3) программа "входит" в условие If Not @error Then если $PM > 3 , получается @error имеет приобретенное ранее значение = 0 , но тогда и массив $coordPs[0], $coordPs[1] должен иметь предыдущее значение, и не выкидывать ошибку Error: Subscript used with non-Array vaiable... Но нет, переменная $coordPs[0], $coordPs[1] выдает ошибку, если обратиться к ней как к массиву...
4) Сама переменная задекларирована:
Код:
Global $coordPs


Что делать - просто не понимаю!
Можете что-то посоветовать?


Добавлено:
Сообщение автоматически объединено:

Может ошибка возникает из-за того что PixelSearch используется через ряд If-ов?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
forfrends [?]
Может ошибка возникает из-за того что PixelSearch используется через ряд If-ов?
Ты проверяешь @error только последнего выполненного PixelSearch, в данном случае разумнее проверять на массивность, а точнее на размер массива (Ubound).
Опять же, всё это написано в FAQ'е.
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
Спасибо, я еще плохо разбираюсь в Аутоите....
Поробовал поработать с UBound, и с его результатами.
Написал простенький примерчик, часть которого взята из справки:
Код:
Local $aArray[5][5]
$aArray = PixelSearch(200, 200, 205, 205, 0xF0F4F9, 70); цвет - цвет текущего окна
Local $iRows = UBound($aArray) ; Обще количество строк
Local $iCols = UBound($aArray, 2) ; Обще количество колонок
Local $iDimension = UBound($aArray, 0) ; Размерность массива

MsgBox(4096, "", "Массив " & $iDimension & '-мерный'&@CRLF& _
    'с количеством строк ' & $iRows &@CRLF& _
    'с количеством колонок: ' & $iCols)
MsgBox(4096,"", $aArray[0] & "," & $aArray[1]); выдало координаты


Результат получился интересный:
количество строк = 2
количество колонок = 0
размерность массива = 1

Получается массивы, созданные/измененные через PixelSearch, одномерные и не имеют колонок?
Как-то это странно... :scratch:
После наскольких тестов показало что в PixelSearch массивы действительно одномерные
Но почему 0 колонок?
Как в таком случе применять пример из НЕофициальныйого FAQ AutoIt:
Код:
If IsArray($vArray) And Ubound($vArray, 0) = 2 Then
    .;... код программы...
EndIf

может вместо:
Код:
Ubound($vArray, 0) = 2

написать:
Код:
Ubound($vArray) = 2

то есть проверять на кол-во строк?
Так не будет ошибки?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
forfrends [?]
количество колонок = 0
Это не количество колонок, это количество строк во второй колонке, количество колонок определяет как раз UBound($aArray, 0).

Как в таком случе применять пример из НЕофициальныйого FAQ AutoIt

Код:
If Ubound($vArray) = 2 Then
    ;... код программы...
EndIf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
Просто для меня не совсем понятно как проверить массив на массивность и его размерность если он двух-элементный а не двухмерный.
Я не особо понимаю в чем разница...

Код:
$coordPs = PixelSearch( $x3-5, $y3-5, $x3+5, $y3+5, 0x8CB6B9, 20)
If IsArray($coordPs) And Ubound($coordPs) = 2 Then
    .;... код программы...
EndIf


если так написать то это правильно или нет?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
forfrends [?]
как проверить массив на массивность
IsArray.

его размерность если он двух-элементный а не двухмерный
Размерность это число колонок, проверяется через Ubound($aArray, 0).

не особо понимаю в чем разница
Двумерный массив означает что у него две колонки.

если так написать то это правильно или нет?
Правильно, но IsArray($coordPs) в данном случае лишняя проверка, т.к Ubound вернёт 0 если это не массив.

Всё это есть в справке и в Неоф. FAQ'е.
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
Спасибо!
перестроил код и вместо @Error использую Ubound
Ошибки не возникает, что очень радует.
Спасибо за помощь и терпение!
 
Верх