Что нового

[Массивы] Перекладываем значения из массива в массив

eropov

Jury
Сообщения
195
Репутация
25
День добрый, всем!
Практики работы с массивами у меня нет, поэтому сижу и туплю.
Есть массив (Dim $aArray[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"],["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]) с которым нужно работать.
Суть состоит в том что, получаем строки (строки такие же как и в массиве сверху) в одномерный массив и на основе этих строк перекладываем значения $aArray[4][9] в другой массив [4][9]

Вот болванка она работает не правильно (плохо ищет)
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"],["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
For $i=0 To 20
$aa = StringRegExp($aKolod[$i], '([cdhs][67891JQKA]\.gif)', 1, $i)
;$aA = StringRight ($aa, 4)
_ArrayDisplay($aa)
$ai = _ArraySearch ($aKoloda,$aa,$i)
MsgBox(1,$aa,$ai)
_ArrayDisplay($ai)
Next
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Приведите пример массива до и после перекладывания, а то ничего не понятно.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Условие задачи малопонятно
Исходя из того что я понял:
Код:
#include<Array.au3>
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _ 
	["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
_ArrayDisplay($aKoloda)
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
$sString=_ArrayToString($aKolod,"|")
$sString=StringReplace($sString, ".gif", "")
MsgBox(4096, "" , $sString)
Dim $aArray[4][9]
For $i=  0 To UBound($aKoloda, 1)-1
	For $j=0 To UBound($aKoloda, 2)-1						
		If StringInStr( $sString, $aKoloda[$i][$j]) Then
			$aArray[$i][$j]=$aKoloda[$i][$j]
		EndIf
	Next		
Next	
_ArrayDisplay($aArray, "$aArray")
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
gregaz

1)Условие задачи состоит в том, что создаем массив
Dim $aArray[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"],["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
2)К нам приходит второй массив со значениями как и в первом, но с меньшим кол-вом
3)Сама задача в том, что нужно на основе значений второго массива брать эти значения из первого и перекладывать в третий (заранее созданный Global $aArrEnd)
В итоге должен получиться цикл который на основе второго массива должен перекладывать из 1 в 3 массив при этом в 1 значения должны быть именно переложены
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Понятнее не стало.
И та к будет пока ты не приведешь короткий пример
с исходным массивом и массивом- результатом
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Есть массив(будет исходным массивом)
Dim $aArray[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"],["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Приходит массив 2 (в этом массиве не будет повторяющихся значений только на первом заходе)
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
Должен получиться массив 3 (будет массивом- результатом)
Dim $aArray[4][9] = [["","","","","","dJ","","",""],["c6","","","","","","","",""],["","","","s9","","sJ","","",""],["","","","","","hJ","","","hA"]] при этом массив 1 становиться таким
Dim $aArray[4][9] = [["d6","d7","d8","d9","d1","","dQ","dK","dA"],["","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","","s1","","sQ","sK","sA"],["h6","h7","h8","h9","h1","","hQ","hK",""]] суть в том чтобы в 1 и 3 массивах индексы оставались а значения в них были пусты(в итоге все значения 1 массива перейдут в 3 массив)
(Я знаю что в других языках программирования можно создать массив констант, тогда 1 и 3 массивы били массивами констант)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Ну так в моем примере все почти сделано
Надо добавить обнуление ячеек исходного массива так:
Код:
#include<Array.au3>
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _ 
	["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
_ArrayDisplay($aKoloda)
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
$sString=_ArrayToString($aKolod,"|")
$sString=StringReplace($sString, ".gif", "")
MsgBox(4096, "" , $sString)
Dim $aArray[4][9]
For $i=  0 To UBound($aKoloda, 1)-1
	For $j=0 To UBound($aKoloda, 2)-1						
		If StringInStr( $sString, $aKoloda[$i][$j]) Then
			$aArray[$i][$j]=$aKoloda[$i][$j]
			$aKoloda[$i][$j]=''
		EndIf
	Next		
Next	
_ArrayDisplay($aArray, "$aArray")
_ArrayDisplay($aKoloda, "$aKoloda")
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Спасибо тебе ОГРОМНОЕ gregaz какой раз выручаешь, сейчас буду модернизировать
Как переделать код в функцию с входным параметром массив 2 (У меня массив 2 это функция возвращающая массив)
Я попробовал код на реальном примере и массивы 1 и 3 не перезаписываются. Как быть?
нужно создать функцию которая будет перекладывать значения из массива 1 в массив 3 до тех пор пока массив 1 не опустеет
а в массив 3 перейдут все значения
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
eropov [?]
как переделать код в функцию с входным параметром массив 2 ещ
Так:
Код:
#include<Array.au3>
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _ 
    ["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]

$aArray=ArrayUpdate($aKoloda,$aKolod)
_ArrayDisplay($aArray, "$aArray")
_ArrayDisplay($aKoloda, "$aKoloda")	
	
Func ArrayUpdate(Byref $avArray,$a1)
	Dim $aRet[UBound($avArray)][UBound($avArray, 2)]
	$sString=_ArrayToString($a1,"|")
	$sString=StringReplace($sString, ".gif", "")
	For $i=  0 To UBound($aKoloda, 1)-1
		For $j=0 To UBound($aKoloda, 2)-1                       
			If StringInStr( $sString, $aKoloda[$i][$j]) Then
				$aRet[$i][$j]=$aKoloda[$i][$j]
				$avArray[$i][$j]=''
			EndIf
		Next        
	Next    
	Return $aRet
EndFunc
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
У меня вот так не перезаписывает
Код:
#include <IE.au3>
#include <Array.au3>
#include <Karti.au3>
;Создаем массив 
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"],["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
;_ArrayDisplay($aKoloda)
	Dim $aKarti[20]
	$aKarti = Karti() ;Функция возвращает массив 2
	;_ArrayDisplay($aKarti)
$aArray=ArrayUpdate($aKoloda,$aKarti)
_ArrayDisplay($aArray, "$aArray")
_ArrayDisplay($aKoloda, "$aKoloda")

Func ArrayUpdate(Byref $avArray,$a1)
    Dim $aRet[UBound($avArray)][UBound($avArray, 2)]
	$sString=_ArrayToString($aKarti,"|")
	$sString=StringReplace($sString, ".gif", "")
    For $i=  0 To UBound($aKoloda, 1)-1
        For $j=0 To UBound($aKoloda, 2)-1
            If StringInStr( $sString, $aKoloda[$i][$j]) Then
                $aRet[$i][$j]=$aKoloda[$i][$j]
                $avArray[$i][$j]=''
            EndIf
        Next
    Next
    Return $aRet
EndFunc
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Вот код Функции (при многократном запуске происходит утечка памяти, в чем причина?)
Код:
#include <IE.au3>
#include <Array.au3>
Func Karti()
Dim $sUrl = "C:\Documents and Settings\Dima\Мои документы\Downloads\1..htm" ; url для теста.
$oIE = _IECreate($sUrl,1,1,1,1) ;В этом месте вылазит ошибка функции _
_IETableGetCollection($oIE) ;(--> IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch (Виной тому второй параметр(_IECreate($sUrl,1, ..,..,..)параметр не работает открывает уже открытое окно, но только тогда, когда $sUrl сохраненный 1..htm на жестком диске))
If @error Then Exit
For $i = 20 To @extended -18 ; Таблиц много поэтому начинаем с 20 и присикаем остальные -18
    $aTable = _IETableGetCollection($oIE, $i)
        If $aTable.cellspacing = "1" And $aTable.cellpadding = "1" And $aTable.width = "100%"Then ;проверяем таблицу (с теми ли она параметрами)
            $oTR = _IETagNameGetCollection($aTable,"tr",2)
			$oTD = _IETagNameGetCollection($oTR,"td",1)
				Dim $aLinks[1]
				$z = 0
				$oLinks = _IETagNameGetCollection($oTD,'img')
				For $oLink In $oLinks
					If StringRegExp($oLink.src, '([cdhs][67891JQKA]\.gif)') Then
					$z += 1
					ReDim $aLinks[UBound($aLinks) + 1]
					$aLinks[$z] = $oLink.src
					EndIf
				Next
				;_ArrayDisplay($aLinks)
        EndIf
Next
Return $aLinks
EndFunc

что возвращает $aKarti = Karti() (Я не понял почему выдает массив не с нуля)
0)
1)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/dJ.gif
2)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/c6.gif
3)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/hJ.gif
4)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/hA.gif
5)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/s9.gif
6)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/sJ.gif
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Сейчас выдает с 0, но 6 элемент пустой

