Я использую Julia, и я разработал цикл for, который принимает выходные данные функции в одном цикле и использует их в качестве входных данных этой функции в следующем цикле (и снова и снова). Когда я запускаю этот код, Джулия отмечает «неопределенную» ошибку, однако, если я запускаю код в режиме отладки, он выполняется отлично. Например, код выглядит так:
function do_command(a,b,c,d)
a = a + 1
b = split(b, keepempty=false)[1]
c = split(b, keepempty=false)[1]
if a == 1000
d = true
else
d = false
end
return a, b, c, d
end
for ii in 1:length(x)
if ii == 1
a = 0
b = "string something"
c = ""
d = false
end
a,b,c,d = do_command(a,b,c,d)
if d == true
print(string(b))
break
end
end
Что я здесь делаю неправильно?
Проблема с вашим кодом заключается в том, что for
вводит новую область действия для каждой итерации цикла. То есть: переменная a
, созданная в теле цикла на итерации 1, не совпадает с переменной a
, созданной в теле цикла на итерации 2.
Чтобы решить вашу проблему, вы должны объявить переменные вне цикла, чтобы на каждой итерации ссылки на них из тела цикла фактически ссылались на одни и те же переменные из объемлющей области.
Я бы пошел с чем-то вроде этого:
function do_command(a,b,c,d)
a = a + 1
b = split(b, keepempty=false)[1]
c = split(b, keepempty=false)[1]
if a == 1000
d = true
else
d = false
end
return a, b, c, d
end
# Let's create a local scope: it's good practice to avoid global variables
let
# All these variables are declared in the scope introduced by `let`
a = 0
b = "string something"
c = ""
d = false
for ii in 1:10 #length(x)
# now these names refer to the variables declared in the enclosing scope
a,b,c,d = do_command(a,b,c,d)
if d == true
print(string(b))
break
end
end
end
x
отсутствует в вашем примере, но я думаю, что это просто проблема с копированием, а не ваша настоящая проблема...