Что нового

Помогите найти ошибку с доступом к содержимому массива

Danneborg

Новичок
Сообщения
7
Репутация
0
Вот так объявлен массив с персонажами:
Код:
Global $char1[5] = ["Char1","miner",189,TimerInit(),1]
Global $char2[5] = ["Char2","miner",189,TimerInit(),1]
Global $char3[5] = ["Char13","miner",189,TimerInit(),1]
Global $allchars[3] = [$char1,$char2,$char3]


Вот так я перебираю все значения:

Код:
While 1
   For $i = 0 To 2 Step 1
      Local $stats = $allchars[$i]
         If TimerDiff(($allchars[$i])[3]) < ($allchars[$i])[4] Then ; проверка на таймер
            ExitLoop
         EndIf
      $allchars[$i] = MainFunc($stats)
   Next
WEnd


Когда какое то действие запускает таймер на каком либо персонаже выскакивает такая ошибка

Код:
: ==> Subscript used on non-accessible variable.:
If TimerDiff(($allchars[$i])[3]) < ($allchars[$i])[4] Then
If TimerDiff(($allchars[$i])^ ERROR
Подскажите пожалуйста в чем проблема(
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Re: Помогите найти ошибку

Что возвращает MainFunc?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Помогите найти ошибку

Danneborg

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Помогите найти ошибку" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Администратор.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Re: Помогите найти ошибку

Код:
TimerDiff ( handle )
Возвращает разницу во времени от предыдущего вызова TimerInit().
handle - Метка времени возвращённая предыдущим вызовом TimerInit. А у Вас Что ?
 

Ksaan

Знающий
Сообщения
207
Репутация
15
Re: Помогите найти ошибку

Код:
Global $Time0, $Time1, $Time2
Global $char1[5] = ["Char1","miner",189, $Time0 = TimerInit(),1]
Global $char2[5] = ["Char2","miner",189, $Time1 = TimerInit(),1]
Global $char3[5] = ["Char13","miner",189, $Time2 = TimerInit(),1]
 

Wolfik_s_b

Новичок
Сообщения
7
Репутация
0
Подскажите, уважаемые, и мне с проблемой доступа к элементу массива в цикле.
Код такой:
Код:
Global $status_button=ControlGetPos("XXXXXXX","","[CLASS:OWL_Window; INSTANCE:21]")
	Do
		$status_button=ControlGetPos("XXXXXXX","","[CLASS:OWL_Window; INSTANCE:21]")
	Until $status_button[2] = 58
	MsgBox(4096, 'OK', $status_button[2])
	Exit

Ошибка
Код:
==> Subscript used on non-accessible variable.:
вываливается на строке Until...
Смысл в том, что объект меняет ширину. Пока ширина не стала равной 58, обращаемся к объекту и получаем значение его ширины.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Wolfik_s_b
Код:
Until Not @error And $status_button[2] = 58
 

Wolfik_s_b

Новичок
Сообщения
7
Репутация
0
InnI сказал(а):
Wolfik_s_b
Код:
Until Not @error And $status_button[2] = 58
Спасибо! :beer: Это вариант помог. Не могли бы объяснить почему необходимо именно так прописывать? Внутри цикла делал проверку на массив - является массивом, внутри цикла выводил окно с текстом ширины объекта - выводится. А вот почему на мой первоначальный синтаксис ругается на недоступную переменную? Хочу понять, чтобы в дальнейшем не натыкаться уже. :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Wolfik_s_b
почему необходимо именно так прописывать
Не обязательно именно так. Можно и внутри цикла проверять, как вы делали. Тут важно КАК проверять. Если проверять так
Код:
Do
  $status_button = ControlGetPos("XXXXXXX","","[CLASS:OWL_Window; INSTANCE:21]")
  If Not IsArray($status_button) Then ContinueLoop
Until $status_button[2] = 58
то будет ошибка, т.к. ContinueLoop отправляет на проверку условия, а не в начало цикла. Поэтому правильно так
Код:
Do
  $status_button = ControlGetPos("XXXXXXX","","[CLASS:OWL_Window; INSTANCE:21]")
  If IsArray($status_button) And $status_button[2] = 58 Then ExitLoop
Until 0
Естественно, в данном случае IsArray можно заменить на Not @Error.
 

Wolfik_s_b

Новичок
Сообщения
7
Репутация
0
Не, это я понимаю, не совсем у меня укладывается такой момент - почему без "проверки на массив" цикл не работает, если массив есть... Т.е. если я в цикле пропишу
Код:
Do
  $status_button = ControlGetPos("XXXXXXX","","[CLASS:OWL_Window; INSTANCE:21]")
  If IsArray($status_button) Then
      MsgBox(4096, "Переменная является массивом", 'ширина ' & $status_button[2])
  Else
      MsgBox(4096, "Ошибка", "Данные не являются массивом.")
  EndIf
Until $status_button[2] = 58
  MsgBox(4096, 'OK', $status_button[2])
  Exit

проверка на массив есть, но конструкция не работает... Иными словами, почему если условие пойдет по ветке "НЕТ", то цикл не заработает, а выдаст ошибку?


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

:laugh: :laugh: :laugh: Понял!!!! Получается, что если идем по ветке "НЕТ" условия, то переменная $status_button будет иметь значение "0", и проверка условия выполнения цикла как раз и будет ругаться, что переменная не является массивом, к элементу которого обращаемся... Поправьте, если не правильно понял :smile:
 
Верх