我目前正在尝试不断检查无限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语句,以获取其不提供的信息?
答案 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循环之外定义了outvar
和invar
,并通过调用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
我希望以上示例可以帮助您实现所需的目标。您只需要创建一个实现文件加载逻辑的函数即可。