Что нового

[Массивы] Массив состроковыми индексами (или структура)

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
А можно организовать массив в программе, где к элементам массива можно обращаться по строковым индексам, а не по числовым?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
А зачем?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Vlasssov
Можно, наверное, через _ArraySearch(), но абсолютно согласен CreatoR`ом, зачем?
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Я тут пишу модуль, который без использования IE позволяет получить список всех картинок в html документе. У тега ING есть несколько параметров, можно все теги засунуть в двумерный массив, но все время придется вспоминать, под каким номером какой параметр. Помощь посмотрел - не нашел ничего.. Было бы хорошо вот так

Код:
$tag[1,"src"]


получать данные, но видимо не получиться..
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Vlasssov
Да было бы не плохо, но Autoit не поддерживает ассоциативные массивы. :(

CreatoR
madmasles
Как зачем?! Согласитесь иной раз удобнее обратится к массиву так $Array['name'] чем так $Array[5]!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Остается только завести второй массив, содержащий индексы и соответствующие им имена...
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Yashied сказал(а):
Остается только завести второй массив, содержащий индексы и соответствующие им имена...
Так обращаться все равно придется по числам... Вообщем предчусвтия меня не обманулии..
Тогда вот аткой вопрос: объектная модель как-то поддерживается, отому как при получении списка ссылок через
_IEImgGetCollection

Каждый компонент такую вот структуру поддерживает
$oImg.src
(взято из help):

Код:
#include <IE.au3>
$oIE = _IECreate ("http://www.autoitscript.com/")
$oImgs = _IEImgGetCollection ($oIE)
$iNumImg = @extended
MsgBox(0, "Img Info", "There are " & $iNumImg & " images on the page")
For $oImg In $oImgs
    MsgBox(0, "Img Info", "src=" & $oImg.src)
Next
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Vlasssov [?]
Каждый компонент такую вот структуру поддерживает $oImg.src
Так это же не массив! Это метод объекта! Проще говоря внутренняя функция.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Vlasssov [?]
объектная модель как-то поддерживается
AutoItObject UDF


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

Garrett [?]
Как зачем?! Согласитесь иной раз удобнее обратится к массиву так $Array['name'] чем так $Array[5]!
Я сколько уже кодирую, ни разу не возникала такая необходимость.

Можно например так поизвращаться:

Код:
Dim $aMyArr[2][2] = [["href", "http://Url.com"], ["src", "http://Image.png"]]

ConsoleWrite(_Array($aMyArr, "src") & @LF)
ConsoleWrite(_Array($aMyArr, "href") & @LF)

Func _Array(ByRef $aArr, $sElmnt)
	For $i = 0 To UBound($aArr)-1
		If $aArr[$i][0] = $sElmnt Then
			Return $aArr[$i][1]
		EndIf
	Next
	
	Return SetError(1, 0, -1)
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
CreatoR
CreatoR сказал(а):
Вот спасибо CreatoR за ссылку! Тоже гляну что за UDF, сам много раз задумывался над возможностью ООП внутри Autoit

CreatoR
Да в принципе возможностей работы с массивами в Autoit`е вполне хватает, просто порой было бы удобнее использовать ассоциативный массив.
Ваш пример хорош, я бы даже сказал что это вовсе не извращение ;D
Но всё же немного не то ;)

Пример использования ассоциативного массива: (если бы поддерживался)
Код:
#include <IE.au3>
$aIE['links'] = Array[['href',''],['innertext','']]
$aIE['img'] = Array[['src',''],['alt','']] 
$oIE = _IECreate()
$oLinks = _IELinkGetCollection($oIE)
	For $oLink In $oLinks
		$aIE['links']['href'] = $oLinks.href
		$aIE['links']['innertext'] = $oLinks.innertext
	Next
$oImages = _IEImgGetCollection($oIE)
	For $oLink In $oLinks
		$aIE['img']['src'] = $oLinks.src
		$aIE['img']['alt'] = $oLinks.getAttribute('alt')
	Next
	
_ArrayDisplay($aIE)

