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

топ 100 блогов alex_dragon06.01.2022

Жить стало лучше, жить стало веселей. Наконец случилось долго ожидаемое чудо: к Ависинту (точнее к 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



Короче, при таком подходе пытаться впихнуть всё в одну строку накладно и не очень удобно, проще, наверное, работать с отдельными переменными и одномерными массивами, а потом уже из них складывать итоговый многомерный.

Оставить комментарий

Архив записей в блогах:
Не пожадничали и дали мне визу на год - это значит в следующие 12 месяцев обязательно будут еще поездки, при готовой визе они всегда случаются ;) Так было когда французы дали на год в прошлый раз, а до этого финны на полгода ( их я за это тоже очень люблю ;)) ) Вообще, всего я 5 раз в ...
У меня была мечта познакомится с акулами российского бизнеса. С господами: ...
Еву я ждала в гости с огромным нетерпением. Они с мужем во вторник вернулась из Парижа. Это было долгожданное путешествие, которое по разным причинам приходилось переносить, не ехать, отказываться. И вдруг перед самым Старым Новым Годом все звезды выстроились в одну прямую линию и Ева с Иг ...
За страхом или нежеланием иметь детей случаются забавные переносы. Но копать приходится в обоих случаях. Иногда женщина заявляет «Не хочу ребенка», но стоит копнуть, в результате выясняется, что реально-то хочет, но боится. И страхов бывает такой «богатый» набор, что глаза ...
В комментариях к посту о женщине, которая родила троих детей будучи в браке не от мужа ( https://amazonkal.livejournal.com/652695.html ), некоторые комментаторы назвали ее шлюхой и дурой... Мне что-то вспомнилась история другой женщины, которая примерно такого же возраста как Лидия, ...