0)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/dJ.gif
1)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/c6.gif
2)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/hJ.gif
3)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/hA.gif
4)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/s9.gif
5)file:///C:/Documents%20and%20Settings/Dima/Мои%20документы/Downloads/1._files/sJ.gif
6)

Осталась проблема с перезаписью 1 в 3 массивы
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
eropov [?]
Сейчас выдает с 0, но 6 элемент пустой
Сделай так:
Код:
;...........
$z+=1
ReDim $aLinks[$z]
$aLinks[$z-1]=$oLink.src
;.............




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

Наверное придется вырезать из ссылки путь,чтобы привести массив к виду:
Код:
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
Код:
$z+=1
ReDim $aLinks[$z]
$aLinks[$z-1] =StringRegExpReplace( $oLink.src, '^.*[\\/]','' )
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Функция ArrayUpdate(массив 1, массив 2) работает немного не так. Он берет в качестве первого параметра массив 1 , в качестве второго массив 2. После возвращает массив 1 в измененном варианте(т.е. массив 3) и массив 2 в том состоянии в котором он пришел. А нужно чтобы, возвращаемый массив 3 перезаписывал массив 1, тогда массив 1 будет перезаписываться, каждый раз перезаписанный массив 1 попадая в функцию ArrayUpdate(массив 1, массив 2) его значения будет постепенно переходить в массив 3 :whistle:
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Для этого достаточно перенести объявление нового массива в голову скрипта:

