Что нового

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

gora

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

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

gora

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

Yashied

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

Yashied

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

gora

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

CreatoR

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

Код:
#include <WinAPIEx.au3>

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


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

CreatoR

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

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

Yashied

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

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

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


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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
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 711
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 711
Потому что изначально был выбран плохой дизайн кода. Зачем вообще было нужно использовать 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
 
Верх