Ошибка variable used without being declared

;#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 кое-что из этого не умеет, к сожалению) я рекомендую включать следующий минимальный набор флагов, по необходимости дополняя его более сложными диагностиками.

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

6f28bade671cc3c971d5eec1878e8c41.jpg

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.

NeiroNx

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 кое-что из этого не умеет, к сожалению) я рекомендую включать следующий минимальный набор флагов, по необходимости дополняя его более сложными диагностиками.

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

6f28bade671cc3c971d5eec1878e8c41.jpg

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.

NeiroNx

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» в начале скрипта. Скорее всего ето не верный путь решения. Хотелось бы знать как должно быть правильно. :smile:
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
Я думаю, что самое главное, чтобы значение переменной было доступно везде, где ты ее вызываешь…
Но это только с точки зрения «лишь бы работало»…
Если посмотреть с точки зрения логики скрипта, оптимальности скрипта, универсальности скрипта, то, прежде, чем объявить переменную, надо серьезно поразмышлять, где и как будет изменяться и считываться значение переменной… :smile:

  • #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


Наверное, чекеру было сложно найти спрятанную внутрь функции переменную… :smile:
Или я чего-то не понимаю…

CreatoR


  • #12

snoitaleR [?]

чекеру было сложно найти спрятанную внутрь функции переменную…

smiley.gif

Или я чего-то не понимаю…

Видимо не понимаешь что чекер не просто так выводит предупреждение, этому есть причина. Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).

  • #13

CreatoR [?]

Глобальные переменные следует объявлять глобально, точка (возьмите это как правило).

Вот и я о чем говорил, где-то тут в форуме, где ты меня поправил, что можно объявлять, когда я писал, что можно НО! нежелательно, что глобально можно объявить внутри функции но лучше это сделать сразу перед основным исполнительным кодом скрипта…

  • #14

Кнопки:
Если нам нужно при выполнении функции ставить кнопку, то мы ее создаем вверху скрипта и выключаем. Потом в нужном месте просто включим.

Переменные:
Вверху скрипта пишем Opt(«MustDeclareVars», 1).
а) Если переменная будет использоватся только локальной/функциональной области видимости, то задаем ей тип Local.
б) Если нам нужно использовать переменную в теле скрипта и в функции то объявляем ее вверху с типом Global.

Я все правильно понял?

  • Ошибка variable sized object may not be initialized
  • Ошибка utorrent устройство не готово
  • Ошибка variable not defined vba
  • Ошибка utorrent система не может найти указанный путь writetodisk
  • Ошибка variable must be of type object