朱莉娅-在while循环中损坏的If语句?

时间:2019-04-11 22:01:52

标签: debugging if-statement while-loop julia

我目前正在尝试不断检查无限while循环内的状况。我通过一些条件打破了循环。但是,while循环立即中断,调试println()显示代码在第一个if()语句内。胡佛,上一行从未运行过,并且if语句需要该信息(polar)进行计算。我仅在稍后尝试在程序中调用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的预期错误。所以我的问题是,代码如何跳过定义polar的行,然后评估一条if语句,以获取其不提供的信息?

1 个答案:

答案 0 :(得分:0)

这是使用while循环时作用域规则如何工作的简单示例。

第一个示例,在main内部使用while

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

因此,我在while循环之外定义了outvarinvar,并通过调用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,以便您可以在此处添加其他逻辑,然后执行循环并返回新的{{1 }}。

一旦有了此功能,就可以轻松实现原始while循环的目标:

invar

更好的是,您的julia> outvar = 5 5 julia> invar = add_nums(outvar) 10 变量会受到以下函数调用的影响:

outvar

我希望以上示例可以帮助您实现所需的目标。您只需要创建一个实现文件加载逻辑的函数即可。