Ту мы используем один массив для сбора информации о тегах <a> и <img>
Разве не удобно?!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Garrett [?]
Пример использования ассоциативного массива
А как же тогда “сообщить” массиву о переборе последующих элементов (я про цикл)? там в цикле всего одна запись присваивается. Итерация всё равно нужна.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR
просто ты не кодил на других языках, по всей видимости :whistle:
к примеру Python. там есть тип переменных словарь - по сути тот же массив, но который состоит из ключа и значения. {key1:value1, key2:value2,..., keyN = valueN}. Для итераций, есть свои методы работы, типа перечисление всех ключей, всех значений и т.д. Но! самое главное достоинство такого объекта - скорость доступа к данным по имени.
К примеру. Есть у тебя массив состоящий из тех же ключей и значений. Не важно, в виде одного массива, или двух. Как получить значение соответствующее тому или иному ключу одним проходом? Ответ - никак. Нужно в цикле устроить перебор всех ключей, и если есть совпадение, то выдать его значение. А в объекте типа словарь нужно просто обратиться к словарю по ключу.
PS: в PHP/Perl кажись тоже есть подобное
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Kaster [?]
просто ты не кодил на других языках, по всей видимости
Особо не кодил, я свой поход в мир программирования сделал через батники -> AutoIt -> Vbs (да да, vbs “по нормальному” я изучил после AutoIt'а).

в объекте типа словарь нужно просто обратиться к словарю по ключу
Ну так есть же доступ к этому словарю из AutoIt'а, почему мы все им не пользуемся?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
CreatoR [?]
Ну так есть же доступ к этому словарю из AutoIt'а, почему мы все им не пользуемся?
Можно полюбопытствовать?!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Garrett [?]
Можно полюбопытствовать?
Код:
Global Const Enum $nDict_BinaryCompare, $nDict_TextCompare

_Dict_Add("AutoIt", "http://autout-script.ru")
_Dict_Add("Image", "http://autoit-script.ru/Smileys/AutoIt_Smileys/Typing_Guy.gif")
_Dict_Add("New", "Some new item")

MsgBox(64, 'Title', _Dict_Item("AutoIt"))

Func _Dict_Add($sKey, $sItem)
	If Not IsDeclared('oDict') Then
		Assign('oDict', ObjCreate("Scripting.Dictionary"), 2)
	EndIf

	Return Execute('$oDict.Add("' & $sKey & '", "' & $sItem & '")')
EndFunc   ;==>_Dict_Add

Func _Dict_CompareMode($nCompare = '')
	If $nCompare = '' Then
		Return Execute('$oDict.CompareMode("")')
	Else
		Return Execute('$oDict.CompareMode = "' & $nCompare & '"')
	EndIf
EndFunc   ;==>_Dict_CompareMode

Func _Dict_Count()
	Return Execute('$oDict.Count()')
EndFunc   ;==>_Dict_Count

Func _Dict_Exists($sKey)
	Return Execute('$oDict.Exists("' & $sKey & '")')
EndFunc   ;==>_Dict_Exists

Func _Dict_Item($sKey)
	Return Execute('$oDict.Item("' & $sKey & '")')
EndFunc   ;==>_Dict_Item

Func _Dict_Items()
	Return Execute('$oDict.Items()')
EndFunc   ;==>_Dict_Items

Func _Dict_Key($sOldKey, $sNewKey)
	Return Execute('$oDict.Key("' & $sOldKey & '") = "' & $sNewKey & '"')
EndFunc   ;==>_Dict_Key

Func _Dict_Keys()
	Return Execute('$oDict.Keys()')
EndFunc   ;==>_Dict_Keys

Func _Dict_Remove($sKey)
	Return Execute('$oDict.Remove("' & $sKey & '")')
EndFunc   ;==>_Dict_Remove

Func _Dict_RemovetAll()
	Return Execute('$oDict.RemoveAll()')
EndFunc   ;==>_Dict_RemovetAll
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Хороший объект Scripting.Dictionary!
Спасибо CreatoR!

P.S. На MSDN я на него, по-моему, натыкался. :scratch:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
IMHO, использюя объекты, мы теряем львиную долю всей привлекательности этого метода.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR [?]
Ну так есть же доступ к этому словарю из AutoIt'а, почему мы все им не пользуемся?
че-то не пойму, это вопрос настоящий или риторический. я чесгря, слыхом не слыхивал об этом объекте.
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
CreatoR сказал(а):
Код:
Dim $aMyArr[2][2] = [["href", "http://Url.com"], ["src", "http://Image.png"]]

ConsoleWrite(_Array($aMyArr, "src") & @LF)
ConsoleWrite(_Array($aMyArr, "href") & @LF)

Func _Array(ByRef $aArr, $sElmnt)
	For $i = 0 To UBound($aArr)-1
		If $aArr[$i][0] = $sElmnt Then
			Return $aArr[$i][1]
		EndIf
	Next
	
	Return SetError(1, 0, -1)
EndFunc
Ну в общем я тоже склонялся к такому решению... Но за объектную библиотеку - отдельное спасибо.
 

ZaEzzz

Новичок
Сообщения
28
Репутация
2
Я так понимаю, за год ничего не изменилось, так?
 
Верх