;#include <GuiConstants.au3>
#include <INet.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <ImageSearch.au3>
Global $paus, $x, $y, $result,$picked,[email protected]&'farmbotico.ico',$afterlogin=0,$polog = GuiCreate("farm b0t v1.0, Step by step",426,357,562,114),$button1=GuiCtrlCreateButton("X",375,-1,48,24),$button2=GuiCtrlCreateButton("Options",240,275,157,56),$button3=GuiCtrlCreateButton("Start",36,276,155,55)
$starter=0
$paus=0
If FileExists("C:WINDOWSsystemImageSearchDLL.dll") Then
else
FileCopy("ImageSearchDLL.dll", "C:WINDOWSsystem", 9)
endif
If FileExists("C:WINDOWSImageSearchDLL.dll") Then
else
FileCopy("ImageSearchDLL.dll", "C:WINDOWS", 9)
endif
$picked=0
HotKeySet("{esc}","close")
HotKeySet("{f1}","start")
HotKeySet("{f2}","stope")
TraySetIcon($sIconPath)
Opt("TrayMenuMode",1)
$delitem = TrayCreateItem("help")
TrayCreateItem("")
$aboutitem = TrayCreateItem("More info")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")
TraySetState()
TraySetToolTip("Farm bot welcome ! BOT WORK WITH 1025x768 RESOLUTION IN LOL")
SplashImageOn("", @ScriptDir & "farmbotwelcome.jpg", 300, 300)
Sleep(3000)
SplashOff()
;;================================================================================
;;VARIABEL DEFINITION
;;================================================================================
$WebFileLoc = "http://linktologinphp.com/login.php"
$Login = GUICreate("Login",355,226)
GUICtrlCreatePic("farmbotloginbg.jpg", 0, 0, 355, 226)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetIcon("farmbotico.ico",-20)
$OKbutton = GUICtrlCreateButton("Login",230,180,100)
GUICtrlSetTip(1, "Multi state bitmap imagelist")
$Exit = GUICtrlCreateButton("Exit",80,180,100)
GUICtrlSetTip(1, "Multi state bitmap imagelist")
$User = GUICtrlCreateInput("Username",21,75,310,28)
$Pass = GUICtrlCreateInput("Password",21,132,310,28,$ES_PASSWORD)
GUISetState()
;;================================================================================
;;LOGIN LOOP
;;================================================================================
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE or $msg = $Exit
MsgBox(0, "Thanks for using", "cya, see you soon :*")
Exit
Case $msg = $OKbutton
_login()
EndSelect
;tray menu
$msg = TrayGetMsg()
Select
Case $msg = 0
ContinueLoop
Case $msg = $aboutitem
Msgbox(64,"About:","Bot farm ip , thanks for using !")
Case $msg = $delitem
Msgbox(64,"help","if u want start bot just login to ur exist account in League of legend, then start bot button and be happy for free farm bot !")
Case $msg = $exititem
ExitLoop
EndSelect
; end tray menu
WEnd
;;================================================================================
;;_login()
;;================================================================================
func _login()
$UsernameInput = GUICtrlRead($User)
$PasswordInput = GUICtrlRead($Pass)
if $UsernameInput = "" or $PasswordInput = "" Then
MsgBox(0,"ERROR","Please Enter a Username and Password")
Else
$WEBdata = _INetGetSource($WebFileLoc &'?user=' & $UsernameInput & '&pass=' & $PasswordInput)
if $WEBdata = "02" Then
MsgBox(0,"Error","Unable to Login" & @lf & "Username was incorrect")
ElseIf $WEBdata ="0102" Then
MsgBox(0,"Error","Unable to Login" & @lf & "Wrong password")
Else
;@@@@@@@@ BOT AFTER LOGIN GUI HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$afterlogin=1
GUISetState(@SW_HIDE, $login)
ProgressOn("Loading...", "Be patient", "0%")
For $i = 10 To 100 Step 20
Sleep(500)
ProgressSet($i, $i & "%")
Next
ProgressSet(100, "Succes login", "Complete gratz...")
Sleep(500)
ProgressOff()
TrayTip("Login","Login successful gratz, BOT WORK WITH 1025x768 RESOLUTION IN LOL",4)
$polog = GuiCreate("farm b0t v1.0, Step by step",426,357,562,114)
afterlogin(); using after login func after succesfull login!:D
endif
endif
;@@@@@@@@@@@@@@@@@ BOT AFTER LOGIN GUI END @!@!@!@
EndFunc ;--> _login()
;// BOT FUCTION START HERE !!!!!!!!!!!!!!!!@@@@@@@@@@@@@@!!!!!!!!!!!!!
func afterlogin() ; start function after login
GUICtrlCreatePic("farmbottlo.jpg", 0, 0, 426, 357)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetIcon("farmbotico.ico",-20)
$button2=GuiCtrlCreateButton("Pause",240,275,157,56)
GUICtrlSetTip(-1, "Multi state bitmap imagelist")
$button3=GuiCtrlCreateButton("Start b0t",36,276,155,55)
GUICtrlSetTip(-1, "Multi state bitmap imagelist")
$widthCell = 350
GUICtrlCreateLabel("This bot is really easy to use u just need to open a LOL luncher then", 40, 140, $widthCell)
GUICtrlCreateLabel("Login and press start button in bot thats all", 40, 160, $widthCell)
GUICtrlCreateLabel("now u need just be away from keyboard and dont move mouse. ", 40, 180, $widthCell)
GUICtrlCreateLabel("Vala ur LOL account FARM by afking ;o Good job ! ", 40, 200, $widthCell)
GUICtrlCreateLabel("If u have a problem with close bot just press ESCAPE ", 40, 220, $widthCell)
GUICtrlCreateLabel("F1 = START , F2 = PAUSE ,BOT WORK WITH 1025x768 RESOLUTION IN LOL", 40, 240, $widthCell)
GuiSetState()
While 1
$msg=GuiGetMsg()
if $msg=-3 then
MsgBox(0, "Thanks for using", "cya, see you soon :*")
Exit
endif
If $msg=$button2 Then button2()
If $msg=$button3 Then button3()
wend
endfunc ; end function after login...
Func button2()
EndFunc
Func button3()
if $afterlogin=1 then
traytip("Cant close program?","If u have problem with clsoe program press escape !",5)
start()
Else
msgbox(0,"hacker?","u try use bot without login !!!! bad boy!!")
exit
endif
EndFunc
func close()
exit
endfunc
func stope()
if $paus=0 then
afterlogin()
While 1
sleep(400)
ExitLoop
wend
endif
$paus=1
endfunc
func start()
$paus=0
if not ProcessExists("LolClient.exe") Then
MsgBox(0,"ERROR","Turn on League of Legends CLIENT: LolClient.exe not found")
traytip("Turn ON LOL","turn LOL login and press start !! BOT WORK WITH 1025x768 RESOLUTION IN LOL",5)
endif
While 1
if not ProcessExists("LolClient.exe") Then
exitloop
GUICtrlDelete($polog)
GUICtrlDelete($button1)
GUICtrlDelete($button2)
GUICtrlDelete($button3)
afterlogin()
else
IF WINEXISTS("League of Legends (TM) Client") THEN
sumonerspell()
else
If Not WinActivate("PVP.net Client","") Then WinActivate("PVP.net Client","")
If WinActivate("PVP.net Client","") Then
$picked=0
$result = _ImageSearch("farmbotplay.bmp", 1, $x, $y, 0)
If $result = 1 Then
sleep(440)
play()
sleep(500)
normalgame5v5()
sleep(1000)
Else
rec()
sleep(200)
playnoow()
sleep(110)
pickhero()
sleep(110)
lobbyback()
endif
endif
endif
endif
wend
endfunc
func rec()
If Not WinActivate("PVP.net Client","") Then WinActivate("PVP.net Client","")
sleep(599)
$result = _ImageSearch("farmbotok.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
$result = _ImageSearch("farmbotrec.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
endfunc
func playnoow()
$result = _ImageSearch("farmbotplaynow.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
endfunc
func lobbyback()
sleep(2000)
$result = _ImageSearch("farmbotlobby.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
endfunc
func pickhero()
if not ProcessExists("League of Legends.exe") then
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
sleep(2000)
$result = _ImageSearch("farmbotrandom.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
$picked=1
EndIf
sleep(800)
if $picked = 1 then
$result = _ImageSearch("farmbotlock.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
endif
endif
endfunc
func play()
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotplay.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
endfunc
func normalgame5v5()
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotcreategame.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotnamegame.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Send("fgfthtfthdccv")
endif
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotpasswordgame.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Send("fdsdffggfhdfhfdgdf")
endif
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotcreategamebot.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotteam2.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
sleep(800)
If Not WinActive("PVP.net Client","") Then WinActivate("PVP.net Client","")
$result = _ImageSearch("farmbotstartgame.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
endfunc
func sumonerspell()
if not WinActivate("League of Legends (TM) Client","") then WinActivate("League of Legends (TM) Client","")
if WinActivate("League of Legends (TM) Client","") then
$result = _ImageSearch("farmbotno.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
endif
;$result = _ImageSearch("farmbotjezeli.bmp", 1, $x, $y, 0)
;If $result = 1 Then
; sleep(2000)
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
else
$pos = MouseGetPos()
$result = _ImageSearch("tow.bmp", 1, $x, $y,0)
If $result = 1 Then
MouseClick("right", $x, $y)
endif
$result = _ImageSearch("farmbotheal.bmp", 1, $x, $y,0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotgost.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
EndIf
endif
endif
endif
sleep(2000)
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
else
Mousemove($pos[0],$pos[1],70)
endif
endif
sleep(400)
if WinActivate("League of Legends (TM) Client","") then
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
else
MouseClick("right", 720, 250, 1, 0)
endif
endif
endif
sleep(299)
$pos = MouseGetPos()
sleep(400)
if WinActivate("League of Legends (TM) Client","") then
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
else
MouseClick("right", $pos[0]-50, $pos[1]+60, 1, 0)
endif
endif
endif
sleep(1400)
if WinActivate("League of Legends (TM) Client","") then
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
else
MouseClick("right", $pos[0], $pos[1], 1, 0)
endif
endif
endif
sleep(1000)
$result = _ImageSearch("farmbotvicory.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
Else
$result = _ImageSearch("farmbotdefeat.bmp", 1, $x, $y, 0)
If $result = 1 Then
MouseClick("left", $x, $y)
endif
endif
; endif
endif
endfunc
Обновлено: 27.01.2023
Современные компиляторы обладают огромным количеством диагностик. И удивительно, что очень малая их часть включена по умолчанию.
Огромное количество претензий, которые предъявляют к языку C++ в этих ваших интернетах, — про сложность, небезопасность, стрельбу по ногам и т.п., — относятся как раз к тем случаям, когда люди просто не знают о том, что можно решить эти проблемы лёгким движением пальцев по клавиатуре.
Давайте же исправим эту вопиющую несправедливость, и прольём свет истины на возможности компилятора по предотвращению ошибок.
Нужно больше предупреждений
Но и это ещё не всё. Есть несколько флагов, которые почему-то не входят ни в один из «аргегаторов», но крайне важны и полезны.
-Wctor-dtor-privacy
Предупреждает о том, что класс выглядит неиспользуемым, потому что конструкторы и деструкторы закрыты, а друзей и открытых статических функций-членов у него нет.
Аналогично, сообщает, что у класса есть закрытые функции-члены, а открытых нет ни одной.
-Wnon-virtual-dtor
Предупреждает о том, что у класса есть виртуальные функции-члены, но деструктор при этом не виртуальный. Очень сложно представить себе такой класс. Вероятнее всего, это ошибка.
-Wold-style-cast
Предупреждает о приведении типов в стиле языка C. В плюсах есть прекрасные и ужасные static_cast , dynamic_cast , reinterpret_cast и const_cast , которые более локальны и более описательны. Сишный способ слишком сильный и — о, ужас, — небезопасный. Лучше его не использовать вообще.
-Woverloaded-virtual
Предупреждает о попытке в классе-наследнике перегрузить виртуальную функцию базового класса:
-Wsign-promo
Крайне полезный флаг. Предупреждает о неочевидном выборе перегруженной функции:
Вероятнее всего, хотели-таки позвать вторую перегрузку, а не первую. А если всё-таки первую, то будьте любезны сказать об этом явно.
-Wduplicated-branches
Предупреждает о том, что ветви if и else одинаковы:
Условный оператор ?: также под прицелом:
Для меня абсолютная загадка, почему этот флаг не включён не то, что в -Wall , а вообще по умолчанию.
-Wduplicated-cond
Предупреждает об одинаковых условиях в цепочках if-else-if :
-Wfloat-equal
Предупреждает о проверке на равенство между двумя числами с плавающей точкой. Скорее всего, это ошибка, и сравнение нужно проводить с заданной точностью.
Если же требуется именно сравнить на равенство (такое редко, но бывает), то можно использовать std::equal_to , который под предупреждение не попадает.
-Wshadow=compatible-local
Полезная опция, которая не даёт перекрыть локальную переменную другой локальной переменной при условии, что они имеют совместимые типы.
-Wcast-qual
Предупреждает о преобразовании указателя, при котором сбрасываются квалификаторы. Например, чтобы случайно не потерять const .
-Wconversion
Очень, очень, очень важный флаг. Он предупреждает об огромном количестве неявных сужающих (то есть потенциально приводящих к потере информации) преобразований, которые могут быть следствием ошибки программиста. Например:
Если вы раньше никогда не включали этот флаг, то будет интересно.
-Wzero-as-null-pointer-constant
Предупреждает об использовании целочисленного нуля вместо nullptr .
-Wextra-semi
Флаг для педантов. Сообщает о лишней точке с запятой после определения функции-члена.
-Wsign-conversion
Как и -Wconversion помогает предотвратить большое количество неявных преобразований, которые запросто могут быть ошибками:
-Wlogical-op
Предупреждает о подозрительных логических выражениях. Например, когда вместо побитового «И» поставили логическое «И», или логическое выражение имеет одинаковые операнды:
-Wextra
«Агрегатор» дополнительных предупреждений. Включает много интересного, чего нет в -Wall (как и в случае с -Wall , рассмотрены будут не все возможности).
-Wempty-body
Предупреждает о пустом теле условных выражений или цикла do-while . Чаще всего это говорит об опечатке, меняющей логику программы:
-Wimplicit-fallthrough
Предупреждает о «проваливании» в операторе switch :
Компилятор предполагает, что программист забыл break , и case 2 не должен проваливаться:
В C++17 для обозначения явного намерения появился специальный атрибут — fallthrough :
-Wmissing-field-initializers
Предупреждает о том, что отдельные члены структуры не были проинициализированы. Скорее всего это просто забыли сделать:
-Wredundant-move
Предупреждает о ненужном вызове std::move в случаях, когда компилятор сам сделает всё, что нужно:
-Wtype-limits
Предупреждает о сравнениях, которые всегда имеют один и тот же результат. Например, когда беззнаковое число проверяется на неотрицательность. Если программист делает такую проверку, то, видимо, предполагает, что число в теории может быть отрицательным, однако, это не так. Видимо, он где-то ошибся:
-Wshift-negative-value
Предупреждает об операциях сдвига для отрицательных значений. Отрицательными могут быть только знаковые числа, а для них это некорректно:
-Wunused-parameter
Предупреждает о неиспользуемом параметре функции. Возможно, про него просто забыли, и в этом случае функция может работать некорректно.
В C++17 для явного выражения намерения существует атрибут maybe_unused :
-Wunused-but-set-parameter
Предупреждает о том, что в параметр функции было записано значение, но после этого он ни разу не использовался. Возможно, про него снова забыли:
Ода компилятору
Компилятор – лучший друг плюсовика. Компилятор — это не просто транслятор формального человекочитаемого языка в машинные коды. Компилятор — лучший помощник в написании программ.
Важная (и не единственная) помощь, которую оказывает компилятор — поиск ошибок. И я говорю не об опечатках, несовпадении типов и прочих синтаксических ошибках. Я говорю об огромном наборе ошибок, которые можно выловить с помощью механизма предупреждений.
Часто встречаю мнение о том, что предупреждений слишком много, они дают ложноположительные результаты, мешают работать, замыливают глаз, отвлекают от «настоящих» ошибок и т.п. Такое действительно бывает, но это большая редкость.
Большинство предупреждений — это не «бзик» компилятора, который можно просто проигнорировать. Предупреждение — это потенциальная ошибка. Предупреждение — это сигнал от компилятора о том, что написано одно, а требуется, возможно, что-то совершенно иное.
Далее я расскажу о наиболее важных на мой взгляд предупреждениях и покажу, какие ошибки можно отловить с их помощью.
Надеюсь, что данное не слишком занимательное чтиво поможет правильно поставить запятую в заголовке этого раздела.
Сразу хочу оговориться, что далее речь пойдёт исключительно о языке C++ и компиляторе GCC (впрочем, подавляющая часть информации актуальна и для компилятора Clang). Информацию о других компиляторах и языках придётся искать в соответствующих справочниках.
-Wall — это «агрегатор» базовых предупреждений. В языке C++ он включает в себя длинный перечень предупреждений, каждое из которых будет рассмотрено отдельно (на самом деле, рассмотрены будут не все, а только те, которые непосредственно помогают выявлять ошибки).
Несмотря на название, этот флаг включает далеко не все предупреждения, которые умеет обнаруживать компилятор.
-Waddress
Предупреждает о странной работе с адресами. Например, об использовании адреса функции в условном выражении. Такое может произойти, если забыть поставить скобки после имени функции:
Также этот флаг может спасти от типичной ошибки новичка — сравнения строкового литерала с адресом. Очевидно, программист хотел сравнить строки, но в результате сравнил два указателя:
-Warray-bounds=1
Предупреждает о выходе за пределы массивов. Используется только вместе с -O2 .
-Wbool-compare
Предупреждает о сравнении булева выражения с целым числом, которое нельзя трактовать как булево:
-Wbool-operation
Предупреждает о подозрительных операциях с булевыми выражениями. Например, о побитовом отрицании:
Что касается инкрементов и декрементов булевых переменных, то в C++17 это просто ошибки, безо всяких предупреждений.
-Wcatch-value
Предупреждает о обработчиках исключений, которые принимают полиморфные объекты по значению:
Есть и более сильные версии предупреждения: -Wcatch-value=n (см. справку к компилятору).
-Wchar-subscripts
Предупреждает об обращении к массиву по индексу, тип которого char . А ведь char является знаковым на многих машинах:
-Wcomment
Предупреждает о наличии последовательности, начинающей новый комментарий ( /* ), внутри многострочного комментария, либо о разрыве строки при помощи обратного слеша внутри однострочного комментария.
-Wint-in-bool-context
Предупреждает о подозрительном использовании целых чисел там, где ожидаются булевы выражения, например, в условных выражениях:
Другой пример — операции побитового сдвига в булевом контексте. Вполне вероятно, что здесь произошла опечатка, и имелся в виду не сдвиг, а сравнение:
А также сообщает о любых видах умножения в булевом контексте.
-Winit-self
Предупреждает об инициализации переменных самими сабями. Используется только вместе с флагом -Wuninitialized .
-Wlogical-not-parentheses
Предупреждает об использовании логического отрицания в левой части сравнения. При этом если правая часть сравнения является сама по себе булевым выражением, то предупреждения не будет.
Используется для того, чтобы отлавливать подозрительные конструкции вроде следующей:
Традиционный способ сообщить компилятору, что так и было задумано — поставить скобки, о чём и сообщает компилятор.
-Wmaybe-uninitialized
Предупреждает о том, что существует возможность использования непроинициализированной переменной.
В данном конкретном случае решается с помощью конструкции default :
-Wmemset-elt-size
Предупреждает о подозрительных вызовах функции memset , когда первый аргумент — это массив, а третий аргумент — количество элементов в массиве, но не количество байт, занимаемой этим массивом в памяти.
-Wmemset-transposed-args
Предупреждает о том, что пользователь, вероятно, перепутал порядок аргументов в функции memset :
-Wmisleading-indentation
Предупреждает о том, что отступы в коде не отражают структуру этого кода. Особенно это актуально для конструкций if , else , while и for . Пример:
-Wmissing-attributes
Предупреждает о ситуации, когда специализация шаблона объявлена не с тем же списком атрибутов, что и оригинальный шаблон.
-Wmultistatement-macros
Предупреждает о макросах, состоящих из нескольких инструкций, и используемых в выражениях if , else , while и for . В такой ситуации под действие выражений попадает только первая инструкция макроса, и это, вероятно, ошибка:
-Wnonnull
Предупреждает о передаче нулевого указателя в функцию, аргументы которой помечены атрибутом nonnull .
-Wnonnull-compare
Предупреждает о сравнении с нулём аргумента функции, помеченного атрибутом nonnull .
-Wparentheses
Типичный случай — опечатались, и вместо равенства написали присвоение:
Компилятор, естественно, сомневается:
Либо исправляем код, либо убеждаем компилятор в том, что мы хотели именно присвоение:
-Wpessimizing-move
Иногда явная попытка переноса может ухудшить производительность. Пример:
-Wreorder
Предупреждает о том, что порядок инициализации членов класса не соответствует порядку их объявления. Поскольку компилятор может переупорядочить инициализацию этих членов, результат может быть неочевидным.
-Wreturn-type
Предупреждает о том, что из функции не вернули заявленный результат:
-Wsequence-point
Сообщает о подозрительных операциях относительно точек следования. Любимый пример (никогда так не делайте):
-Wsign-compare
Одно из важнейших предупреждений. Сообщает о сравнении знаковых и беззнаковых чисел, которое может произвести некорректный результат из-за неявных преобразований. К примеру, отрицательное знаковое число неявно приводится к беззнаковому и внезапно становится положительным:
-Wsizeof-pointer-div
Предупреждает о подозрительном делении друг на друга двух результатов выражения sizeof , когда размер указателя делится на размер объекта. Обычно это бывает, когда пытаются вычислить размер массива, но вместо массива по ошибке берут указатель:
-Wsizeof-pointer-memaccess
Предупреждает о подозрительных параметрах, передаваемых в строковые функции и функции для работы с памятью ( str. , mem. и т.п.), и использующих оператор sizeof . Например:
-Wstrict-aliasing
Каламбур типизации (strict aliasing) — это отдельная большая тема для разговора. Предлагаю читателю найти литературу по этой теме самостоятельно.
В общем, это тоже крайне полезное предупреждение.
-Wswitch
Предупреждает о том, что не все элементы перечисления задействованы в конструкции switch :
-Wtautological-compare
Предупреждает о бессмысленном сравнении переменной с самой собой:
Кроме того, сообщает о сравнениях при участии битовых операций, которые имеют всегда один и тот же результат (всегда истинно или всегда ложно):
-Wtrigraphs
Предупреждает о наличии триграфов, которые могут изменить смысл программы. Не сообщается о триграфах в теле комментария, за исключением случаев, когда триграф трактуется как перевод строки.
-Wuninitialized
Предупреждает об использовании переменных и членов класса, которые не были проинициализированы:
-Wunused-function
Предупреждает о том, что статическая функция объявлена, но не определена, либо о том, что статическая функция, не помеченная как inline , не используется.
-Wunused-variable
Предупреждает о том, что переменная не используется.
Для того, чтобы помочь компилятору понять, что так и задумывалось, можно использовать конструкцию static_cast<void>(. ) :
Заключение
Резюмируя, для компилятора GCC (Clang кое-что из этого не умеет, к сожалению) я рекомендую включать следующий минимальный набор флагов, по необходимости дополняя его более сложными диагностиками.
Да, такой список флагов может породить большое количество ошибок, которые поначалу могут показаться излишними. Но явное лучше неявного. Если знаешь, что делаешь — делай. Но делай это так, чтобы всем было понятно, что именно так ты и хотел. Поработав таким образом хотя бы неделю, вы поймёте, насколько это прекрасно, и уже не сможете вернуться обратно.
1)То что автор не я можно догадаться.(Понимаю здесь работают не гадалки, но всё же)
Скажи что тебе даст воспроизведение ошибки, и как ты это получишь.
и я сделаю всё сам, и дам тебе инфу нужную.
Всю черновую работу можете поручить мне, главное скажите что делать.
2)А почему кнопка паузы не работает не известно?
3)Автор какой-то немец( я только изменил его немного) и контактов свои не оставил.
AZJIO
Меценат
biko3
Пишет что переменные не декларированы, попробуй декларировать.
И попробуй использовать скрипт не скомпилированным. Тогда даст точную строку ошибки.
-Wpedantic
-Wall и -Wextra — это не всё, на что способен компилятор.
В дополнение к ним существует флаг -Wpedantic (он же -pedantic ), который проверяет соответствие кода стандарту ISO C++, сообщает об использовании запрещённых расширений, о наличии лишних точек с запятой, нехватке переноса строки в конце файла и прочих полезных штуках.
Содержание
-Werror
С этого, вообще говоря, стоило бы начать. Данный флаг делает все предупреждения ошибками. Код не скомпилируется при наличии хотя бы одного предупреждения.
Без этого флага всё остальное имеет мало смысла. Но если понять и принять мысль о том, что предупреждение — это что-то подозрительное, и их быть не должно, то именно этот флаг и позволит поддерживать код в чистоте.
В дополнение к -Werror существует флаг -pedantic-errors , который не эквивалентен комбинации -Wpedantic -Werror .
6 posts • Page 1 of 1
Bailx Posts: 6 Joined: Mon Jul 10, 2006 1:22 am
[FIXED] Error: Variable used without being declared.
Post by Bailx » Mon Jul 10, 2006 1:33 am
Was hoping someone might be able to help me out with this. I am running into an error, and the very first one i’ve ever had with rvm integrator i might add, anyways. i must note that the only differences between this time and the last time is last time i used 2.0.7, this time it’s 2.0.7a, and all the update packs are the same, except i added these two:
otherwise it’s identical.
here is a screenshot
i was just about to try it another time, without the two new addons, but still with 2.0.7a. and I thought maybe i’d post and see if anyone had seen this before (couldn’t find anything searching)
Bailx Posts: 6 Joined: Mon Jul 10, 2006 1:22 am
Post by Bailx » Mon Jul 10, 2006 2:09 am
huh.. well this is odd.
i did that procedure twice (above) and it failed twice exactly the same way.
then i did the 2.0.7a update seperatly — worked fine
then i did Multi_Siginet_MultiTheme-AddonsPack_1.7.cab & Kels_Brushed_Inspirat_v1.cab
that worked, then i did the rest.
odd that they didn’t all work together, but worked seperatly.
also another thats odd. the first two times i just pressed ctrl + a to select all of the addons, but for some reason (and you can see in the log) Kels_Brushed_Inspirat_v1.cab doesn’t show up in the popup screen (when you choose your *.cab files) *.* in the box, and the file shows up.
The variable ‘znak’ is being used without being initialized.
Переменная ‘znak’ используется без инициализации.
Инициализация при объявлении выглядит так: char znak = 0; , а не как у вас char znak; — это объявление без инициализации.
Нельзя обращаться к переменной, пока в нее не присвоили какое либо значение.
Скорее всего это не ошибка, а предупреждение, т.к. обращаться к такой переменной можно, нельзя что-то предполагать о содержимом этой переменной и производить на основании этого какие-то дальнейшие действия.
Чаще всего такая ситуация — это ошибка программиста, как в данном случае. Но бывают и исключения.
Читайте также:
- Bulletstorm системные требования
- Как убрать иконку в лиге легенд
- Программа для замены моделей в гта 5
- Ошибка загрузки сохраненных данных dark souls 2
- Atlas copco ошибки компрессора
Обновлено: 27.01.2023
Современные компиляторы обладают огромным количеством диагностик. И удивительно, что очень малая их часть включена по умолчанию.
Огромное количество претензий, которые предъявляют к языку C++ в этих ваших интернетах, — про сложность, небезопасность, стрельбу по ногам и т.п., — относятся как раз к тем случаям, когда люди просто не знают о том, что можно решить эти проблемы лёгким движением пальцев по клавиатуре.
Давайте же исправим эту вопиющую несправедливость, и прольём свет истины на возможности компилятора по предотвращению ошибок.
Нужно больше предупреждений
Но и это ещё не всё. Есть несколько флагов, которые почему-то не входят ни в один из «аргегаторов», но крайне важны и полезны.
-Wctor-dtor-privacy
Предупреждает о том, что класс выглядит неиспользуемым, потому что конструкторы и деструкторы закрыты, а друзей и открытых статических функций-членов у него нет.
Аналогично, сообщает, что у класса есть закрытые функции-члены, а открытых нет ни одной.
-Wnon-virtual-dtor
Предупреждает о том, что у класса есть виртуальные функции-члены, но деструктор при этом не виртуальный. Очень сложно представить себе такой класс. Вероятнее всего, это ошибка.
-Wold-style-cast
Предупреждает о приведении типов в стиле языка C. В плюсах есть прекрасные и ужасные static_cast , dynamic_cast , reinterpret_cast и const_cast , которые более локальны и более описательны. Сишный способ слишком сильный и — о, ужас, — небезопасный. Лучше его не использовать вообще.
-Woverloaded-virtual
Предупреждает о попытке в классе-наследнике перегрузить виртуальную функцию базового класса:
-Wsign-promo
Крайне полезный флаг. Предупреждает о неочевидном выборе перегруженной функции:
Вероятнее всего, хотели-таки позвать вторую перегрузку, а не первую. А если всё-таки первую, то будьте любезны сказать об этом явно.
-Wduplicated-branches
Предупреждает о том, что ветви if и else одинаковы:
Условный оператор ?: также под прицелом:
Для меня абсолютная загадка, почему этот флаг не включён не то, что в -Wall , а вообще по умолчанию.
-Wduplicated-cond
Предупреждает об одинаковых условиях в цепочках if-else-if :
-Wfloat-equal
Предупреждает о проверке на равенство между двумя числами с плавающей точкой. Скорее всего, это ошибка, и сравнение нужно проводить с заданной точностью.
Если же требуется именно сравнить на равенство (такое редко, но бывает), то можно использовать std::equal_to , который под предупреждение не попадает.
-Wshadow=compatible-local
Полезная опция, которая не даёт перекрыть локальную переменную другой локальной переменной при условии, что они имеют совместимые типы.
-Wcast-qual
Предупреждает о преобразовании указателя, при котором сбрасываются квалификаторы. Например, чтобы случайно не потерять const .
-Wconversion
Очень, очень, очень важный флаг. Он предупреждает об огромном количестве неявных сужающих (то есть потенциально приводящих к потере информации) преобразований, которые могут быть следствием ошибки программиста. Например:
Если вы раньше никогда не включали этот флаг, то будет интересно.
-Wzero-as-null-pointer-constant
Предупреждает об использовании целочисленного нуля вместо nullptr .
-Wextra-semi
Флаг для педантов. Сообщает о лишней точке с запятой после определения функции-члена.
-Wsign-conversion
Как и -Wconversion помогает предотвратить большое количество неявных преобразований, которые запросто могут быть ошибками:
-Wlogical-op
Предупреждает о подозрительных логических выражениях. Например, когда вместо побитового «И» поставили логическое «И», или логическое выражение имеет одинаковые операнды:
-Wextra
«Агрегатор» дополнительных предупреждений. Включает много интересного, чего нет в -Wall (как и в случае с -Wall , рассмотрены будут не все возможности).
-Wempty-body
Предупреждает о пустом теле условных выражений или цикла do-while . Чаще всего это говорит об опечатке, меняющей логику программы:
-Wimplicit-fallthrough
Предупреждает о «проваливании» в операторе switch :
Компилятор предполагает, что программист забыл break , и case 2 не должен проваливаться:
В C++17 для обозначения явного намерения появился специальный атрибут — fallthrough :
-Wmissing-field-initializers
Предупреждает о том, что отдельные члены структуры не были проинициализированы. Скорее всего это просто забыли сделать:
-Wredundant-move
Предупреждает о ненужном вызове std::move в случаях, когда компилятор сам сделает всё, что нужно:
-Wtype-limits
Предупреждает о сравнениях, которые всегда имеют один и тот же результат. Например, когда беззнаковое число проверяется на неотрицательность. Если программист делает такую проверку, то, видимо, предполагает, что число в теории может быть отрицательным, однако, это не так. Видимо, он где-то ошибся:
-Wshift-negative-value
Предупреждает об операциях сдвига для отрицательных значений. Отрицательными могут быть только знаковые числа, а для них это некорректно:
-Wunused-parameter
Предупреждает о неиспользуемом параметре функции. Возможно, про него просто забыли, и в этом случае функция может работать некорректно.
В C++17 для явного выражения намерения существует атрибут maybe_unused :
-Wunused-but-set-parameter
Предупреждает о том, что в параметр функции было записано значение, но после этого он ни разу не использовался. Возможно, про него снова забыли:
Ода компилятору
Компилятор – лучший друг плюсовика. Компилятор — это не просто транслятор формального человекочитаемого языка в машинные коды. Компилятор — лучший помощник в написании программ.
Важная (и не единственная) помощь, которую оказывает компилятор — поиск ошибок. И я говорю не об опечатках, несовпадении типов и прочих синтаксических ошибках. Я говорю об огромном наборе ошибок, которые можно выловить с помощью механизма предупреждений.
Часто встречаю мнение о том, что предупреждений слишком много, они дают ложноположительные результаты, мешают работать, замыливают глаз, отвлекают от «настоящих» ошибок и т.п. Такое действительно бывает, но это большая редкость.
Большинство предупреждений — это не «бзик» компилятора, который можно просто проигнорировать. Предупреждение — это потенциальная ошибка. Предупреждение — это сигнал от компилятора о том, что написано одно, а требуется, возможно, что-то совершенно иное.
Далее я расскажу о наиболее важных на мой взгляд предупреждениях и покажу, какие ошибки можно отловить с их помощью.
Надеюсь, что данное не слишком занимательное чтиво поможет правильно поставить запятую в заголовке этого раздела.
Сразу хочу оговориться, что далее речь пойдёт исключительно о языке C++ и компиляторе GCC (впрочем, подавляющая часть информации актуальна и для компилятора Clang). Информацию о других компиляторах и языках придётся искать в соответствующих справочниках.
-Wall — это «агрегатор» базовых предупреждений. В языке C++ он включает в себя длинный перечень предупреждений, каждое из которых будет рассмотрено отдельно (на самом деле, рассмотрены будут не все, а только те, которые непосредственно помогают выявлять ошибки).
Несмотря на название, этот флаг включает далеко не все предупреждения, которые умеет обнаруживать компилятор.
-Waddress
Предупреждает о странной работе с адресами. Например, об использовании адреса функции в условном выражении. Такое может произойти, если забыть поставить скобки после имени функции:
Также этот флаг может спасти от типичной ошибки новичка — сравнения строкового литерала с адресом. Очевидно, программист хотел сравнить строки, но в результате сравнил два указателя:
-Warray-bounds=1
Предупреждает о выходе за пределы массивов. Используется только вместе с -O2 .
-Wbool-compare
Предупреждает о сравнении булева выражения с целым числом, которое нельзя трактовать как булево:
-Wbool-operation
Предупреждает о подозрительных операциях с булевыми выражениями. Например, о побитовом отрицании:
Что касается инкрементов и декрементов булевых переменных, то в C++17 это просто ошибки, безо всяких предупреждений.
-Wcatch-value
Предупреждает о обработчиках исключений, которые принимают полиморфные объекты по значению:
Есть и более сильные версии предупреждения: -Wcatch-value=n (см. справку к компилятору).
-Wchar-subscripts
Предупреждает об обращении к массиву по индексу, тип которого char . А ведь char является знаковым на многих машинах:
-Wcomment
Предупреждает о наличии последовательности, начинающей новый комментарий ( /* ), внутри многострочного комментария, либо о разрыве строки при помощи обратного слеша внутри однострочного комментария.
-Wint-in-bool-context
Предупреждает о подозрительном использовании целых чисел там, где ожидаются булевы выражения, например, в условных выражениях:
Другой пример — операции побитового сдвига в булевом контексте. Вполне вероятно, что здесь произошла опечатка, и имелся в виду не сдвиг, а сравнение:
А также сообщает о любых видах умножения в булевом контексте.
-Winit-self
Предупреждает об инициализации переменных самими сабями. Используется только вместе с флагом -Wuninitialized .
-Wlogical-not-parentheses
Предупреждает об использовании логического отрицания в левой части сравнения. При этом если правая часть сравнения является сама по себе булевым выражением, то предупреждения не будет.
Используется для того, чтобы отлавливать подозрительные конструкции вроде следующей:
Традиционный способ сообщить компилятору, что так и было задумано — поставить скобки, о чём и сообщает компилятор.
-Wmaybe-uninitialized
Предупреждает о том, что существует возможность использования непроинициализированной переменной.
В данном конкретном случае решается с помощью конструкции default :
-Wmemset-elt-size
Предупреждает о подозрительных вызовах функции memset , когда первый аргумент — это массив, а третий аргумент — количество элементов в массиве, но не количество байт, занимаемой этим массивом в памяти.
-Wmemset-transposed-args
Предупреждает о том, что пользователь, вероятно, перепутал порядок аргументов в функции memset :
-Wmisleading-indentation
Предупреждает о том, что отступы в коде не отражают структуру этого кода. Особенно это актуально для конструкций if , else , while и for . Пример:
-Wmissing-attributes
Предупреждает о ситуации, когда специализация шаблона объявлена не с тем же списком атрибутов, что и оригинальный шаблон.
-Wmultistatement-macros
Предупреждает о макросах, состоящих из нескольких инструкций, и используемых в выражениях if , else , while и for . В такой ситуации под действие выражений попадает только первая инструкция макроса, и это, вероятно, ошибка:
-Wnonnull
Предупреждает о передаче нулевого указателя в функцию, аргументы которой помечены атрибутом nonnull .
-Wnonnull-compare
Предупреждает о сравнении с нулём аргумента функции, помеченного атрибутом nonnull .
-Wparentheses
Типичный случай — опечатались, и вместо равенства написали присвоение:
Компилятор, естественно, сомневается:
Либо исправляем код, либо убеждаем компилятор в том, что мы хотели именно присвоение:
-Wpessimizing-move
Иногда явная попытка переноса может ухудшить производительность. Пример:
-Wreorder
Предупреждает о том, что порядок инициализации членов класса не соответствует порядку их объявления. Поскольку компилятор может переупорядочить инициализацию этих членов, результат может быть неочевидным.
-Wreturn-type
Предупреждает о том, что из функции не вернули заявленный результат:
-Wsequence-point
Сообщает о подозрительных операциях относительно точек следования. Любимый пример (никогда так не делайте):
-Wsign-compare
Одно из важнейших предупреждений. Сообщает о сравнении знаковых и беззнаковых чисел, которое может произвести некорректный результат из-за неявных преобразований. К примеру, отрицательное знаковое число неявно приводится к беззнаковому и внезапно становится положительным:
-Wsizeof-pointer-div
Предупреждает о подозрительном делении друг на друга двух результатов выражения sizeof , когда размер указателя делится на размер объекта. Обычно это бывает, когда пытаются вычислить размер массива, но вместо массива по ошибке берут указатель:
-Wsizeof-pointer-memaccess
Предупреждает о подозрительных параметрах, передаваемых в строковые функции и функции для работы с памятью ( str. , mem. и т.п.), и использующих оператор sizeof . Например:
-Wstrict-aliasing
Каламбур типизации (strict aliasing) — это отдельная большая тема для разговора. Предлагаю читателю найти литературу по этой теме самостоятельно.
В общем, это тоже крайне полезное предупреждение.
-Wswitch
Предупреждает о том, что не все элементы перечисления задействованы в конструкции switch :
-Wtautological-compare
Предупреждает о бессмысленном сравнении переменной с самой собой:
Кроме того, сообщает о сравнениях при участии битовых операций, которые имеют всегда один и тот же результат (всегда истинно или всегда ложно):
-Wtrigraphs
Предупреждает о наличии триграфов, которые могут изменить смысл программы. Не сообщается о триграфах в теле комментария, за исключением случаев, когда триграф трактуется как перевод строки.
-Wuninitialized
Предупреждает об использовании переменных и членов класса, которые не были проинициализированы:
-Wunused-function
Предупреждает о том, что статическая функция объявлена, но не определена, либо о том, что статическая функция, не помеченная как inline , не используется.
-Wunused-variable
Предупреждает о том, что переменная не используется.
Для того, чтобы помочь компилятору понять, что так и задумывалось, можно использовать конструкцию static_cast<void>(. ) :
Заключение
Резюмируя, для компилятора GCC (Clang кое-что из этого не умеет, к сожалению) я рекомендую включать следующий минимальный набор флагов, по необходимости дополняя его более сложными диагностиками.
Да, такой список флагов может породить большое количество ошибок, которые поначалу могут показаться излишними. Но явное лучше неявного. Если знаешь, что делаешь — делай. Но делай это так, чтобы всем было понятно, что именно так ты и хотел. Поработав таким образом хотя бы неделю, вы поймёте, насколько это прекрасно, и уже не сможете вернуться обратно.
1)То что автор не я можно догадаться.(Понимаю здесь работают не гадалки, но всё же)
Скажи что тебе даст воспроизведение ошибки, и как ты это получишь.
и я сделаю всё сам, и дам тебе инфу нужную.
Всю черновую работу можете поручить мне, главное скажите что делать.
2)А почему кнопка паузы не работает не известно?
3)Автор какой-то немец( я только изменил его немного) и контактов свои не оставил.
AZJIO
Меценат
biko3
Пишет что переменные не декларированы, попробуй декларировать.
И попробуй использовать скрипт не скомпилированным. Тогда даст точную строку ошибки.
-Wpedantic
-Wall и -Wextra — это не всё, на что способен компилятор.
В дополнение к ним существует флаг -Wpedantic (он же -pedantic ), который проверяет соответствие кода стандарту ISO C++, сообщает об использовании запрещённых расширений, о наличии лишних точек с запятой, нехватке переноса строки в конце файла и прочих полезных штуках.
Содержание
-Werror
С этого, вообще говоря, стоило бы начать. Данный флаг делает все предупреждения ошибками. Код не скомпилируется при наличии хотя бы одного предупреждения.
Без этого флага всё остальное имеет мало смысла. Но если понять и принять мысль о том, что предупреждение — это что-то подозрительное, и их быть не должно, то именно этот флаг и позволит поддерживать код в чистоте.
В дополнение к -Werror существует флаг -pedantic-errors , который не эквивалентен комбинации -Wpedantic -Werror .
[FIXED] Error: Variable used without being declared.
6 posts • Page 1 of 1
Bailx Posts: 6 Joined: Mon Jul 10, 2006 1:22 am
[FIXED] Error: Variable used without being declared.
Post by Bailx » Mon Jul 10, 2006 1:33 am
Was hoping someone might be able to help me out with this. I am running into an error, and the very first one i’ve ever had with rvm integrator i might add, anyways. i must note that the only differences between this time and the last time is last time i used 2.0.7, this time it’s 2.0.7a, and all the update packs are the same, except i added these two:
otherwise it’s identical.
here is a screenshot
i was just about to try it another time, without the two new addons, but still with 2.0.7a. and I thought maybe i’d post and see if anyone had seen this before (couldn’t find anything searching)
Bailx Posts: 6 Joined: Mon Jul 10, 2006 1:22 am
Post by Bailx » Mon Jul 10, 2006 2:09 am
huh.. well this is odd.
i did that procedure twice (above) and it failed twice exactly the same way.
then i did the 2.0.7a update seperatly — worked fine
then i did Multi_Siginet_MultiTheme-AddonsPack_1.7.cab & Kels_Brushed_Inspirat_v1.cab
that worked, then i did the rest.
odd that they didn’t all work together, but worked seperatly.
also another thats odd. the first two times i just pressed ctrl + a to select all of the addons, but for some reason (and you can see in the log) Kels_Brushed_Inspirat_v1.cab doesn’t show up in the popup screen (when you choose your *.cab files) *.* in the box, and the file shows up.
The variable ‘znak’ is being used without being initialized.
Переменная ‘znak’ используется без инициализации.
Инициализация при объявлении выглядит так: char znak = 0; , а не как у вас char znak; — это объявление без инициализации.
Нельзя обращаться к переменной, пока в нее не присвоили какое либо значение.
Скорее всего это не ошибка, а предупреждение, т.к. обращаться к такой переменной можно, нельзя что-то предполагать о содержимом этой переменной и производить на основании этого какие-то дальнейшие действия.
Чаще всего такая ситуация — это ошибка программиста, как в данном случае. Но бывают и исключения.
Читайте также:
- Bulletstorm системные требования
- Как убрать иконку в лиге легенд
- Программа для замены моделей в гта 5
- Ошибка загрузки сохраненных данных dark souls 2
- Atlas copco ошибки компрессора
Local $x ; <<<<< You have to declare the Variable, I tend to use Local (if in a Function) & Global if the variable is used in many Functions. Do Run("Conexion.cmd") WinWaitActive("AOL 9.5 - Connected, Signed-On", "", 60) If WinExists("AOL 9.5 - Connected, Signed-On") Then $x = 1 Until $x = 1
Its best you look at the help file for Local, Global, Dim Variables. Also if you are using the SciTE by Jos, then add this #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 to the top of the script and hit Ctrl+F5, it will show you what is needed to tidy your code e.g. declaring variables.
Edit: I was writing this as Melba23 was posting…
Edited December 12, 2010 by guinness
In this case, the error can appear after changing the Application Panel settings.
Example:
- adding your own logo, changing the color etc.
- then reverting the settings and clic Reset Logo.
- after this whenever you try to connect with the Windows client (mstsc.exe) you get an error.
Line 15961 (File «C:Program Files (x86)TSPlusUserDesktopApplicationPanel.bin»):
Error: Variable used without being declared.
Solution :
- open the file ApplicationPanel.ini with a notepad, located in C:Program Files (x86)TSplusUserDesktop
- delete this line: «logoffbutton=no» (or yes).
Explanation:
After changing the Application Panel settings, the server adds/changes the line «logoffbutton=no» (or yes) in ApplicationPanel.ini.
-
#1
Привет! Вот простенький пример, при запуске которого получаю еррор:
Variable used without being declared.:
Case $hButton_2
Case ^ ERROR
#include <GuiConstants.au3>
Local $hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $hButton_1
SomeFunc()
Case $hButton_2
GUICtrlCreateButton("=", 130, 30, 90, 90, 0)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func SomeFunc()
Global $hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90, 0)
Endfunc
Получалось исправить ситуацию объявив «Global $hButton_2 = 3» в начале скрипта. Скорее всего ето не верный путь решения. Хотелось бы знать как должно быть правильно.
P.S. И объясните пожалуйста, какой плюс от использования переменных Local. Почему бы не объявлять переменную Global в начале скрипта, и пользоватся ею везде?
-
#2
#include <ButtonConstants.au3>
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
$hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
$hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90,$BS_NOTIFY)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $hButton_1
SomeFunc()
Case $hButton_2
GUICtrlCreateButton("=", 130, 30, 90, 90,Default)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func SomeFunc()
Global $hButton_2 = GUICtrlCreateButton("-", 245, 30, 90, 90,Default)
Endfunc
Ты пытаешься использовать вызов необъявленной кнопки, попробуй ее просто скрыть а потом при выборе отобразить…
-
#3
ну да, функция ещё не сработала, соответственно кнопка не создалась, а ты уже опрашиваешь.
-
#4
За кнопки спасибо. А с переменными мне как поступать? Объявлять все переменные, которые буду использовать где либо, в верху скрипта с типом Global ?
-
#5
Heler
Я думаю, что самое главное, чтобы значение переменной было доступно везде, где ты ее вызываешь…
Но это только с точки зрения «лишь бы работало»…
Если посмотреть с точки зрения логики скрипта, оптимальности скрипта, универсальности скрипта, то, прежде, чем объявить переменную, надо серьезно поразмышлять, где и как будет изменяться и считываться значение переменной…
-
#6
Я объявил 2 переменные Global $iA и Local $iB. И обе могу использовать не в функциональной области видимости(в функции). Почему так?
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
Global $iA = 11
Local $iB = 22
GUISetState(@SW_SHOW)
While 1
Local $msg = GUIGetMsg()
Switch $msg
Case $hButton_1
SomeFunc()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func SomeFunc()
MsgBox(4096,"",$iA)
MsgBox(4096,"",$iB)
Endfunc
-
#7
Heler
Если переложить переменные внутрь функции, ситуация изменится…
Переменная, объявленная как Global будет видна вне функции, а переменная, объявленная как Local будет видна только внутри функции…
-
#8
Все верно, работает так как Вы и сказали. Но если я буду объявлять в функции переменную Global и использовать в теле скрипта (в цикле, после запуска етой самой функции) получу варнинг:
WARNING: $iA: possibly used before declaration.
#include <GuiConstants.au3>
$hGui = GUICreate("----", 343, 150, 307, 195)
Local $hButton_1 = GUICtrlCreateButton("+", 15, 30, 90, 90, 0)
GUISetState(@SW_SHOW)
While 1
Local $msg = GUIGetMsg()
Switch $msg
Case $hButton_1
SomeFunc()
MsgBox(4096,"",$iA)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func SomeFunc()
Global $iA = 11
Endfunc
Тогда как мне поступить в ситуации где мне нужно работать с переменной везде? И опрашивать ее в цикле.
-
#9
Heler
У меня твой скрипт отрабатывает без ошибки…
MsgBox выводит 11…
Может проблема версий AUTOIT?
-
#10
>Running AU3Check (1.54.14.0) from:C:Program Files (x86)AutoIt3
C:UsersHelerDesktop789.au3(11,35) : WARNING: $iA: possibly used before declaration.
MsgBox(4096,"",$iA)
У Вас какая версия утилиты AU3Check? Моя — 1.54.14.0 .
-
#11
Heler
AutoIt3 Syntax Checker v1.54.8 Copyright (c) Tylo 2007
Добавлено:
Сообщение автоматически объединено: 6 Янв 2010
Однако это всего лишь предупреждение (WARNING)…
Это не ошибка…
Добавлено:
Сообщение автоматически объединено: 6 Янв 2010
Наверное, чекеру было сложно найти спрятанную внутрь функции переменную…
Или я чего-то не понимаю…
-
#12
snoitaleR [?]
чекеру было сложно найти спрятанную внутрь функции переменную…
Или я чего-то не понимаю…
Видимо не понимаешь что чекер не просто так выводит предупреждение, этому есть причина. Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).
-
#13
CreatoR [?]
Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).
Вот и я о чем говорил, где-то тут в форуме, где ты меня поправил, что можно объявлять, когда я писал, что можно НО! нежелательно, что глобально можно объявить внутри функции но лучше это сделать сразу перед основным исполнительным кодом скрипта…
-
#14
Кнопки:
Если нам нужно при выполнении функции ставить кнопку, то мы ее создаем вверху скрипта и выключаем. Потом в нужном месте просто включим.
Переменные:
Вверху скрипта пишем Opt(«MustDeclareVars», 1).
а) Если переменная будет использоватся только локальной/функциональной области видимости, то задаем ей тип Local.
б) Если нам нужно использовать переменную в теле скрипта и в функции то объявляем ее вверху с типом Global.
Я все правильно понял?