我目前正在尝试不断检查无限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 语句?
下面是使用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
,通过调用global outvar
访问范围while
之外的outvar
变量,以便循环工作并且它确实更新outvar
。但是我们的invar
变量仍然设置为 5,因为while
循环内部的变量invar
没有连接到while
循环的外部 - 它生活在自己的小宇宙中。
解决此问题的一种简单方法是创建一个函数:
function add_nums(outvar)
invar = outvar
while true
invar = outvar
outvar += 1
if outvar > 10
break
end
end
return invar
end
这需要outvar
,定义while
循环之外的invar
,以便您可以根据需要在此处添加其他逻辑,并执行循环并返回新invar
。
一旦你有了这个函数,你就可以很容易地实现原来的while循环的目标:
julia> outvar = 5
5
julia> invar = add_nums(outvar)
10
更好的是,您的outvar
变量受以下函数调用的影响:
julia> outvar
5
我希望上面的例子能帮助你实现你想要的。您只需要创建一个实现文件加载逻辑的函数。