Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Ассоциативные массивы об ассоциативных массивах

Ассоциативные массивы это маленькое чудо IDA. Большинству программистам возможно ранее никогда не приходилось сталкиваться ни с чем подобным. К сожалению, о них очень мало (ну совсем ничего) не сказано в контекстной помощи, поэтому будет не лишим остановиться на них и рассмотреть подробнее.

Один из распространенных языков, поддерживающим такие конструкции можно назвать Perl, который ввиду свой кросс - платформенности стал очень популярен среди разработчиков Internet – приложений. Но многие тысячи поклонников Си и Pascal могли и вовсе не слышать о нем, а уж тем более изыскивать время для досконального изучения.

Когда-то авторитет программиста зависел от числа освоенных им языков. Сегодня же ситуация переменилась – разработчики предпочитают сосредоточиваться не только на одном языке, но даже компиляторы, зачастую совершенно не интересуясь, что происходит у «соседей».

К сожалению, ставшие популярными языки многие конструкции реализуют далеко не лучшим образом, если вообще реализуют это. Так случилось и с ассоциативными массивами.

Чем они отличаются от своих собратьев? И какие возможности предоставляют при этом?

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

Это позволят значительно упрощать многие алгоритмы, раньше выглядевшие громоздкими, - например, пусть нам требуется составить таблицу, перечисляющую имена сотрудников и получаемую ими зарплату.

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

Насколько же проще решается задача с использованием ассоциативных массивов Кроме этого можно придумать массу других примеров.

Архитектура ассоциативных массивов

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

Ассоциативные массивы создаются вызовом функции CraeteArray, точно так же как и обычные разряженные. Кроме того, любой массив по сути одновременно является и разряженным и ассоциативным. Точнее, масивов на самом деле все же несколько, но идентификатор (ID) у всех может быть один.

Поэтому к ассоциативным массивам применимы описанные выше функции RenameArray и DeleteArray.

Новым является набор менее чем из десятка функций работающий со строковыми индексами. Вообще же в терминологии ассоциативных массивов индексы называются ключами.

Каждый ключ предстваляет собой строковое значение без явных ограничений (во всяком случае в контекстой помощи IDA на этот счет ничего не сказано) и может содержать один элемент типа «строка» или «длинное целое»

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

В остальном же операции с элементами ассоциативных массивов ничем не отличаются от уже описанных выше. Собственно всеми манипуляциями заведут всего три функции.

Элемент можно присвоить, прочитать, и, наконец, удалить. На этом предоставляемые IDA возможности заканчиваются.

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

На самом деле для этого существуют традиционные функции GetNext и GetPrev. Очевидно, что они перечисляют ключи (то есть индексы) массива один за другим, но вот в каком порядке?

Вообще-то это не документировано, и поэтому стоит проектировать код скрипта так, чтобы его работоспособность не зависела от подобного рода деталей. Но как нетрудно убедиться, все текущие версии IDA упорядочивают список индексов в алфавитном порядке, не зависимо от очередности создания элементов.

Необходимо заметить, что некоторые языки упорядочивают индексы ассоциативных массивов именно в порядке их создания, и никем не гарантируется, что так не будет и в следующих версиях IDA (хотя, это конечно, очень маловероятно).

Однако, ваш скрипт не должен завистеть от этих деталей.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]