Убрать изи ф-ии ArrayUpdate
Код:
Dim $aRet[UBound($avArray)][UBound($avArray, 2)]


И объявить его в голове скрипта
где-то так:
Код:
#include<Array.au3>
Dim $aKoloda[4][9] = [["d6","d7","d8","d9","d1","dJ","dQ","dK","dA"],["c6","c7","c8","c9","c1","cJ","cQ","cK","cA"],["s6","s7","s8","s9","s1","sJ","sQ","sK","sA"], _ 
    ["h6","h7","h8","h9","h1","hJ","hQ","hK","hA"]]
Dim $aKolod[6] = ["dJ.gif","c6.gif","hJ.gif","hA.gif","s9.gif","sJ.gif"]
;Dim $aArray[UBound($avArray)][UBound($avArray, 2)]; ************************
Dim $aArray[UBound($aKoloda)][UBound($aKoloda, 2)]; ************************
ArrayUpdate($aKoloda,$aArray, $aKolod); ************************
_ArrayDisplay($aArray, "$aArray")
_ArrayDisplay($aKoloda, "$aKoloda") 
    
Func ArrayUpdate(Byref $avArray,Byref $aRet, $a1)
    ;Dim $aRet[UBound($avArray)][UBound($avArray, 2)]
    $sString=_ArrayToString($a1,"|")
    $sString=StringReplace($sString, ".gif", "")
    For $i=  0 To UBound($aKoloda, 1)-1
        For $j=0 To UBound($aKoloda, 2)-1                       
            If StringInStr( $sString, $aKoloda[$i][$j]) Then
                $aRet[$i][$j]=$aKoloda[$i][$j]
                $avArray[$i][$j]=''
            EndIf
        Next        
    Next    
    Return $aRet
EndFunc
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Компилятор ругается на то что $avArray не декларирована
Там кажется надо добавить проверку на то, что, $aRet вошел в функцию
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
eropov [?]
Компилятор ругается на то что $avArray не декларирована
Писал на коленке перед уходом.
Исправил на :
Код:
Dim $aArray[UBound($aKoloda)][UBound($aKoloda, 2)]; ************************
 
Верх