Что нового

Массивы Обход ограничения на размер массивов

Oki

Продвинутый
Сообщения
452
Репутация
62
Известно, что AutoIt в массиве разрешает иметь не более 16 миллионов элементов. Насмешкой выглядит при этом разрешение иметь 64 размерности. Ведь для того, чтобы размерность имела практическое применение, её собственный размер должен быть по меньшей мере 2 (кроме очень хитрых относительно полезных трюков с размером 1 по отдельным размерностям, до которых мало кто догадается, да и то сомнительной эффективности), но тогда даже 24 размерности с минимальным размером 2 по каждой дадут 16777216 элементов, что противоречит возможностям AutoIt.

Обойти это ограничение возможно различными уловками. Вопрос в том, как это сделать эффективнее всего. Для затравки и в доказательство возможности приведу одно решение с надеждой на то, что сообщество предложит (наи-)более эффективное по удобству применения и скорости выполнения.
Код:
;Dim $aTest[5000][5000] ; Эта строка закомментирована после проверочного теста, предсказуемо приведшего к ошибке.
Dim $avTable[5000] ; Имитация двумерного массива.
Dim $aiRow[5000] ; Массив для работы со строкой двумерного массива.
For $iRow = 0 To 4999
    For $iColumn = 0 To 4999
        $aiRow[$iColumn] = $iRow * $iColumn ; Составление таблицы умножения от 0 до 4999.
    Next
    $avTable[$iRow] = $aiRow ; Занесение строки в имитацию двумерного массива.
Next
$iRow = 4500 ; Тестовый первый индекс.
$iColumn = 4600 ; Тестовый второй индекс.
$aiRow = $avTable[$iRow] ; Считывание нужной строки.
MsgBox(4096, "", $iRow & " * " & $iColumn & " = " & $aiRow[$iColumn]) ; Считывание и вывод требуемого элемента.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
Для изменения даже одного элемента массива $aiRow его нужно скопировать из $avTable, изменить значение и скопировать обратно в $avTable. Это замедлит скрипт.
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
62
Для изменения даже одного элемента массива $aiRow его нужно скопировать из $avTable, изменить значение и скопировать обратно в $avTable. Это замедлит скрипт.
А полностью вопрос читать пробовал?
 

RaZum

Знающий
Сообщения
78
Репутация
14
Можно просто лепить строчки через разделитель - много элементов в одном элементе, упорядоченное расположение даст возможность применять своеобразные индексы. Хотя какая цель, такое будет и решение.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
А полностью вопрос читать пробовал?
Где вопрос? Ни одного вопросительного знака нет.
Можно просто лепить строчки через разделитель - много элементов в одном элементе, упорядоченное расположение даст возможность применять своеобразные индексы.
Будет еще медленнее.
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
62
Вопрос в том, как это сделать эффективнее всего.
Где вопрос? Ни одного вопросительного знака нет.
Таки не пробовал полностью читать. И да, по правилам русского языка вопросительный знак в такой конструкции не ставится, иначе это приводит к совсем другому вопросу (о том, не в этом ли вопрос).
Сообщение автоматически объединено:

Между прочим, даже приведённое выше решение без значительных переделок можно сделать значительно поэффективнее, но менее удобно, если вместо занесения строки в промежуточный массив путём копирования передать эту строку (как элемент внешнего массива) по ссылке. Но полагаю, что это тоже далеко не самое эффективное и удобное, что можно выжать из AutoIt для этой цели. Я же не настаиваю на том, что уловка должна быть именно предложенного характера. Она приведена лишь для того, чтобы показать, что место для поиска решения существует в принципе.
 
Последнее редактирование:
Верх