Что нового

Вопрос по порядоку выполнения строк с #include

belovkirill

Новичок
Сообщения
23
Репутация
0
Здравствуйте. Каким образом выполняются файлы включенные в сценарий с помощью #include <...> или #include '...'? Дело в том, что у меня имеется сценарий, который запускает по очереди другие модули таким вот образом. Но мне непонятна очередь в которой все это дело происходит. Вот собственно примерная схема того что я хотел бы чтобы происходило:

В одной папке имеются файлы: start.au3, init.au3, include.au3 и папка lib внутри которой произвольное количество сценариев AutoIt

файл start.au3 - сначала выполняет просто команды:
Код:
#include 'init.au3'
#include 'include.au3'


в файле include.au3 - находятся строки вида:
Код:
#include 'lib\script1.au3'
#include 'lib\script2.au3'
...
#include 'lib\scriptN.au3'

которые просто выполняют произвольные сценарии из папки lib

файл init.au3 - содержит код, который выполняет редактирование файла include.au3 вот каким образом:
открывает include.au3 на перезапись
получает все имена файлов из папки lib
записывает в include.au3 строчки вида:
Код:
#include 'lib\script1.au3'
#include 'lib\script2.au3'
...
#include 'lib\scriptN.au3'

закрывает файл include.au3

Вот собственно и весь короткий пересказ работы моей программки. Конечно понимаю что это все выглядит слишком уж "по-индусски", но это просто скажем так небольшой эксперимент. А смысл этого всего в том, чтобы просто создавая множество автономно работающих файлов-сценариев не вызывать каждый по отдельности, а просто копировать их все по мере появления в папку lib. Конечно можно то же самое без проблем сделать просто добавив путь на папку lib в раздел реестра HKEY_CURRENT_USER\Software\AutoIt v3\AutoIt.

Теперь о, собственно, возникшей проблеме. При запуске start.au3 оказывается вот что. При добавлении нового файла-сценария в папку lib - init.au3 выполняется и редактирует include.au3, после чего все, в том числе и новые добавленные файлы-сценарии выполняются в start.au3. Но если удалить какой-то из файлов в lib. То возникает ошибка, связанная с отсутствием удаленного файла и невозможностью его выполнения с помощью:
Код:
#include 'deletedfile.au3'

А файл include.au3 оказывается не отредактированным. И у меня поэтому возник вопрос - каким образом точно управлять порядком выполнения строк с
Код:
#include 'file.au3'
? Чтобы файл init.au3 стопроцентно выполнился и успел перезаписать все что надо до include.au3. Прошу прощения за громоздкое описание простой проблемы. Заранее спасибо!
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
belovkirill
Разбираться в вашей писанине конечно нет желания, так как суть вашего вопроса предельно проста.

Include грубо говоря попросту берет содержимое целевого скрипта и вставляет его на свое место. Как только все Include-файлы будут скопированы в основной скрипт - он начнет выполнение.


Пример:
Include1:
Код:
$test = 123


Include2:
Код:
$test2 = 123


Main
Код:
#Include "Include1"
#Include "Include2"

$test3 = 123


Все это на момент начала выполнения эквивалентно:
Код:
$test = 123
$test2 = 123
$test3 = 123
 
Автор
B

belovkirill

Новичок
Сообщения
23
Репутация
0
firex. Да я понимаю, что ключевое слово #include добавляет код на то место где оно было вызвано. Однако, я как раз описал проблему при которой строки с #include не выполнялись в нужной последовательности.
 

Vintets

Новичок
Сообщения
12
Репутация
4
belovkirill сказал(а):
файл start.au3 - сначала выполняет просто команды:
Код:
#include 'init.au3'
#include 'include.au3'


...

файл init.au3 - содержит код, который выполняет редактирование файла include.au3 ....

То, что init.au3 что-то там редактирует после запуска никак не скажется на коде, который УЖЕ вставился по
Код:
#include 'include.au3
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
belovkirill, по-моему вы абсолютно запутались. #Include, это директива, т.е. выполняется она до запуска скрипта. После того, как скрипт начал выполняться, она уже не имеет смысла (не используется). Во время запуска, скрипт собирается в памяти, всесто #Include подставляются соответствующие части кода, и только после этого скрипт начинает свою работу. Таким образом, как-либо управлять #Include из скрипта нельзя. Порядок #Include должен быть такой, чтобы все используемые переменные и функции всегда находидись выше по тексту. Например, include1.au3 содержит переменную $Var, а include2.au3 использует эту переменную, в этом случае порядок должен быть такой:

Код:
#include <include1.au3>
#include <include2.au3>


С другой стороны, #Include как правило используется для подключения дополнительных библиотек, а не для деления исходного кода на 100500 кусков. Если ваш скрипт стал слишком громоздким (>10k строк), то логично поместить часть функций (по смыслу) в отдельный файл, и подключить его с помощью #Include. Размещать части кода в отдельном файле, это плохой стиль и приведет к большой путанице.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
belovkirill
firex [?]
Как только все Include-файлы будут скопированы в основной скрипт - он начнет выполнение.

Вчитайтесь пожалуйста еще раз. Ничего не будет выполняться до завершения "копирования", а после ваш алгоритм уже будет бессмысленен.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Yashied [?]
Размещать части кода в отдельном файле, это плохой стиль и приведет к большой путанице.

В c/c++ это обычное дело. Сейчас смотрю FreeBasic - просто ужас, чуть ли не каждая функция выносится в отдельный подключаемый файл.
AutoIt в этом смысле балует своим IDE - SciTe позволяет легко управляться с большими файлами, а грамотная свертка кода позволяет избавиться от долгих прокруток документа.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
belovkirill,
Посмотрите эту тему, может быть вам этот способ подойдёт.
 
Автор
B

belovkirill

Новичок
Сообщения
23
Репутация
0
Всем спасибо за пояснения. Yashied прав - я запутался. Так как ошибочно полагал что интерпретатор выполнит код, который находится справа от директивы так же в порядке очереди. То есть если перед #include идет какой-то код, то сначала выполнится он, а затем только произойдет вставка. alex33 - спасибо за совет. Над этим я так же думал.
 
Верх