antro735
Кстати, попробуй AutoIt3 в плане программирования он полегче, быстрее будет результат при меньших телодвижениях. Нет привязки к типам данных, есть куча готовых полезных функций для автоматизации окон. Бесплатный. Я перешёл на PureBasic, так как он кроссплатформенный, а я пользуюсь также линуксом, а также возможность писать плагины например для Notepad++. Ну и также просто пришло время и желание попробовать компилируемые программы. В общем советую начать с простого, а сразу сложное может отбить желание.
PureBasic vs AutoIt
Сообщений 1 страница 19 из 19
Поделиться125.07.2022 18:08:48
Поделиться226.07.2022 16:35:16
Кстати, попробуй AutoIt3 в плане программирования он полегче, быстрее будет результат при меньших телодвижениях.
Не ради спора пишу, но как-то пробовал его и многое не понравилось.
Нельзя задать тип переменных. Variant это не универсальное решение. Не понятно как объявить массив структур.
Нет отладчика. Вообще нет методов отладки кода. Вывод в консоль это не отладка...
Ошибки вылавливаются не во время компиляции, а во время выполнения и нужно от и до тестировать приложение чтобы найти все баги включая синтаксические ошибки. Отсутствие отладчика этому не способствует.
IDE сильно уступает PB.
WinAPI нужно вызывать из dll используя не ошибаюсь DllCall. WinAPI структуры и константы во многих случаях необходимо декларировать самому...
Лично мне работать не комфортно... Складывается впечатление что язык и IDE в состоянии бета версии.
В общем советую начать с простого, а сразу сложное может отбить желание.
Не уверен что AutoIt проще. Отсутствие отладчика и упрощенный ЯП усложняют написание программ.
Может я ошибаюсь из-за слабого знания AutoIt?
Можете показать примеры в которых код AutoIt проще и понятнее чем на PB?
Поделиться327.07.2022 14:21:09
но как-то пробовал его и многое не понравилось.
Сам переход требует усилий, я с AutoIt3 тоже с трудом переходил, как будто руки отрубили и ты ничего не можешь сделать.
Нельзя задать тип переменных.
В человеческой логике когда мы мыслим нам тоже не нужен тип переменных, если нам надо сложить 2+2 мы складываем не задумываясь что это число, а если надо записать в блокнот числа тоже не задумываемся что это число или строка. Поэтому наоборот требуется усилие, чтобы привыкнуть, что в переменную строки нельзя указывать числа, а в переменную чисел нельзя писать строки.
Не понятно как объявить массив структур
а я и не знал что можно объявить массив структур, я просто элементы структуры раскладывал в двумерный массив, то есть в первом столбце ID-кнопки, во втором текст кнопки, в третьем и четвёртом координаты и т.д., то есть элемент с индексом 1 имеет в столбцах 1, 2, 3, 4 указанные данные и доступ к ним осуществляется по индексу и столбцу. Разница только в том что PureBasic имеет именованные элементы структуры, а в массиве их надо просто запоминать, что в 1 столбце такие то данные, во втором такие-то. Я даже при объявлении массива всегда писал список назначения столбцов, какие данные в нём хранятся, чтобы при длительном перерыве можно было открыть исходник и посмотреть назначения столбцов, но даже если в чужом исходнике нет, то нетрудно сделать поиск и посмотреть что туда возвращается и сделать подсказки себе.
Нет отладчика.
Я считал что AutoIt3 типа лучший отладчик, он как OnError в PureBasic, никогда прога тихо не упадёт, всегда выдаст мессагу что подает по такой то причине, хотя в скомпилированном файле не укажет строку или она будет не соответствовать исходнику и надо добавить директиву, чтобы все инклуды были включены, чтобы получить цельный исходник и правильную строку, так как AutoIt3 использует один исходник с развернутыми инклудами и считает строку исходя из него.
Я всегда боялся что компилируемые программы не могут вычислить ошибки программера и просто будут по тихому падать и никогда не узнаешь почему. То есть в AutoIt3 я не заморачивался с ошибками, мне при запуске исходника или exe-файла всегда скажет о моих ошибках и мне даже можно не задумываясь писать код, то что AutoIt3 не поймёт он выдаст это будь то синтаксическая ошибка, запрос элемента за пределами размера массива. А на других языка я боялся что если допущу ошибку, то никогда не узнаю о ней. Сейчас это развеялось PureBasic сообщает о всех синтаксических ошибках и других.
На счёт вывода в Debug, в AutoIt3 есть функция вывода в консоль, то есть любые данные можно вывести.
от и до тестировать приложение чтобы найти все баги включая синтаксические ошибки.
ни одну синтаксическую ошибку не пропустит, если забыть кавычку, скобку, знак умножения и т.д. всё сообщается иначе как он будет интерпретировать если нет закрывающей скобки. Обязательно выдаст ошибку причём с указанием строки и позиции, причём эту позицию он укажет стрелкой в мессаге. И кстати есть Au3Check.exe, но я им не пользуюсь, потому что не понимаю зачем он если AutoIt3 и без него выдаёт все ошибки.
IDE сильно уступает PB
там есть любители официального ID и выкладывают свои сборки, но я изначально использовал Notepad++ и все инструменты добавил в него, то есть я выкладывал свою сборку со всеми инструментами для нормально работы в AutoIt3. Кстати, в официальном дистрибутиве выкладывается урезанный IDE, там же на сайте есть полный IDE, просто разрабатывает его другой чел отдельно и там разница небо и земля. Также компилятор есть официальный, а есть AutoIt3Wrapper, у которого куча директив и компилируется одним кликом не открывая официальный компилятор GUI, не указывая там пути и прочее, в общем как в PureBasic в конце файла прописываются настройки: иконка, тип проги, имя файла и т.д. так и в AutoIt3Wrapper, только директивы в начале файла. Но я не изучал новую версию, как там с AutoIt3Wrapper перенесён ли он в официальную версию, так как там появились директивы #pragma compile.
WinAPI нужно вызывать из dll
Да, но все популярные функции уже присутствуют, чего нет в PureBasic. Например функция PathFindOnPath, её невозможно применить просто вызывая PathFindOnPath_(), там второй параметр - указатель на структуру массив путей, где искать кроме %Path%, так эту структуру надо делать самому и я наверно уже 3 функции делал чтобы заставить это работать, то в x32 работает, думал всё готово, а оно на x64 падает, делаю для x64 ещё какие то косяки вылазят. А в AutoIt3 она всегда была и всегда работала из коробки, там не нужен DllCall, её обёртка уже готова, а DllCall если делать самостоятельно функцию WinAPI, а они как я уже сказал большинство все сделаны, просто назовите которой там нет, там нет только узкоспециализированных, которые и не поймёшь для чего они.
Аналогично для работами с элементами окна расширенные WinAPI-функции, там для листвью 150 функций, а в PureBasic сколько?
Можете показать примеры в которых код AutoIt проще и понятнее чем на PB?
Например в AutoIt3 регулярное выражение одна функция, их 2, но они разные, но пишется одна, в одну строку
StringRegExp ( "test", "pattern" [, flag = 0 [, offset = 1]] )
то есть получаем массив всех найденных с флагом 3, флаги меняют поведение. В PureBasic надо минимум 2 и несколько переменных, а тут сразу результат.
В AutoIt есть такие функции как Send(), ControlCommand(), StringFormat(), функции работы с реестром без открыть/закрыть, а сразу сделать запись. То есть люди делали, чтобы пользователю меньше было необходимости думать над техническими деталями, то есть что ввести в реестр, а не думать как это сделать, есть путь, есть данные есть тип данных, а указатели открытие и закрытие делается под капотом.
Также я уже говорил, что в AutoIt понятие строки включает символ Null, то есть я могу открыть файл в строку и он не обрежется по Null, сделать замену и записать. То есть я могу патчить бинарный файл, например Grub4Dos загрузчик имеет бинарный файл grldr, где в конце файла есть конфиг, который применяется если grldr не найдёт внешнего конфига и мне легко сделать замену текста в grldr, аналогично в любом бинарном файле, например в исполняемом файле мне надо русифицировать некие тексты, я не задумываясь открою его в переменную, выполню замену и сохраню и все строковые функции будут работать с этими данными не спотыкаясь на Null.
Функции автоматизации по работе с окнами в одну строку, то есть я могу получить список окон причём по маске, то есть имена окон по регулярному выражению, по поиску от начало строки, по поиску в любом месте, по флагу "активное", по наличию текста в окне, по времени, ожидая его появления в течении некоторого времени или бесконечно и потом делать с ним автоматизацию. Этот код будет в одну строку, потому что много строк уже написаны под капотом.
Я на официальном форуме PureBasic предложил сделать как бы пользовательские функции, то есть их можно было бы добавить в справку и они подключались без указания инклуда, просто скидываешь в папку инклудов и компилятор ищет файл функции в этой папке, если нашёл, то вставляет её в начале кода, если не нашёл, то выдал что функция не существует. И получается я могу добавить некие функции, которых мне не хватает и они будут как будто они разработаны разрабочтиком, просто вставил и она вызывается. Ведь если сравнивать со строковыми функциями AutoIt3, то в PureBasic какой то пережиток прошлого. Функция StringField есть, а функции Split (как в AutoIt3 )нет. StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст, когда можно сделать это 1 раз, а получить все элементы сразу чаще более необходимая операция чем получить например 5-й элемент, я даже не понимаю, когда мне это вообще понадобится. Все строковые функции заново пришлось понимать, если в AutoIt3 есть функции обрезки StringTrimLeft, StringTrimRight, то в PureBasic мне надо соорудить из других функций аналог, и ощущение что из других функций не будет оптимизировано, в PureBasic наверно надо дойти до Null потом вернутся на указанное число символов назад и вписать Null, так как при использовании Len() получится что первая пробежка поиск Null, а вторая пробежка для обрезки, да и кто знает делается ли это перевыделением памяти.
также в AutoIt3 есть работа с объектами, например я не знаю как подключиться к объекту "Scripting.Dictionary" или к проводнику или к IE, а в AutoIt3 это есть.
Я тоже не говорю что PureBasic для меня хуже, ведь можно и по другому сказать, например PureBasic дерево структур это круто, в AutoIt3 я не знаю как это сделать и лень пробовать, структуры есть но как они сделаны мне не нравится, доступ через функции. Регулярные выражения если использовать в цикле то в PureBasic они компилируются. На форуме AutoIt3 поднимался вопрос, что регвыры в цикле каждый раз компилируются из-за чего медленнее работают (я не замечал или делал сложный регыр за один проход, текста, а не построчно), автор сделал, что при вызове регвыра повторно, если маска регвыра совпадает с предыдущим, то используется скомпилированый ранее объект. Но опять же а если в цикле 2 регвыра, то уже не поможет. Ну и кросплатформетнность, которая многим не нужна так как они под Windows сколько времени уходит ешё и линукс изучать, даже не рассматривают линукс как вариант на будущее. Ну и возможность писать плаги, то есть компилируемый dll с Си совместимостью, а AutoIt3 не может такого, максимум можно сделать внешнюю панель инструментов, как я делал для Notepad++, прога получала дескриптор окна, дескриптор Scintilla и работала с данными, но эта панель была внешняя, она не была пунктом внутри проги Notepad++.
Отредактировано AZJIO (27.07.2022 14:50:52)
Поделиться427.07.2022 16:53:13
если нам надо сложить 2+2 мы складываем не задумываясь что это число
Допустим есть код
func plus($x, $y) return $x + $y endfunc
Тип переменных неизвестен (при одном вызове функции могут быть одни типы, а при другой совсем другие, включая недопустимые для сложения). Каким будет результат выполнения?
Это я к тому что не зная тип переменных сложно сказать как выполнится код. В PB и аналогичных языках с этим проще. Тип заранее известен и смотря на аргументы понятно какие данные могут быть в переменных (целочисленные, строки, структура, массив и так далее). В AutoIt придется смотреть участки кода из которых вызывается функция и не факт что это прояснит ситуацию.
Поэтому наоборот требуется усилие, чтобы привыкнуть, что в переменную строки нельзя указывать числа, а в переменную чисел нельзя писать строки.
Числа и строки можно объединять без явного преобразования
Debug "Результат = " + 10
а я и не знал что можно объявить массив структур
В PB или AutoIt?
В PB это возможно. Примеры в справке https://www.purebasic.com/documentation … tures.html
А как объявить в AutoIt так и не разобрался.
я просто элементы структуры раскладывал в двумерный массив, то есть в первом столбце ID-кнопки, во втором текст кнопки, в третьем и четвёртом координаты и т.д.
Это снижает читаемость кода. Нужно помнить какой индекс массива каким данным соответствует. Легко ошибиться. Вот для этого нужны структуры.
Structure GadgetData ID.i Text.s x.l y.l w.l h.l EndStructure Dim Gadgets.GadgetData(10)
Разница только в том что PureBasic имеет именованные элементы структуры, а в массиве их надо просто запоминать, что в 1 столбце такие то данные, во втором такие-то.
Если такой массив один и содержит на много элементов, запомнить не сложно, а если десятки массивов с больше чем 20 элементов в каждом? У людей ассоциативная память и текстовое обозначение запомнить и в дальнейшем понимать что это намного проще чем цифры которые разных массивах (в различных приложениях) обозначают разные данные.
С тем же успехом можно вместо осмысленных имен давать переменным имена типа Var01, Var02, ... Var99 и т. д. Попробуй догадайся что в переменных.
но даже если в чужом исходнике нет, то нетрудно сделать поиск и посмотреть что туда возвращается и сделать подсказки себе.
Не годится для больших программ. Если исходник имеет много тысяч строк с множеством подобных массивов, это крайне неэффективный метод. Пока разберешься со всеми массивами, забудешь что в индексах в каждом из них.
Я считал что AutoIt3 типа лучший отладчик, он как OnError в PureBasic, никогда прога тихо не упадёт, всегда выдаст мессагу что подает по такой то причине
Это не отладчик, а информирование о месте ошибки.
На счёт вывода в Debug, в AutoIt3 есть функция вывода в консоль, то есть любые данные можно вывести.
А как насчет пошагового выполнения, просмотра всех переменных включая локальные из функции в цепочке вызовов? Также нужно видеть эту цепочку вызовов чтобы понимать при вызове из какого участка кода произошла ошибка.
использовал Notepad++
Это текстовый редактор, а не IDE. Пользоваться не намного удобнее чем блокнотом из винды. Больше подходит для просмотра кода, а не его написания.
Например функция PathFindOnPath, её невозможно применить просто вызывая PathFindOnPath_(), там второй параметр - указатель на структуру массив путей, где искать кроме %Path%, так эту структуру надо делать самому и я наверно уже 3 функции делал чтобы заставить это работать, то в x32 работает, думал всё готово, а оно на x64 падает, делаю для x64 ещё какие то косяки вылазят.
Какие ошибки?
Этот код нормально работает как в x86 так и в x64.
Path.s{#MAX_PATH} = "File.pb" Dim Dirs.s(1) Dirs(0) = "D:\Dir\" Debug PathFindOnPath_(@Path, @Dirs()) Debug Path
там для листвью 150 функций, а в PureBasic сколько?
А сколько таких функций в справке AutoIt?
Ваша ссылка на стороннюю библиотеку не от разработчика AutoIt.
Например в AutoIt3 регулярное выражение одна функция, их 2, но они разные, но пишется одна, в одну строку
Это как раз то что неприменимо нужно начинающему?
Не спорю может у AutoIt есть свои преимущества в плане автоматизации и работы с COM но в целом больше недостатков.
Нет отладчика, нет (вероятно) массивов структур. Двусвязные списки не помешали бы. У меня на них много приложений построено.
В AutoIt есть такие функции как Send(), ControlCommand()
Это функции автоматизации. Неудивительно что они есть ведь это основное назначение AutoIt.
функции работы с реестром без открыть/закрыть, а сразу сделать запись.
В PB их нет из-за кроссплатформенности. Ведь в Linux и MacOS нет реестра. Для работы с реестром можно воспользоваться библиотекой https://www.purebasic.fr/english/viewtopic.php?p=579170
они подключались без указания инклуда
В AutoIt обязательно подключать все библиотеки включая те что входят в дистрибутив. Что мешает сделать также в PB?
Создаете в папке PB папку Include и добавляете в код
IncludePath #PB_Compiler_Home+"Include\" XIncludeFile "File1.pb" XIncludeFile "File2.pb"
Ведь если сравнивать со строковыми функциями AutoIt3, то в PureBasic какой то пережиток прошлого.
Вовсе нет. Строки нуль-терминированные https://ru.wikipedia.org/wiki/Нуль-терм … ная_строка
Функция StringField есть, а функции Split
На самом деле в AutoIt гораздо больше отсутствует функций.
В справке AutoIt нет функций работы с графикой, базами данных, шифрованием, json, xml, картинками, архивами, памятью и другим.
По сравнению с PB сильно урезаны библиотеки GUI и сеть.
Вспомнил что как-то пытался открыть файл для чтения и записи и выяснилось что AutoIt это не умеет! Как так? Откуда это ограничение?
StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст
Что мешает использовать регулярные выражения для объемного текста?
Или свою функцию написать?
AutoIt3 есть функции обрезки StringTrimLeft, StringTrimRight, то в PureBasic мне надо соорудить из других функций аналог
Очень сложный аналог?
s.s="12345678" Count = 2 Debug Left(s, Len(s)-Count) Debug Right(s, Len(s)-Count)
ИМХО об этом можно было даже не упоминать...
также в AutoIt3 есть работа с объектами, например я не знаю как подключиться к объекту "Scripting.Dictionary" или к проводнику или к IE, а в AutoIt3 это есть.
На думаю что начинающему это вообще нужно.
Подключить можно через COMatePLUS.
Язык подбирается под задачу.
PS.
Так и не понял почему вы считаете что AutoIt лучше (проще) для начинающих?
Как на нем решить такую элементарную задачу?
If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0)) Box(0, 0, 200, 200, RGB(255, 255, 255)) For radius=50 To 10 Step -10 Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255))) Next radius StopDrawing() ImageGadget(0, 0, 0, 200, 200, ImageID(0)) EndIf Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Или такую?
Structure GadgetData ID.i Text.s x.l y.l w.l h.l EndStructure Dim Gadgets.GadgetData(10)
Как открыть файл для чтения и записи?
Как отладить код, пошагово выполнив его и наблюдая за переменными?
Поделиться527.07.2022 18:38:42
Что за срач, вы тут развели!? Общайтесь пожалуйста об этом в личке!!!
По текущей теме, для antro735:
то, что сказал AZJIO, когда написал первый раз в этой ветке, именно это я хочу сказать тебе! AZJIO как с языка снял!
Это то, что тебе может сказать любой опытный программист. Здесь мы все твои УЧИТЕЛЯ, но не менторы, обрати пожалуйста на это внимание. У многих из нас, в этом воплощении, ещё имеются другие "развлечения", на которые мы тратим БОЛЬШЕЕ своё время. У нас у всех, разный опыт. Но, я точно знаю, что Учитель, не ищет ученика. Твой учитель, это не конкретный человек - это МЫ ВСЕ!
P.S.
- прошу обращать внимание на пунктуацию, она играет большую роль в том что я пишу:)
- это сообщение касается другой тематической ветки на этом форуме и было перенесено из:
Ищу наставника (ментора). - что считаю здравым со стороны модератора. Но правда, теперь это моё сообщение, вываливается из смысла текущей ветки. Я не в обиде, но считаю правильным, прояснить этот момент, для вновь прибывшего ...
Отредактировано Webarion (28.07.2022 04:33:51)
Поделиться727.07.2022 19:38:02
Я на работе, поэтому кратко:
У строк другой символ конкатенакции & поэтому с одним складывается, с другим объединяется а строку. Есть проблема в сравнении если одно число, а другое строка, как сравнивать, как строки лексикографически или как числа, но и здесь не проблемя, я отписал в справке все возможные поведения, если первый элемнт сравнения строка, то второй станет строкой иначе наоборот. Ну и есть принудительное преобразование в число или строку, эта же функция используется для неявного преобразования.
Библиотека листвью не сторонняя они идут в комплекте с автоит. Просто есть минимальные функции минимальные логические операции, а есть составные из минимальных, потому что внедрение их внутрь исполняемого приведет к разрастанию исполняемого файла.
Я пошаговым отладчиком до сих пор не пользуюсь, не знаю как его применять и необходимости не было. Я при проблеме вывожу переменную в дебаг и смотрю то ли там число или строка.
При выводе в дебаг строки и числа код выдает ошибку что не может к строке присоединить число, а если только число то выводит его. А со строкой я всегда использую str().
В реальности у меня в прогах максимум 1 сложный массив в котором надо запоминать столбцы и то не во всех программах, например в лаунчере, где кнопка содержит много данных. Также в проге "поиск дубликатов", опять же там не так много колонок: имя файла, размер, мд5, все. Даже не припомню сложности.
Регвыр из коробки поддерживает ссылки на группы. Есть у меня скрипты обработки где функции прям кучей, десятками, а в той же строке коммент, что она вычленяет. Если это писать на пурике, то код будет запутанным, удобнее сделать обертку, аналог автоит-функции иначе мозг будет плохо воспринимать информацию (как если читать на асм все мелкие действия без группировки в именную функцию). Я когда хочу быстро написать обработку данных с регвыр, то автоматом руки тянутся за автоит, и одновременно мысль если бы были аналоги обертки на пурике, то использовал бы пурик. И желательно инклуд, чтобы запусил скрипт и он вставил необходимые инклуды , а не пришлось бы рыскать по папкам где у меня эти функции.
На счет инклудов в home я и в той теме отписал что не сложно сделать, а mk-soft сказал что можешь делать общий инклуд, а компилятор вытащит из него только нужную функцию, а не весь инклуд. Из этого я сделал вывод что оптимизатор от chi наверно работает с модулями иначе какой в нем смысл если компилятор сам умеет взять нужное. Хотя надо проверить, я когда то вырезал лишние функции и исполняемый файл уменьшался из этого вывод что компилирует как есть не проверяя нужно ли.
Поделиться827.07.2022 20:06:31
В нативных функциях автоит тип указан в виде имени переменной, если в кавычках, то строка, если h перед именем, то хендл и т.д. в любом случае число, только хендл.
В пользоательских функциях выработалась привычка описывать в шапке назначение функции, параметры, возврат, код ошибки, автор, примечания, версия автоит. И удивлен, что в пурик никто этого не делает. Поэтому обычно тип данных указан в шапке, если он явно не понятен, а для необязательных параметров он виден по приравненным данным.
Notepad++ продвинутей пуревского ide. Все работает: Автозавершение, подсветка, фолдинг, вывод отладки в консоль. Не так давно избавлен от падений винды, когда при сохранении файл был обнулен, теперь сохраняет даже несохраненные данные не заставляя сохранять и открывает сессию с несохраненными файлами. Автозавершением в пуриковском почти не пользуюсь, пользуюсь своим и нпп имеет возможность вставлять многострочными фрагментами. Если бы инструменты пурика - просмотр структур были бы как плаги или самостоятельными исполняемыми файлами то не было бы зависимости от пуриковского ide.
Отредактировано AZJIO (27.07.2022 20:21:20)
Поделиться927.07.2022 20:13:48
У строк другой символ конкатенакции & поэтому с одним складывается
Я знаю но не об этом, а о том что нет явного типа переменных и можно передать какую угодно информацию включая недопустимую для такого выражения. В программировании важна предсказуемость. Но когда тип переменной не задан, ее нет.
Библиотека листвью не сторонняя они идут в комплекте с автоит.
Справка тоже в комплекте?
Я пошаговым отладчиком до сих пор не пользуюсь, не знаю как его применять и необходимости не было. Я при проблеме вывожу переменную в дебаг и смотрю то ли там число или строка.
Отладчик экономит очень много времени. Чем сложнее код тем необходимее отладчик.
В реальности у меня в прогах максимум 1 сложный массив в котором надо запоминать столбцы
Большинство моих программ содержат больше тысячи строк. В них множество структур, массивов и списков. Оттого AutoIt мне не подошел потому что сильно ограничивает возможности.
компилятор вытащит из него только нужную функцию, а не весь инклуд.
С асм транслятором есть нюансы и в исполняемый файл могут попасть не используемые функции. С си и включенной оптимизацией в этом плане намного лучше.
Поделиться1027.07.2022 20:27:23
Да, справка тоже в комплекте, но английская? И я выкладывал свой перевод.
Я добавил абзац в предыдущий пост.
Одновременное чтение и запись можно сделать через WinAPI. Но в любом случае это не такая важная необходимость. Открытие файла в автоит одна строка, в пурике минимум 3.
У меня тоже проги до 5 тысяч строк без учета инклудов и учитывая что автоит меньше строк на функцию использует.
Что значит недопустимая переменная? Если функция требует тип числа, то происходит неявное преобразование и наоборот нужна строка будет преобразование в строку. В любом случае будет допустимая переменная. Другое дело чел-кодер не смог обеспечить правильные данные но автоит тут ни при чем, в этом случае проблема в человеке. Если число больше чем помещается в ячейку памяти то тоже в справке указано максимальное для числа и можно использовать инклуд бигнум. Например я делал калькулятор и если числа более некой величины, что их перемножение приведет к переполнению, то я отправлял в функцию из бигнум, операция перемножения выполнялась другой функцией.
2Д функции являются обертками WinAPI, в пурик хорошо то что одна и таже функция в винде и линукс сделает одинаково. Без этой фичи преимуществ нет, в автоит полно примеров рисования в контекст устройства, я сам пробовал примеры GDI, где смешивание градиентов и прочее. И есть инклуды для рисования графиков функций.
Отредактировано AZJIO (27.07.2022 21:56:58)
Поделиться1127.07.2022 22:24:41
Notepad++ продвинутей пуревского ide. Все работает: Автозавершение, подсветка, фолдинг, вывод отладки в консоль.
Notepad++ это текстовый редактор не заточенный под конкретный ЯП.
Например в PB IDE автозавершение учитывает тип данных. Если указан префикс модуля, автозавершение только для него. Аналогично со структурами - только их поля.
Отладчик полностью интегрирован в IDE.
Да, справка тоже в комплекте, но английская?
Где в папке Autoit искать справку для файлов из папки Include в частности для GuiListView Management?
Одновременное чтение и запись можно сделать через WinAPI.
Можно, только в AutoIt работа с WinAPI менее удобна.
Но в любом случае это не такая важная необходимость.
Задачи бывают разные. Для той это было обязательное условие. Альтернативой была приостановка процесса сторонней программы на время работы с файлом.
У меня тоже проги до 5 тысяч строк без учета инклудов и учитывая что автоит меньше строк на функцию использует.
Все относительно и зависит от задачи. Хотелось бы увидеть решение на AutoIt такой простой задачи
If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0)) Box(0, 0, 200, 200, RGB(255, 255, 255)) For radius=50 To 10 Step -10 Ellipse(100, 100, radius*2, radius, RGB(Random(255), Random(255), Random(255))) Next radius StopDrawing() ImageGadget(0, 0, 0, 200, 200, ImageID(0)) EndIf Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow EndIf
Тогда сравним число строк.
Что значит недопустимая переменная? Если функция требует тип числа, то происходит неявное преобразование и наоборот нужна строка будет преобразование в строку.
Можно передать все что угодно в том числе массив, объект, указатель и другое. Смотря на функцию нельзя точно сказать что ей может быть передано в аргументах.
Другое дело чел-кодер не смог обеспечить правильные данные но автоит тут ни при чем, в этом случае проблема в человеке.
Это баг. Его причины могут быть различными и одно дело когда интерпретатор/компилятор молча выполнил код выдав неправильный результат и совсем другое когда компилятор отказался собирать исполняемый файл указав на ошибку. Вот к примеру код на autoit
func plus($x, $y) return $x + $y endfunc local $x[10] ConsoleWrite("result = "&plus($x, "abcd")&@crlf)
аналогичный на PB
Procedure plus(x, y) ProcedureReturn x+y EndProcedure Dim x(10) Debug plus(x(), "abcd")
В отличие от autoit недопустимый тип переменной сразу будет найден.
В программировании важен порядок, а когда допустимо все включая некорректные данные это прямой путь к ошибкам. И как говорят - "удачного поиска багов" особенно если нет отладчика.
Это простой код и ошибка сразу винда. Но если такой код затеряется в десятках тысяч строк и проявляется не сразу, а при определенных условиях, искать место ошибки будете долго.
Если число больше чем помещается в ячейку памяти
В переменную можно поместить все что угодно (массив, объект и т. д.). Интерпретатор молча выполнит код при том что складывать массив со строкой не содержащей числа бессмысленно.
Поделиться1227.07.2022 23:00:57
Path.s{#MAX_PATH} = "File.pb"
вроде банальная строчка, но она для меня окупила время потраченное на прочтение темы.. .
Спасибо Петр
Поделиться1328.07.2022 02:57:40
В AutoIt3 в корне один файл справки, там есть раздел UDF (скрин), это и есть раздел справки по всем инклудам. В старой версии 3 файла справки, но один из них самый маленький объединяет 2 справки в одну. В моем комплекте перевода 4 файла и самый маленький объединяет 3 справки в одно дерево. Дополнительная справка содержит инклуды пользователей с оф.форума.
А как головка жесткого диска будет одновременно читать и писать? В любом случае работа по очереди. Если открыть два дескриптора и писать в файл, будет ли второй дескриптор обновляться.
Вот к примеру код на autoit
Видимо я никогда не складывал массив с числами.
Хотелось бы увидеть решение на AutoIt такой простой задачи
#include <GUIConstantsEx.au3> Local $i GUICreate("Элипс", 200, 200) GUICtrlCreateGraphic(0, 0) For $i = 100 To 20 Step -20 GUICtrlSetGraphic(-1, $GUI_GR_COLOR, 0, BitShift(Random(0, 255, 1), -16) + BitShift(Random(0, 255, 1), -8) + BitShift(Random(0, 255, 1), 0)) GUICtrlSetGraphic(-1, $GUI_GR_ELLIPSE, 100 - $i, 100 - $i/2, $i * 2, $i) Next GUISetState() Do Until GUIGetMsg() = $GUI_EVENT_CLOSE
как говорят - "удачного поиска багов"
В AutoIt3 меньше работы с памятью, функции изначально делают работу с памятью под капотом, из-за этого меньше вероятность ошибок и утечек памяти и повреждение чужих процессов. Какой нибудь PokeS() может запросто записать за пределы выделенного и отладчик PureBasic даже не пикнет. Вероятность перепутать данные переданные в функцию меньше, чем правильно определить длину байт памяти.
На счёт рег выр. вот пример где без обёртки это выглядело бы запутанно, а в AutoIt3 вполне читабельно.
Если что, вот моя сборка AutoIt3. Русская справка последняя версия
В справке AutoIt нет функций работы с графикой, базами данных, шифрованием, json, xml, картинками, архивами, памятью и другим.
база данных, шифрование идут в комплекте с AutoIt3, я даже сам делал, вот пример SQLite. Шифрование я также делал гуи-пример, делал прогу "опросник", где конфиг шифруется для невозможности смотреть ответы, а также в Password generator использовал.
json, xml - гуглится на форуме AutoIt3
картинки? - что имеется ввиду? Сделать фоном, рисовать поверх? Делать ресайз? Всё это есть, я даже делал пример ресайза с соблюдением пропорциональности при максимальном заполнении окна, хотя там просто узнать какая сторона больше.
архивы? - делал даже на русском языке, есть в доп-справке. Zip, 7Zip. Делал прогу которая перепаковывала вордовские документы с заменой шаблонов ReplaceTemplateDOCX
память - ссылка
графика? GDIP, GraphGDIPlus - на этой либе в коллекции скриптов (в моей сборке AutoIt3) у меня есть пример - файл "рассчёт.au3" для рассчёта разряда конденсатора в БП. А в справке примеры разложение чётных и нечётных гармоник образующие пилообразную форму сигнала и меандр ну и там есть другие графики. Примеры делал я.
На думаю что начинающему это вообще нужно.
Подключить можно через COMatePLUS.
"Scripting.Dictionary" - аналог Map, виндовый движок. В новом AutoIt3 уже есть Map.
Для IE многие делают автоматизацию сайтов. Можно без проблем получить текст страницы без использования рег.выр. и прочего.
Проводник - тоже позволяет всякие файловые операции.
Отредактировано AZJIO (28.07.2022 08:41:52)
Поделиться1428.07.2022 14:16:35
В AutoIt3 в корне один файл справки, там есть раздел UDF (скрин)
Нет такого.
А как головка жесткого диска будет одновременно читать и писать? В любом случае работа по очереди.
Пока приложение закроет файл и повторно откроет его для записи, другое может успеть открыть его. Это недопустимо и приведет к потере данных. Нужно было на 100% гарантировать отсутствие подобной ситуации.
Видимо я никогда не складывал массив с числами.
Легко можно ошибиться и написать
plus($x, 1234)
вместо
plus($x[2], 1234)
Это не сразу бросится в глаза потому что первый случай не является явной ошибкой. Второй случай тоже можно привести к неправильному вычислению если по ошибке вписать неправильный индекс массива - числа легко перепутать.
GUICreate("Элипс", 200, 200)
GUICtrlCreateGraphic(0, 0)
Это не точный пример. В PB эллипс рисуется на картинке, которая в дальнейшем может быть использована для других целей.
В AutoIt3 меньше работы с памятью
У меня почти все программы построены на работе с памятью. Отчасти это из-за того что много работы с железом.
Какой нибудь PokeS() может запросто записать за пределы выделенного и отладчик PureBasic даже не пикнет.
Включите Purifier в настройках компилятора и запустите код.
*mem = AllocateMemory(10) If *mem PokeS(*mem, "12345678901234567890") FreeMemory(*mem) EndIf
[ОШИБКА] Строка: 3
[ОШИБКА] Overflow in a dynamically allocated memory block.
картинки? - что имеется ввиду?
https://www.purebasic.com/documentation … index.html
архивы? - делал даже на русском языке, есть в доп-справке. Zip
Нет _Zip.au3 и 7Zip.au3 в папке Include...
Мы обсуждаем возможности ЯП и его библиотек, а не сторонние исходные файлы.
Представьте вы начинающий и скачали AutoIt. Открыли справку и ориентируетесь на нее. Какие функции в ней нашли те и применяете в программах.
Мое мнение не поменялось. AutoIt хорошо подойдет для задач автоматизации и работы с COM объектами. Для остальных задач он менее подходящий.
Вы написали что AutoIt проще. А чем он проще в задачах общего назначения (не COM и автоматизация)?
память - ссылка
Только выделение и освобождение памяти. Функции работы с ней отсутствуют.
Если AutoIt проще тогда код должен быть проще и понятнее чем на PB.
*p.POINT = AllocateMemory(SizeOf(POINT)) If *p *p\x = $10 *p\y = $20 ShowMemoryViewer(*p, SizeOf(POINT)) FreeMemory(*p) EndIf
графика? GDIP
Попытка скомпилировать первый попавшийся пример не удалась. Нет файла GDIP.au3. Заменил на GDIPlus.au3 - ругается на функции и константы. Добавил GDIPlusConstants.au3, ничего не поменялось.
Пользоваться этой библиотекой сложнее чем 2DDrawing То есть о простоте для начинающих речь не идет. Тем более что судя по примеру нужно вручную освобождать ресурсы. Забыл или не знал об этом и будет утечка памяти! В PB ресурсы графической библиотеки освобождаются автоматически.
Примеры делал я.
Нет файла GraphGDIPlus.au3 в Include...
Судя по коду это рисование в окне. Рисование на картинке универсальнее.
Для IE многие делают автоматизацию сайтов.
У каждого ЯП свое назначение. Не спорю что AutoIt хорошо подходит для автоматизации, но для других задач у него больше недостатков (легко вытащить исходник, медленная работа, нет многопоточности, нет типов переменных, нет массивов и списков структур, нет простой работы с графикой и памятью (не сложнее чем в PB), нет отладчика, нет удобной IDE и др.) чем преимуществ. Это мое мнение и вероятно оно не совпадает с вашим.
Поделиться1528.07.2022 17:05:57
Пётр
Последний раздел "User Defined Function Reference" это и есть сокращённо UDF
Мы воспринимаем себя со стороны знаний, а я помню как я начинал с AutoIt3. Мы общались на форуме LIveCD и я у NIKZZZZ увидел скрипт с функцией FileCreateShortcut() - создания ярлыка, мне показалось так просто, укажи текст в строках-параметрах и он создаёт ярлык, начал гуглить изучать тему и пробовать всякие функции, в отличии от bat-файлов мне AutoIt3 казался каноническим, я наверно после него понял что такое цикл в bat-файлах. И я отлично помню тот момент когда я начал изучать массивы, что я помню из алгебры 2 скобки большие в них 3 ряда и 3 колонки и это мы называли массивы и там как то крест на крест мы их складывали, а здесь что это и зачем мне их изучать, мне объяснили в цикле можно в 3 строки перебрать, мне надо было запомнить что индексы это номер ячейки, что есть функции запроса размера, что начало от 0, а не от 1 и я делал вот эти примитивные примеры и мне тогда ясно понятно было что я применяю усилие, чтобы понять структуру записи, что я пишу и что это означает, то есть одно дело написать 10 строк, другое дело написать 3 строки, две из которых начало и конец цикла задающие параметры обсчёта, а центральная выполняется каждый раз но меняя индекс в команде строке. Это сейчас кажется примитивно просто, а тогда казалось что мир меняется и я сразу стал применять, потом пробовать вложенные циклы с обработкой 2-х индексов и двумерного массива с обсчётом по строкам и колонкам. То есть даже изучение массива требовало усилие, что уж говорить об указателях, типах данных. У меня есть строка в переменной, я применяю к ней функцию поиска, не заботясь об указателях и как определяется конец строки, функция просто работала со строкой, которую я передал в параметры. И помню как я пытался через несколько лет изучать язык Си и 2 месяца ковырялся в песочнице, я тогда ещё сказал что на AutoIt3 я бы мог уже несколько программ написать крутых с гуи с сохранением в файл, а тут я элементарные вещи не могу сделать (в том числе и проблема типа чисел) и нет людей кто-бы подсказал, а на форуме AutoIt3 каждый день было 10 человек активно сидящих и только задай вопрос, уже все будут соревноваться кто скорей ответит с лучшим кодом. И вот как раз тип числа одна из проблем, в AutoIt3 не думаешь какое это число, это просто число как ты воспринимаешь это в естественной жизни, и не думаешь влезет ли оно в голову или нет и начинаешь работать с числами то даже нет возможности столкнутся с переполнением, индекс массива никогда не будет к примеру 9 квадриллионов, размер экрана не будет 9 квадриллионов и т.д. А значит человек при меньших усилиях меньших знаниях при естественном мышлении скорее будет добиваться результатов и получит задор, желание всё пробовать и творить. А когда появятся азы логического мышления, то можно переходить на детальные языки, в которых можно управлять тем, что в AutoIt3 находится под капотом, смотреть какие выгоды приносит новый язык, останавливает ли он тебя или даёт новые горизонты. Если язык сложен что человек будет несколько лет играть в песочнице, так и не дойдя до гуи (в Си), то зачем ему такой язык? Это как мы на AutoIt3 обсуждали эту же тему, про тех людей которые заходили сказать что это недоязык, а они возьмутся за настоящий язык, это как сказать что вы тут с гантелями играетесь, я сейчас вон ту штангу 200 кг буду пробовать поднимать, как говориться сразу с настоящим весом работать, но ведь поднять 200 кг, там тоже сила не является первым однозначным критерием, там и рывок и постановка тела, руки в разные стороны закручивания, чтобы штанга не разогнула пальцы.
Нет _Zip.au3 и 7Zip.au3 в папке Include...
Он есть в моей переведённой справке, там все инклуды пользовательские добавленные идут в комплекте и указаны ссылки где они скачаны, чтобы смотреть обновы для последней версии.
Мы обсуждаем возможности ЯП и его библиотек, а не сторонние исходные файлы.
А они появляются в ЯП, когда у разработчиков есть время и знания проверить или доверие. Ведь расширенные WinAPI были именно так и добавлены, взяты у пользователя.
Какие функции в ней нашли те и применяете в программах.
Поэтому я и добавил крутые либы, чтобы те кто будет качать русскую справку, а это преимущественное большинство русскоязычных имели доступ к большим возможностям.
Попытка скомпилировать первый попавшийся пример не удалась. Нет файла GDIP.au3. Заменил на GDIPlus.au3 - ругается на функции и константы. Добавил GDIPlusConstants.au3, ничего не поменялось.
Потому что обновы, я дал свою сборку, вы можете пробовать любую версию, для простоты просто кидаем файл на AutoIt3.exe, а по хорошему сделать переключалку ассоциаций или сделать 2 команды, запустить с версией такой то или такой то в конт меню. Как делать конт меню могу дать ссылки на свои программы: SubMenuWin7_10, ContMenuFiles.
медленная работа, нет многопоточности
Медленно обрабатывается только интерпретация кода, а внутренние функции написанные на Си работают мгновенно. Фактически замедление есть только в цикле и то увидеть это обычно можно только измерением скорости, а в основном глазом не успел моргнуть уже готово.
Поток для многих ума не хватает использовать, в 99% программы однопоточные даже на PureBasic, по крайней мере у меня. И то только из-за того что PureBasic не может обновить строку состояния в потоке, а в AutoIt3 она обновляется и без потока.
Это мое мнение и вероятно оно не совпадает с вашим
Пока ещё я в PureBasic не превысил планку, которую достиг в AutoIt3. В AutoIt3 у меня больше программ и они имеют больше деталей, настроек, и они проверенные. Может сейчас у меня не такой запал и нет столько времени, чтобы сделать столько же на PureBasic.
Отредактировано AZJIO (28.07.2022 17:49:25)
Поделиться1628.07.2022 17:54:56
Последний раздел "User Defined Function Reference" это и есть сокращённо UDF
Да действительно. Это в английской справке (в русской нет). Тогда этот вопрос снимается.
сразу стал применять, потом пробовать вложенные циклы с обработкой 2-х индексов и двумерного массива с обсчётом по строкам и колонкам. То есть даже изучение массива требовало усилие
Отладчик упрощает изучение. Не нужно представлять как работает код. Это можно увидеть и получить ответы на многие вопросы. Поэтому первый язык не имеющий отладчика изучать сложнее.
И вот как раз тип числа одна из проблем, в AutoIt3 не думаешь какое это число, это просто число как ты воспринимаешь это в естественной жизни
Дело не в числах а в неоднозначности данных в переменных. Например нужно чтобы было только число, а если в переменную по ошибке пытаться поместить строку, массив и др. несовместимые с числом данные, AutoIt никак этом об этом не проинформирует. Результат вычислений непредсказуем.
Типы переменных не просто так придумали. Их отсутствие создает множество проблем.
нет возможности столкнутся с переполнением, индекс массива никогда не будет к примеру 9 квадриллионов, размер экрана не будет 9 квадриллионов и т.д.
Индекс массива может быть строкой не содержащей чисел, массивом, объектом и др. типом данных не имеющим ничего общего с индексом. Разве это не ошибка? Как AutoIt предотвращает ее?
А значит человек при меньших усилиях меньших знаниях при естественном мышлении скорее будет добиваться результатов и получит задор, желание всё пробовать и творить.
Начинающий допустит ошибку и ему может быть трудно найти причину без отладчика. Может вовсе запросить программирование...
что это недоязык
У AutoIt своя область применения - автоматизация. Вне этой области программы могут быть сложнее чем на других ЯП. Один из примеров из UDF раздела справки.
#include <GDIPlus.au3> #include <GUIConstantsEx.au3> Example() Func Example() Local $hGUI, $hGraphic, $hBrush, $hFormat, $hFamily, $hFont, $tLayout ; Create GUI $hGUI = GUICreate("GDI+", 400, 300) GUISetState(@SW_SHOW) ; Draw a string _GDIPlus_Startup() $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) $hBrush = _GDIPlus_BrushCreateSolid(0xFF00007F) $hFormat = _GDIPlus_StringFormatCreate() $hFamily = _GDIPlus_FontFamilyCreate("Arial") $hFont = _GDIPlus_FontCreate($hFamily, 12, 2) $tLayout = _GDIPlus_RectFCreate(140, 110, 100, 20) _GDIPlus_GraphicsDrawStringEx($hGraphic, "Hello world", $hFont, $tLayout, $hFormat, $hBrush) ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE ; Clean up resources _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_Shutdown() EndFunc ;==>Example
Может показаться что пример простой, но на PB можно написать тоже самое еще проще.
OpenWindow(0, 0, 0, 220, 100, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) LoadFont(0,"Arial", 12, #PB_Font_Bold) StartDrawing(WindowOutput(0)) DrawingFont(FontID(0)) DrawingMode(#PB_2DDrawing_Transparent) DrawText(80, 30, "Hello world", 0) StopDrawing() Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow FreeFont(0)
Поэтому я и пишу что есть сомнения что AutoIt проще PB на распространенных задачах не считая автоматизацию.
Поделиться1729.07.2022 11:24:44
AZJIO написал(а):
StringField не оптимизирован, если хочется получить все элементы в массив, то StringField будет от начала искать число разделителей, то есть при миллион элементах он будет миллион раз прочитывать текст
Что мешает использовать регулярные выражения для объемного текста?
Или свою функцию написать?
Уже давно использую вариант от wilbert и там же свой вариант добавил. А регулярное выражение 150 кб добавляет к исполняемому файлу, поэтому приходится искать экономичные варианты.
Поделиться1830.07.2022 18:50:51
Глупо сравнивать скриптовый язык AutoIt и компилируемый в машинный код PureBasic.
Поделиться1919.08.2022 00:47:32
В AutoIt есть много полезного и интересного. Не скажу о программной части. Но вот, что мне очень нравится в AutoIt так это эгрегор, то бишь сообщество и в целом энергетика. Я вижу там очень много труда сделанного для людей. Очень кропотливо, и заботливо сделано кстати. И да, мне нравится русскоязычный форум AutoIt. Он привлекателен. Не только визуально, но и ментальная часть достаточно интеллектуально взвешена. Но, на AutoIt, я уже почти не пишу, потому-что влюбился в PB. Влюбился в простую возможность писать ASM и непосредственный доступ к памяти, влюбился в структуры, списки и хэш-карту, я даже массив больше не использую. Для меня это, словно "бога за руку держать".