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



我目前正在尝试不断检查无限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 循环之外定义了outvarinvar,通过调用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

我希望上面的例子能帮助你实现你想要的。您只需要创建一个实现文件加载逻辑的函数。

最新更新