Что нового

обращение к глобальным переменным из функции

JohnWind

Новичок
Сообщения
57
Репутация
0
Доброго времени суток,

есть в наличии уже работающий скрипт, в котором существует функция проверки некоторого состояния.
но столкнулся с ситуацией, когда браузер (по разным причинам) зависает и процесс "проверки состояния" зависает в повторе.

решил добавить проверку на данное "зависание", чтоб при необходимости (если зависло на определённое кол-во повторов/секунд) выключить программу.
заодно решил сохранить в текстовый лог файл, некоторые глобальные переменные (логин) во время которых случилось зависание.

основной код:
;~ Open Log file
$logFile = FileOpen("logFile.txt", 1)
....
$Login = FileReadLine($credFile, $cred_count_line)
.....
LogInCheck ()

функция которая отрабатывает "проверку зависания" которая хранится в отдельной библиотеке "MyFunctions.au3" и которая подключается через #include "MyFunctions.au3"

Func LogInCheck ()
..... некоторые условия + инкрементация счётчика если проверка не прошла

;~ Если проверка логина не прошла более 10 раз
if $noLogin > 10 Then

FileWrite($logFile, "Last account processed: ")
FileWrite($logFile, $Login)
FileWrite($logFile, " " & @CRLF)
EndIf

при запуске основного кода, вылетает Warning: : warning: $logFile: possibly used before declaration.
которая не блокирует исполнение, но вызывает некоторый когнитивный диссонанс :smile:

вопрос: как (без прямой передачи в функцию переменной имени лог-файла и текущего логина) обойти это предупреждение?

заранее спасибо...
Сообщение автоматически объединено:

"додумался" до переноса всей функции в основной код, но возможно есть решение и для случая когда функция хранится в другой библиотеке.
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
279
Репутация
74
Думаю проблема в том, что вы не объявляете перемеренные явно.
Переменные, которые используются в других скриптах или функция нужно объявлять как глобальные, а которые внутри функций как локальные.
 
Автор
J

JohnWind

Новичок
Сообщения
57
Репутация
0
Думаю проблема в том, что вы не объявляете перемеренные явно.
Переменные, которые используются в других скриптах или функция нужно объявлять как глобальные, а которые внутри функций как локальные.
попробовал использовать вашу идею, добавил в осн. код

;~ Open Log file
Global $logFile
$logFile = FileOpen("logFile.txt", 1)

и
Global $Login
$Login = 'AAAAA' (упростил тут до хардкода некоторого значения)

увы, warning сохранился... или я неверно объявил переменные?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Дело в том, что при запуске скрипта AutoIt объединяет все #include в один общий скрипт. То есть на место строки #include "MyFunctions.au3" будет подставлен весь текст этого файла. Получается, что у вас сначала идёт строка FileWrite($logFile, "Last account processed: "), а затем Global $logFile. Поэтому и ругается. Здесь два варианта объявления Global $logFile: либо в MyFunctions.au3, либо в основном скрипте до #include
Код:
Global $logFile
#include "MyFunctions.au3"

А если вы пользуетесь полной SciTE и уверены, что переменная точно будет иметь значение при вызове функции из #include, то можете в начале основного скрипта прописать директиву Wrapper'а, которая принудительно "объявит" переменную
Код:
#forcedef $logFile
 
Автор
J

JohnWind

Новичок
Сообщения
57
Репутация
0
Дело в том, что при запуске скрипта AutoIt объединяет все #include в один общий скрипт. То есть на место строки #include "MyFunctions.au3" будет подставлен весь текст этого файла. Получается, что у вас сначала идёт строка FileWrite($logFile, "Last account processed: "), а затем Global $logFile. Поэтому и ругается. Здесь два варианта объявления Global $logFile: либо в MyFunctions.au3, либо в основном скрипте до #include
Код:
Global $logFile
#include "MyFunctions.au3"

А если вы пользуетесь полной SciTE и уверены, что переменная точно будет иметь значение при вызове функции из #include, то можете в начале основного скрипта прописать директиву Wrapper'а, которая принудительно "объявит" переменную
Код:
#forcedef $logFile
спасибо за подробный ответ!!! опробовал 1й вариант - ВСЁ работает штатно без ворнингов!!!

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

Global $logFile
$logFile = FileOpen("logFile.txt", 1)

#include "MyFunctions.au3"
 
Верх