Что нового

Перенос данных из одного массива в другой

MCR

Новичок
Сообщения
22
Репутация
0
Можно ли перенести данные из одного массива в другой?
Как это сделать?

Код:
Dim $aTest[1][2]
$coord=PixelSearch(0, 0, 880, 560, 0xF17272, 10)
$aTest[1][2]=[$coord[0], $coord[1]]


Пробовал по разному, не выходит.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <array.au3>

Local $array[1][2]
$array[0][0] = 1
$array[0][1] = 2
_ArrayDisplay($array,'Исходный массив')
Local $array_new[1][2]
$array_new[0][0] = $array[0][0]
$array_new[0][1] = $array[0][1]
_ArrayDisplay($array_new,'Новый массив')


вот пример с функцией, которая возвращает в массиве список файлов
Код:
#include <array.au3>
#include <File.au3>
$ff = FileSelectFolder('','')
$array_f = _FileListToArray($ff)
_ArrayDisplay($array_f)
Local $array[UBound($array_f)]
_ArrayDisplay($array)
For $i = 0 To UBound($array_f) - 1
	$array[$i] = $array_f[$i]
Next
_ArrayDisplay($array)
 
Автор
M

MCR

Новичок
Сообщения
22
Репутация
0
Спасибо за примеры, а почему мой вариант не работает? (библиотека подключена) Планирую сделать так, чтобы с каждым новым шагом цикла массив coord передавал значения в конец массива Test, который бы их все хранил
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
MCR [?]
Планирую сделать так, чтобы с каждым новым шагом цикла массив coord передавал значения в конец массива Test, который бы их все хранил

Код:
#Include <Array.au3>

Global Const $_MAX = 100
Global $aCoord, $aTest[$_MAX][2] = [ [ 0 ] ]
; ---

For $Idx = 1 To $_MAX - 1 Step 1
	$aCoord = PixelSearch( 0, 0, 880, 560, 0xF17272, 10 )
	If @Error Then
		$aTest[$Idx][0] = "Error"
		$aTest[$Idx][1] = "Error"
	Else
		$aTest[$Idx][0] = $aCoord[0]
		$aTest[$Idx][1] = $aCoord[1]
	EndIf
Next
$aTest[0][0] = $Idx - 1

_ArrayDisplay( $aTest )



Или вот такой вариант (для наглядности):
Код:
#Include <Array.au3>

HotKeySet( "{F6}", "__Stop" )

Global Const $_MAX = 10000
Global $aCoord, $Idx = 1, $aTest[$_MAX][2] = [ [ 0 ] ]
; ---

While Sleep( 200 ) And $Idx < $_MAX
	$aCoord = PixelSearch( 0, 0, 880, 560, 0xF17272, 10 )
	If @Error Then
		$aTest[$Idx][0] = "Error"
		$aTest[$Idx][1] = "Error"
	Else
		$aTest[$Idx][0] = $aCoord[0]
		$aTest[$Idx][1] = $aCoord[1]
	EndIf
	ConsoleWrite( $aTest[$Idx][0] & " " & $aTest[$Idx][1] & @CRLF )
	$Idx += 1
WEnd

Func __Stop()
	$aTest[0][0] = $Idx - 1
	ReDim $aTest[$Idx][2]

	_ArrayDisplay( $aTest )
	; ---
	Exit
EndFunc


ReDim в цикле использовать не рекомендую, так как он сильно сказывается на быстродействии скрипта, даже слишком сильно.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
MCR [?]
а почему мой вариант не работает?
ты внимательно посмотри, как присваиваются значения .

Планирую сделать так, чтобы с каждым новым шагом цикла массив coord передавал значения в конец массива Test, который бы их все хранил
если я правильно понял, то можно так


Код:
#include <array.au3>

Local $array[1][2]
Local $x = 0, $i = 1

While 1
$coord=PixelSearch(0, 0, 20, 300, 0x000000, 10)
If Not @error  Then
	ReDim $array[$i][2]
	$array[$x][0] = $coord[0]
	$array[$x][1] = $coord[1]
	$x += 1
	$i += 1
EndIf
If UBound($array,1) = 100 Then ExitLoop
Sleep(100)
WEnd

_ArrayDisplay($array)


в этом примере выход из цикла будет при достижении в массиве ста строк. можно делать не выход, а действие при каждой удачной находке пикселя


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

еще пример с созданием структуры. структура нужна, чтобы хранить данные о последнем положении пикселя. и если положение пикселя изменилось, то записывать новые координаты в наш массив
Код:
#include <array.au3>

Local $array[1][2]
Local $x = 0, $i = 1, $q
$coord = PixelSearch(0, 0, 20, 300, 0x000000, 10)
$struct = DllStructCreate('int;int')
DllStructSetData($struct, 1, $coord[0])
DllStructSetData($struct, 2, $coord[1])
$array[0][0] = $coord[0]
$array[0][1] = $coord[1]
_ArrayDisplay($array)

While 1
	$coord = PixelSearch(0, 0, 20, 300, 0x000000, 10)
	If Not @error Then
		If DllStructGetData($struct, 1) <> $coord[0] Or DllStructGetData($struct, 2) <> $coord[1] Then
			$x += 1
			$i += 1
			ReDim $array[$i][2]
			$array[$x][0] = $coord[0]
			$array[$x][1] = $coord[1]
			DllStructSetData($struct, 1, $coord[0])
			DllStructSetData($struct, 2, $coord[1])
		EndIf
	EndIf
	If UBound($array, 1) = 10 Then ExitLoop
	Sleep(100)
WEnd

_ArrayDisplay($array)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
joiner [?]
еще пример с созданием структуры. структура нужна, чтобы хранить данные о последнем положении пикселя. и если положение пикселя изменилось, то записывать новые координаты в наш массив
А структуру то зачем использовать? Не проще ли сравнивать с последним элементом массива сохраненных координат? Ваш код на все 200% запутает бедолагу.
 
Автор
M

MCR

Новичок
Сообщения
22
Репутация
0
Спасибо всем за ответы и примеры! Разобрался . Путало что при объявлении массива указывается количество строк и столбцов, а при попытке записи в массив надо указывать индексы ячейки которые для 1ой строки равны [0], а я думал что индекс первой строчки равен [1] как при объявлении :scratch:
Запланированное сделал 8)
 
Верх