AviSynth+ теперь с массивами!

Жить стало лучше, жить стало веселей. Наконец случилось долго ожидаемое чудо: к Ависинту (точнее к AviSynth+) прикрутили нативно поддерживаемые массивы. Всего 20 лет прошло. Меня чуть на слезу не пробило. Во время оно не было даже циклов for и while, и if'ов тоже не было — только тернарный оператор. Но таки сделали. А вот массивов всё не было. Да, вот такой удивительный язык. Но хоть что-то должно же быть в жизни хорошего — и релиз 3.7.1 аккурат под новый год порадовал. Хорошо-то как! Я прям в некоторой эйфории.
Вот решил по такому случаю зарубку на память с первыми впечатлениями оставить. Наверняка суждения поспешны и чего-то не понял вплоть до «слона и не приметил». Но слишком радостное событие, что не страшно даже неграмотным и наивным деревенщиной перед публикой предстать. Тиснул на ixbt'шном форуме, но и тут себе оставлю.
Начал смотреть, что там с массивами такое. Как всегда — в некотором изюмлении. Документация уже какая-то есть, но как-то пока не очень внятно и не всё понятно.
Во-первых, как всегда, чудеса с синтаксисом — что-то намутили, ни на что ни похожее.
Во-вторых, удивило, что массив надо предварительно объявлять, точнее инициализировать. Что для Синта совсем не характерно.
То есть штука типа a = ArrayAdd(a, b) с ходу работать не будет, надо сперва написать конструкцию
a = []
В-третьих, сломал голову как делать многомерный массив. В примерах это как-то невнятно показано. Там в основном что-то типа
a=ArrayAdd(a, [1,2]) # [[1,2]]
То есть фактически в данном примере по нулевому индексу запихивается уже готовая последовательность элементов массива. А если я не знаю заранее какие элементы в нём будут? Казалось бы, надо просто писать что-то вроде
a = ArrayAdd(a, "A", 0) a = ArrayAdd(a, "B", 0) a = ArrayAdd(a, "C", 0) a = ArrayAdd(a, "D", 1) a = ArrayAdd(a, "E", 1) a = ArrayAdd(a, "F", 1)
А вот болт. При такой попытке выплёвывает Unhadled C++ exception. Долго голову ломал, пока методом тыка не дотумкал, что a = [] — это не просто формальное объявление нулевого массива, а по сути шаблон массива. И чтобы вышеприведённое работало, нужно массив инициализировать вот таким образом:
a = [[],[]]
Вот тогда a = ArrayAdd(a, "A", 0) и т.д. работает без проблем. То есть явно объявить пустой массив из двух пустых элементов, которые сами являются массивами.
Чё-то как-то сложновато.
Балуемся: вывод таблички 10x10 c .числами от 0 до 99
BlankClip k = 9 l = k /* чтоб не писать десять раз эти квадратные скобки — некузяво как-то это выглядит, да и запросто ошибиться можно — генерируем строку инициализации массива */ for (i = 0, k) { Brackets = (i < k ) ? "[]," : "[]" ArrayPrototype = (i > 0) ? ArrayPrototype + Brackets : Brackets } ArrayPrototype = "[" + ArrayPrototype + "]" xy = Eval(ArrayPrototype) n = 0 # Набиваем массив числами от 0 до 99 for (i = 0, k) { for (j = 0, l) { xy = ArrayAdd(xy, n, i) n = n + 1 } } # и выводим полученное for (i = 0, k) { for (j = 0, l) { XYs = (xy[i, j] > 9) ? xy[i, j].string : "0" + xy[i, j].string s = (j > 0) ? s + " " + XYs : XYs } n = (i > 0) ? n + "\n" : "" s = (i > 0) ? n + s : s Subtitle(s, lsp=10, font="Consolas") }
Должно получиться что-то такое:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
Короче, при таком подходе пытаться впихнуть всё в одну строку накладно и не очень удобно, проще, наверное, работать с отдельными переменными и одномерными массивами, а потом уже из них складывать итоговый многомерный.
|
</> |