Что нового

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

Vlasssov

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

CreatoR

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

madmasles

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

Vlasssov

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

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


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

Garrett

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

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

Yashied

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

Vlasssov

Осваивающий
Сообщения
430
Репутация
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,666
Репутация
2,463
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,666
Репутация
2,463
Garrett [?]
Пример использования ассоциативного массива
А как же тогда “сообщить” массиву о переборе последующих элементов (я про цикл)? там в цикле всего одна запись присваивается. Итерация всё равно нужна.
 

kaster

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

CreatoR

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,666
Репутация
2,463
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,716
IMHO, использюя объекты, мы теряем львиную долю всей привлекательности этого метода.
 

kaster

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

Vlasssov

Осваивающий
Сообщения
430
Репутация
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
Я так понимаю, за год ничего не изменилось, так?
 
Верх