Что нового

[Автоматизация] Ошибка при сравнении числа с массивом

AndreySeVeN

Новичок
Сообщения
26
Репутация
0
Как сравнить число с массивом?
Код:
While(1)
$Mem_Read = _MemoryRead('0x' & '002A6DBC' , $MemoryOpen) ; читаем значение из адреса
ToolTip($Mem_Read,0,0) ; выводим результат в tooltip
For $i = 0 To UBound($mas) - 1
   If ($mas[$i] > $Mem_Read) And ( $mas[$i+1] < $Mem_Read) Then
	  MouseDown("LEFT")
   Else
	  MouseUp("LEFT")
   EndIf
   Next
WEnd

Как сравнить массив с числом в $Mem_Read

Выдает ошибку
==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
If ($mas[$i][0] > $Mem_Read) And ( $mas[$i+1] < $Mem_Read) Then
If (^ ERROR
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Так как у вас всё-таки в программе написано?
Код:
$mas[$i]
; или
$mas[$i][0]
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Тогда приводите полный текст скрипта. Потому как ругается на размерность массива. А какая она у вас не понятно.
 
Автор
A

AndreySeVeN

Новичок
Сообщения
26
Репутация
0
А что же мне делать? Нужно сравнить &mas[&i + 1]


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

Код:
#include <NomadMemory.au3> ; подключаем библиотеку работы с памятью
#include <file.au3>
#Include <Array.au3>

$vData = FileRead( 'Beta1.txt' )
$mas =  StringRegExp( $vData, '(?smi)^\d+,\d+,(\d+)', 3)

$PID = ProcessExists( "123.exe" ) ; узнаём pid процесса
$MemoryOpen = _MemoryOpen($PID) ; открывает процесс для работы с его памятью

While(1)

$Mem_Read = _MemoryRead('0x' & '002A6DBC' , $MemoryOpen) ; читаем значение из адреса
For $i = 0 To UBound($mas) - 1
   If ($mas[$i]> $Mem_Read) And ($mas[$i+1] < $Mem_Read) Then
	  MouseDown("LEFT")
   Else
	  MouseUp("LEFT")
   EndIf
   Next
WEnd


полный код.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
AndreySeVeN [?]
А что же мне делать?
Думать!
Что вы хотите сравнить?
Если вы сравниваете значение из соседней ячейки, то пишите
Код:
UBound($mas) - 2
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
AndreySeVeN сказал(а):
А что же мне делать? Нужно сравнить &mas[&i + 1]


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



Код:
For $i = 0 To UBound($mas) - 2 ; 2 вместо 1.  Возможно нужен и Step 2, но это надо смотреть, что вы хотите получить
   If ($mas[$i]> $Mem_Read) And ($mas[$i+1] < $Mem_Read) Then
 
Автор
A

AndreySeVeN

Новичок
Сообщения
26
Репутация
0
Я хочу сравнить первый массив и второй, второй и третий, третий и четвертый и т.д. Сравниваю с числом $Mem_Read


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

Код:
While(1)
If $Run = 1 Then
$Mem_Read = _MemoryRead('0x' & '002A6DBC' , $MemoryOpen) ; читаем значение из адреса
For $i = 0 To UBound($mas) - 2 step 2
   If ($Mem_Read > $mas[$i]) And ($Mem_Read < $mas[$i+1]) Then
	  MouseDown("LEFT")
   Else
	  MouseUp("LEFT")
   EndIf
Next
EndIf
WEnd


Комп зависает очень сильно.


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

Зависание исправил. Только вот не правильно он как то значение массива сравнивает
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
AndreySeVeN
Step не нужен.
 
Автор
A

AndreySeVeN

Новичок
Сообщения
26
Репутация
0
убрал степ. Но программа почему то просто тупо кликает много раз без остановки. Хотя левая кнопка должна быть нажатой
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
AndreySeVeN [?]
Но программа почему то просто тупо кликает много раз без остановки
Какая логика у скрипта, такой и результат!
У вас если условие верно, выполняется
Код:
MouseDown("LEFT")

если нет, выполняется
Код:
MouseUp("LEFT")

Глупо считать что все значения массива равны значению в переменой $Mem_Read. Иначе зачем нужно условие?
 
Автор
A

AndreySeVeN

Новичок
Сообщения
26
Репутация
0
Массивы разные конечно. В первом 6000, во втором 11000. И между 6000 и 11000 он должен зажать левую кнопку мышки.
В третьем значении массива 12000 , в четвертом 15000. Между 11000 и 12000 он должен отпустить кнопку мыши. И потом между 12000 и 15000 должен ее зажать. Вот такая по идеи должна быть логика. А на практике он просто много раз кликает


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

$Mem_Read всегда меняется. Представь, каждую миллисекунду к нему прибавляется 1. Это как очень быстрый секундомер.
И когда его значение достигает значения массива, происходит действие мышкой


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

Вот что я надумал, но работает очень криво.
Код:
If ($Mem_Read > $mas[$i]) And ($Mem_Read < $mas[$i+1]) Then
	  MouseDown("LEFT")
   ElseIf ($Mem_Read > $mas[$i+1]) And ($Mem_Read < $mas[$i+2]) Then
	  MouseUp("LEFT")
   EndIf
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
AndreySeVeN сказал(а):
Я хочу сравнить первый массив и второй, второй и третий, третий и четвертый и т.д.....
AndreySeVeN, у вас не первый, второй, третий массивы, а элементы одного и того же массива. Это чтобы не путаться.
Если у вас этих элементов массива не много, то можно их по другому перечислить. Например так
Код:
$n = 0
$lb = False
While 1
	$n += 1
	;Это вместо паузы, а то проскакивает и не видно
	For $i = 1 To 10000
	Next
	;----------------------------------------------
	Switch $n
		Case 6000 To 11000, 12000 To 15000		;Здесь промежутки в которых надо зажать
			If Not $lb Then
				ToolTip($n & " Зажали")			;MouseDown("LEFT")
				$lb = True
			EndIf
		Case 11000 To 12000, 15000 To 16000		;Здесь промежутки в которых надо отпустить
			If $lb Then
				ToolTip($n & " Отпустили")		;MouseUp("LEFT")
				$lb = False
			EndIf
	EndSwitch
	If $n > 16000 Then Exit
WEnd
 
Верх