Оператор печати Julia не работает в некоторых случаях - PullRequest
1 голос
/ 02 августа 2020

Я написал функцию генерации простых чисел generatePrimes (полный код здесь ), которая принимает входные данные bound::Int64 и возвращает Vector{Int64} всех простых чисел до bound. После определения функции у меня есть следующий код:

println("Generating primes...")
println("Last prime: ", generatePrimes(10^7)[end]) 
println("Primes generated.")

, который неожиданно печатает

Generating primes...
9999991
Primes generated.

Этот вывод пропускает сегмент "Last prime: " второго оператора печати. Выход работает, как ожидалось, для небольших входов; любой ввод по крайней мере до 10 ^ 6, но почему-то не работает для 10 ^ 7. Я пробовал несколько обходных путей для этого (например, присвоение возвращаемого значения или преобразование его в строку перед его вызовом в операторе печати, объединение операторов печати и т.д.) и обнаружил еще одно странное поведение: если "Last prime", удаляется из второго оператора печати для ввода 10^7 последнее простое число вообще не печатается, и все, что я получаю, это пустая строка между первым и третьим операторами печати. Эти проблемы, вероятно, связаны, и я не могу найти в Интернете ничего о том, почему некоторые операторы печати не работают в Julia.

Большое спасибо за любые разъяснения!

Изменить : Согласно предложению DNF, ниже приведены некоторые сокращения этой проблемы:

  1. Удаление первого и последнего операторов печати ничего не меняет - пустая строка всегда печатается в случае I описаны и каждый из приведенных ниже случаев.
println(generatePrimes(10^7)[end]) # output: empty line
Вызов функции и сохранение последнего индекса в переменной перед вызовом println тоже ничего не меняет; приведенные ниже случаи работают точно так же в любом случае.
lastPrime::Int = generatePrimes(10^7)[end]
println(lastPrime) # output: empty line
Если я вызываю функцию в любой форме непосредственно перед println, будет напечатана пустая строка независимо от того, что находится внутри println.
lastPrime::Int = generatePrimes(10^7)[end]
println("This doesn't print") # output: empty line
println("This does print") # output: This does print
Если я вызываю функцию (или распечатываю предварительно сгенерированный и сохраненный результат функции) внутри println, все, что до вызова функции (которое также находится внутри println), не печатается. 9999991 и все остальное может быть после вызова функции, только если есть что-то еще внутри println перед вызовом функции.
# Example 1
println(generatePrimes(10^7)[end]) # output: empty line
# Example 2
println("This first part doesn't print", generatePrimes(10^7)[end]) # output: 9999991
# Example 3
println("This first part doesn't print", generatePrimes(10^7)[end], " prints") # output: 9999991 prints
# Example 4
println(generatePrimes(10^7)[end], "prime doesn't print") # output: prime doesn't print

Я, вероятно, мог бы перечислить двадцать разных вариации того же самого, но это, вероятно, не проясняет ситуацию. В каждой отдельной версии этой проблемы, которую я видел до сих пор, проблема проявляется только в том случае, если где-то есть вызов этой функции; println отлично печатает большие целые числа. Тем не менее, пожалуйста, дайте мне знать, если кому-то понадобится дополнительная информация. Большое спасибо!

1 Ответ

2 голосов
/ 02 августа 2020

Скорее всего, вы запускаете этот код из Atom Juno, у которого недавно возникли некоторые проблемы с буферизацией стандартного вывода (уже сообщалось другими, и у меня также иногда возникает эта проблема). Одна вещь, которую вы можете попробовать сделать, - это пропустить sh ваш стандартный вывод

flush(stdout)

Как и в случае любой нестабильной ошибки, перезапуск Atom Juno тоже может помочь.

...