Что нового

[Баг] Неправильные области определения переменных

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Прошу подтвердить следующую багу
Код:
Func a()
    $N = 3
EndFunc

$N = 5
a()
ConsoleWrite($N & @CRLF)

У меня показывает, что $N = 3, хотя это значение внутри функции.
моя конфигурация
Win7 x64 Rus, AutoIt 3.3.8.0

Проблема решается принудительным объявлением переменной как Local внутри функции, что не очень удобно


Добавлено:
Сообщение автоматически объединено:

откатился на версию 3.3.6.1, то же самое. я всегда думал, что все, что определено внутри функций остается внутри функции, если только это не глобальные переменные. кто-нибудь объяснит, в чем дело? :smile:


Добавлено:
Сообщение автоматически объединено:

почитал справку, давно этого не делал :-[
и подумать не мог, что такое поведение по умолчанию.
тема решена и закрыта в связи с неактуальность.
PS: интересно, зачем тогда ключевое слово Global, если по умолчанию все переменные и так глобальные.
 

Yashied

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

Код:
Func a()
    $N = 3
EndFunc

a()
ConsoleWrite($N & @CRLF)


Если переменная не была объявлена до вызова функции, то она будет локальной, в противном случае - глобальной. А вообще, лучше всегда использовать "MustDeclareVars".
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
возможно поторопился с закрытием темы. если кому интересно, пишите. я подумал, что я один такой дурак, а всем давно все известно :smile:

но в общем и целом, это конечно печально. я работая с различными ЯП не видел подобного. но, как говорится, на нет и суда нет :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Kaster [?]
если кому интересно, пишите
А что писать то, уже всё сказано.
Это не бага.

Вот ещё пример:

Код:
$N = 5
a()
ConsoleWrite($N & @CRLF)

Func a()
    Local $N = 3
EndFunc


$N по прежнему 5, т.к мы указали Local внутри функций.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
CreatoR [?]
$N по прежнему 5, т.к мы указали Local внутри функций.
да, именно это я и написал в первом сообщении, что если я хочу использовать одни и те же переменные как внутри так и снаружи функции, то придется объявлять внутри как локальную.
Kaster [?]
Проблема решается принудительным объявлением переменной как Local внутри функции, что не очень удобно

именно это мне видится неудобным. да и потом, как я уже сказал выше, так теряется смысл ключевого слова Global, т.к. можно его не использовать, переменная все равно и так глобальная.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Kaster [?]
придется объявлять внутри как локальную
Что значит придётся?
Это правильная манера написания кода, ты должен объявлять переменные.
Кстати для этого есть скрипт генераций переменных.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
CreatoR
В последней версии list_var_funk.au3 есть кнопка "из буфера" и "Local". Если скопировать функцию и нажать последовательно эти кнопки, то на выходе получим готовую строку всех переменных функции с текстом "Local", хотя надо добавить перенос строки и таб. Ну и немного подправить - удалить из строки глобальные переменные и переменные переданные в параметрах (хотя последние можно вычислить регулярным выражением)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
В последней версии list_var_funk.au3 есть кнопка "из буфера" и "Local"
Зачем так сложно, ты тему читал по ссылке?
Там из меню одним нажатием (ну или г.клавишей «Ctrl + 2») можно получить список переменных для конкретной функций (выделенного текста).
И указанных тобой проблем нет.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
CreatoR
И указанных тобой проблем нет.
Ещё раз попробовал и в результате скрипт выдал переменные, которые обьявлены в параметрах. А не пробовал я потому что не увидел там каких либо сложных регулярных выражений детектирующих сначала строку функции, потом параметры из этой строки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
скрипт выдал переменные, которые обьявлены в параметрах
Да точно, забыл я про это.
Поправил.
Добавил также разные сообщения при ошибках выделения.

Теперь нужно выделять всю функцию, включая «Func Name()».
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Kaster
Странно почему это только сейчас заметил) Я с этим столкнулся ещё в первые дни освоения autoit. :smile:
Это научило использовать уникальные названия в переменных и объявлять счетчики For $i=... локальными... на всякий случай)

P.S. Больше вопросов возникает зачем нужно объявлять константы? если их и так не изменяешь, а только читаешь? Или это для UDF которыми будут пользоваться другие люди?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
zlo-kazan [?]
Больше вопросов возникает зачем нужно объявлять константы?
Если честно, то я про константы тоже плохо понимаю, например, почему можно сделать так:
Код:
#include <GuiListView.au3>

If Not IsDeclared('Debug_LV') Then $Debug_LV = 800
MsgBox(0, '', $Debug_LV)
Но нельзя сделать так:
Код:
#include <GUIConstantsEx.au3>

If Not IsDeclared('GUI_EVENT_CLOSE') Then $GUI_EVENT_CLOSE = -333
MsgBox(0, '', $GUI_EVENT_CLOSE)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Если посмотреть в UDF, то $Debug_LV не является константой, а $GUI_EVENT_CLOSE является.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
AZJIO [?]
$Debug_LV не является константой
А про что я писал?
Почему не константу, но глобальную переменную можно проверить и, если надо, объявить ее и присвоить ей значение, а с константой такой вариант не проходит.

AZJIO [?]
Если посмотреть в UDF
Поверьте мне на слово, я очень часто заглядываю в UDF.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
друзья, друзья.
я всего лишь имел в виду, что такое поведение далеко нетипично для языков с необязательным объявлением переменных. не сталкивался я с этим, "аномальным" с точки зрения логики, поведением, потому что не приходилось использовать одну и ту же переменную и в функции и в теле скрипта. и опять же, я повторю, в таком случае, лично мне, использованием ключевого слова Global кажется излишним. любая переменная уже глобальна. по умолчанию. я программировал на нескольких языках до AutoIt, еще на большем после :smile: вот и все. я вначале подумал, что это бага, открыл тему, потом понял что нет. закрыл. открыл снова. не вижу тут никаких проблем :smile:

ну а про то, как нужно программировать, скажу так - зачем в языке реализована возможность не объявлять переменные, при этом считать что грамотнее все же объявлять?

в целом, как говорится, век живи век учись. вот я и узнал еще кое-что новенькое.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
madmasles
Я совсем не понял вопроса, во первых обе переменные в обоих примерах объявлены и условие никогда не сработает, во вторых если убрать "Not" то первый выполнит присвоение, второй вылетит с ошибкой. Всё работает согласно документации.

Почему не константу, но глобальную переменную можно проверить и, если надо, объявить ее и присвоить ей значение, а с константой такой вариант не проходит.
Ну дык это школьный курс математики. Константа по определению постоянная величина. Это как доказывать непересекаемость паралельных прямых, они паралельный потому что не пересекаются, это просто правило которое нужно принять как есть.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Почему не константу, но глобальную переменную можно проверить и, если надо, объявить ее и присвоить ей значение, а с константой такой вариант не проходит
Так на то она и константа, чтобы её нельзя было переназначить (a.k.a «Read Only») :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
OffTopic:
AZJIO [?]
Всё работает согласно документации.
Слава Богу, Вы ее перевели (за что спасибо Вам, просто огромное), теперь проще, перечитаю на русском, (ну очень плохо у меня с англ. языком, почти никак).

CreatoR [?]
Так на то она и константа, чтобы её нельзя было переназначить (a.k.a «Read Only»)
Вот в это я и пытаюсь въехать уже давно, но... ,ИМХО, безуспешно.
 
Верх