UndefVarError, но переменная четко определена - PullRequest
0 голосов
/ 08 ноября 2018

Предположим, у меня есть следующий код, который имеет два вложенных цикла while.

 struct Parameters

      maxIter1::Float64
      maxIter2::Float64

      tolerance1::Float64
      tolerance2::Float64

 end

 mutable struct Guess

      x1::Float64
      x2::Float64

 end

 function solveModel(par::Parameters,initGuess::Guess)

      iterate1 = 0
      error1 = 0

      guess = initGuess

      while (par.iterate1 < par.maxIter1 && error1 > par.tolerance1)

           iterate1 += 1

           iterate2 = 0
           error2 = 0

           guess.x2 = initGuess.x2

           while (iterate2 < par.maxIter2 && error2 > par.tolerance2)

                iterate2 += 1

                z2 = solveInnerProblem(par,guess)

                newGuess = update2(par,guess,z2)

                error2 = computeError2(newGuess,guess)

                guess = newGuess

           end

           guess = newGuess

      end 
 end

Я получаю сообщение об ошибке,

enter image description here

Примечание: ссылка на номер строки ошибочна - строка 294 моего кода не содержит никаких упоминаний о newGuess.

Сообщение об ошибке исчезнет, ​​если я закомментирую строку

 guess = newGuess    

Во внешнем цикле (последняя строка перед последними двумя end строками во фрагменте кода). Я совершенно не понимаю, почему это происходит. Переменная newGuess четко определена, но Юлия говорит, что она не определена ...

1 Ответ

0 голосов
/ 08 ноября 2018

newGuess является локальной переменной, что означает, что она определена в локализованной части программы, а не во всей программе. В случае локальной переменной, определенной в цикле, подобном оператору while, переменная не определена вне цикла while , в котором она определена, что является внутренним циклом while вашей функции. Таким образом, ошибка «не определено» связана с тем, что программа пытается получить доступ к переменной за пределами своей локальной области: она была определена ранее, но не при возникновении ошибки.

Возможно, вам потребуется определить newGuess выше, внутри функции, но перед внутренним оператором while.

...