Что нового

Данные, строки Максимальная длина строки

Oki

Продвинутый
Сообщения
452
Репутация
63
В справке сказано, что максимальная длина строки равна 2 ^ 31 - 1. На практике не работает даже вот такой тестовый скрипт, заполняющий строку лишь примерно вдвое меньшей последовательностью ANSI-символов (точнее, длины 2 ^ 30).
Код:
$s = "1"
For $i = 1 To 30
    $s &= $s
    If $i > 28 Then
        MsgBox(4096, "", "The cycle performed " & $i & " times.")
    EndIf
Next
При этом скрипт, генерирующий две строки длины 2 ^ 29 каждая (что в сумме составляет те же 2 ^ 30), работает нормально, так что дело не совсем в общем количестве выделенной под переменные памяти. Полагаю, что нужна какая-то инструкция, снимающая дополнительное сверх справки ограничение по умолчанию.
 

Prog

Продвинутый
Сообщения
592
Репутация
72
Скрипт x64? Потому как для x86 ограничение 2 ГБ памяти на процесс.
заполняющий строку лишь примерно вдвое меньшей последовательностью ANSI-символов
Разве в AutoIt строки не в юникоде?
 
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Скрипт x64? Потому как для x86 ограничение 2 ГБ памяти на процесс.
Не очень понятно, как эта память используется. По моим подсчётам так много не должно было бы использоваться, тем более, что скрипт, который наполнял в два раза меньшую строку, а затем удваивал данные в две переменных, отработал нормально. Но внутренняя логика использования памяти интепретатора может как-то косвенно добавлять лишние данные, а тогда результат трудно предсказуем, и такое сравнение может не работать.

Подсказка обратить внимание на разрядность помогла добиться выполнения, но только "откомпилированного" (упакованного в исполняемый файл скрипта). При простом запуске .au3-файла или прямо из SciTE-Lite ошибка не исчезает даже при добавлении в скрипт директивы #AutoIt3Wrapper_UseX64=y.
Разве в AutoIt строки не в юникоде?
В справке мне не попадалась информация, о том, как внутренне интерпретатор хранит данные. Мои первичные тесты считывали их из текстовых файлов в ANSI-кодировке, но очень может быть, что интепретатору удобнее хранить их в наиболее широком виде, что может засорять память. Но справка говорит об ограничении длины строк в 2 ^ 31 - 1 символа, а не байта, поэтому это должно работать в любом случае. Скорее всего, в итоге всё сводится именно к дополнительному ограничению за счёт 32-битной разрядности x86, которую следует отменить какой-то директивой, чтобы скрипт работал не только из .exe-файла (а также, предполагаю, при запуске "с параметрами", один из которых указывал бы на 64-битную разрядность), но и обычным путём, а также из SciTE-Lite.
 
Последнее редактирование:
Автор
Oki

Oki

Продвинутый
Сообщения
452
Репутация
63
Эти директивы обрабатывает AutoIt Wrapper, поставляемый с полной версией SciTE.
Видимо, это означает, что для классической установки AutoIt решения проблемы на все случаи не существует?
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Ряд ограничений не описаны, к примеру, опытным путём выяснено, что длина шаблона в регулярном выражении ограничена 32767 символами
 
Верх