Джулия - Сломанный оператор If в цикле while? - PullRequest
0 голосов
/ 12 апреля 2019

В настоящее время я пытаюсь постоянно проверять состояние внутри бесконечного цикла while.Я вырываюсь из цикла с несколькими условностями.Однако цикл while сразу прерывается, и отладка println() показывает, что код находится внутри первого оператора if().Hoover, предыдущая строка никогда не выполнялась, и для оператора if требуется эта информация (polar) для вычисления.Я получаю сообщение об ошибке только при попытке позже вызвать полярный режим в программе, и он не существует.Это как если бы эта строка была полностью пропущена.

Вот рассматриваемый цикл while:

prevSize = 0
sec = 0
n = 5
while true # wait unit the polar file is done changing
    polar = readdlm(polarPath,Float64,skipstart = 12)
    if polar[end,1] > aEnd - aStep
        println("Done writing polar file")
        break #File is fully loaded
    else #check every n seconds for stable file size
        sleep(1)
        global sec += 1
        if prevSize == filesize(polarPath) && sec == n
            println("Polar file could not converge for all AoA")
            break # after n seconds if filesize is constant then use current polar
        elseif sec >= n
            global sec = 0 # reset sec every n seconds
        end
        global prevSize = filesize(polarPath)
    end
end

Программа выводит «Закончена запись полярного файла», что означает, что она использовалапервый break.Однако polar никогда не инициализировался как переменная, и отдельный вызов polar[end,1] > aEnd - aStep дает ожидаемую ошибку ни одной переменной, называемой полярной.Поэтому мой вопрос заключается в том, как код мог пропустить строку, определяющую polar, а затем оценить оператор if, для которого у него нет информации?

1 Ответ

0 голосов
/ 15 апреля 2019

Вот простой пример того, как работают правила области видимости при использовании цикла while.

Первый пример использования while внутри main:

julia> outvar = 5
5

julia> invar = 5
5

julia> while true
           global outvar
           invar = outvar
           outvar += 1
           if outvar > 10
               break
           end
       end

julia> outvar
11

julia> invar
5

Итак, я определил обаoutvar и invar вне цикла while, получили доступ к переменной outvar вне области действия while, вызвав global outvar, чтобы цикл работал и обновлял outvar.Но наша переменная invar по-прежнему имеет значение 5, поскольку переменная invar внутри цикла while не связана с внешней частью цикла while - она ​​живет в своей крошечной вселенной.

Простой способ исправить это - создать функцию:

function add_nums(outvar)
    invar = outvar
    while true
        invar = outvar 
        outvar += 1
        if outvar > 10
            break
        end
    end
    return invar
end

Это займет outvar, определяет invar вне цикла while, так что вы можете добавить дополнительную логику здесь, если хотитеи выполняет цикл и возвращает ваш новый invar.

Когда у вас есть эта функция, вы можете легко достичь цели оригинального цикла while:

julia> outvar = 5
5

julia> invar = add_nums(outvar)
10

Еще лучше, ваш *Переменная 1032 * зависит от этих вызовов функций:

julia> outvar
5

Я надеюсь, что приведенный выше пример поможет вам достичь того, что вы хотите.Вам просто нужно создать функцию, которая реализует логику загрузки вашего файла.

...