Что нового

Проверка необходимости включения библиотек (#include)

gora

Знающий
Сообщения
315
Репутация
19
Написал скрипт в котором достаточно много включенных библиотек (может не совсем верно их называю), например: #include <Misc.au3>. Скрипт писался долго и мучительно и были разные варианты решений некоторых его частей. В результате этих библиотек накопилось много и от каких вариантов они остались мне уже не вспомнить. Каким образом можно проверить необходимость или отсутствие необходимости во всех этих библиотеках?

Спасибо.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
qsort
Именно так и поступаю, но не верю что нет другого более правильного способа.
Скрипт получился большой (более 1000 строк) имеет несколько вариантов запуска, при каждом варианте выводятся диалоги и пользователь может выбрать дальнейшее продолжение работы из нескольких вариантов. К этому стоит добавить еще и входные файлы, передаваемые скрипту для обработки, и обрабатываемые разными способами в зависимости от их типов и комбинации этих типов. Если все это перемножить, то такой проверкой можно заниматься неделю и не наткнутся на ошибку спрятавшуюся в дебрях скрипта из-за отсутствия какой то библиотеки.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
qsort сказал(а):
По-моему, самый простой путь - это последовательно комментировать каждый заголовок и запускать скрипт на исполнение.

Зачем запускать? Жмите прверку (CTRL+F5).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
qsort сказал(а):
Не раз натыкался на то, что проверка прокатывает, а при исполнении выясняется, что все же что-то не так. Проверка осуществляется НЕполная.

На предмет отсутствия каких-либо функций или переменных, проверка работает на 100%. Именно для этого она и предназначена.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Yashied
Так у меня показывает много предупреждений типа :
WARNING: $v1: possibly used before declaration.
Хотя эти переменные у меня определяются в самом начале скрипта при чтении двух ini файлов и скрипт нормально работает. Рассмотреть в этом море предупреждений и ошибок еще что-то очень сложно.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
qsort [?]
Не раз натыкался на то, что проверка прокатывает, а при исполнении выясняется, что все же что-то не так
Значит неправильно написан скрипт. Очень часто дела обстоят как раз наоборот - проверка синтаксиса показывает ошибки, а при запуске скрипта их нет (не учитывая срабатываение AutoItWrapper), чтобы далеко не ходить, вот выдержка из скрипта от Yashied:

Код:
#include <WinAPIEx.au3>

If _WinAPI_GetVersion() >= '6.0' Then
    _WinAPI_SetWindowTheme(GUICtrlGetHandle(-1), 'Explorer')
EndIf


Кстати, можно было бы использовать Execute.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
gora [?]
эти переменные у меня определяются в самом начале скрипта
В таком случае ошибок быть не должно, хотелось бы посмотреть на этот скрипт.

P.S
Есть такой инструмент по теме: Organize includes.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR

Это условие не для того, чтобы проверить присутствует ли _WinAPI_SetWindowTheme() в библиотеке или нет (она там уже давно). Просто строка

Код:
_WinAPI_SetWindowTheme(GUICtrlGetHandle(-1), 'Explorer')


имеет смысл только в Windows Vista и выше.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
qsort сказал(а):
Ошибка нигде показана не была.

Не путайте ошибки написания кода с ошибками исполнения оного. Au3Check проверяет именно ошибки в написании кода. Те ошибки, которые появляются во время исполнения, заранее может предусмотреть только сам кодер.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
CreatoR [?]
хотелось бы посмотреть на этот скрипт.
Вот такой, например. Проверку не проходит, но ведь работает!
Код:
$file = FileOpen("Settings.ini", 0)
If $file = -1 Then
	MsgBox(0,"", 'Файл "Settings.ini" отсутствует!!!')
	Exit
EndIf
While 1
	$line = FileReadLine($file)
	If @error = -1 Then ExitLoop
	$array = StringSplit($line, "=")
	Assign($array[1], $array[2], 2)
Wend
FileClose($file)

If Not IsDeclared ("seticon") Then
    MsgBox(0,"", "Переменная seticon не определена в ini файле")
Else
    MsgBox(0,"", "Переменная seticon = " & $seticon)
EndIf

В Settings.ini, кроме прочих, есть строка, которая может и отсутствовать:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
gora

И что здесь не так? Au3Check честно предупреждает, что переменная $seticon не была объявлена. Откуда он (Au3Check) возмет название "seticon"? Из .ini файла?

:smile:

Да и вообще, здесь по всем правилам нужно было писать так:

Код:
If Not IsDeclared("seticon") Then
	MsgBox(0, "", "Переменная seticon не определена в ini файле")
Else
	MsgBox(0, "", "Переменная seticon = " & Eval("seticon"))
EndIf
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Yashied [?]
Au3Check честно предупреждает, что переменная $seticon не была объявлена. Откуда он (Au3Check) возмет название "seticon"? Из .ini файла?
Я все это понимаю и не говорю, что Au3Check плохой. Вопрос в другом. Из-за обилия у меня таких "не объявленных" переменных весь вывод Au3Check заполнен сообщениями о них и найти там сообщения относящиеся к #include становится очень сложно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Потому что изначально был выбран плохой дизайн кода. Зачем вообще было нужно использовать Assign()? Если для объявления переменных используется Assign(), то для получения их значений нужно использовать Eval().
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Yashied
Наверное плохой, я только учусь.Yashied [?]
Зачем вообще было нужно использовать Assign()?
А как иначе? Мне нужно считать имена переменных и их значения из внешнего ini файла. Переменных там много. В ini файле они могут быть изменены, а некоторые даже удалены пользователем.

PS
Всем спасибо. Инструмент, предложенный CreatoR, меня полностью устроил.
 

dronet

Знающий
Сообщения
46
Репутация
8
А так не помешает? ??
#include <Settings.ini>

Только в ini придётса писать переменные типа $seticon = 'значение' или $seticon = 0

Потом использовать при замене параметра
IniRead, IniWrite, IniDelete, IniReadSection, IniReadSectionNames, IniWriteSection
 
Верх