为什么删除已声明但未使用的变量会导致程序提前终止?

Why does removing a declared but not used variable causes program to terminate early?

这个我想不通。当我从以下过程中删除 let size = s.readInt64() 时,.exe 似乎在到达末尾之前终止。它已声明但未使用!该走了!

proc load(fn: string): Alternating =
  var s = newFileStream(fn, fmRead)
  let size = s.readInt64() #WITHOUT THIS LINE THE .exe doesn't execute ExitTerminal()
  result = newSeq[(float, int)]()
  while not s.atEnd:
    let element = (s.readFloat64.float, s.readInt64.int)
    result.add(element)
  s.close()

下面是整个程序。文件类型是 .dat,我想它是二进制的。它是在程序中创建的。我使用 -d:release Nim 版本 0.18.0 和 minGW 编译器

编译
import streams

type
  Alternating = seq[(float, int)]

proc store(fn: string, data: Alternating) =
  var s = newFileStream(fn, fmWrite)
  s.write(data.len)
  for x in data:
    s.write(x[0])
    s.write(x[1])
  s.close()

proc load(fn: string): Alternating =
  var s = newFileStream(fn, fmRead)
  let size = s.readInt64() #WITHOUT THIS LINE THE .exe doesn't execute ExitTerminal()
  result = newSeq[(float, int)]()
  while not s.atEnd:
    let element = (s.readFloat64.float, s.readInt64.int)
    result.add(element)
  s.close()


let data = @[(1.0, 1), (2.0, 2)]

store("tmp.dat", data)
let dataLoaded = load("tmp.dat")

echo dataLoaded


### EXIT PROCEDURE FROM TERMINAL PROGRAM

proc ExitTerminal: bool =
  echo "Exit Application"
  echo "(y/n)"
  while true:
    case readline(stdin)
    of "y", "Y", "yes", "Yes": return true
    of "n", "N", "no", "No": return false
    else: echo "Please be clear: yes or no"


if ExitTerminal() == false: discard ExitTerminal()

很难判断,因为我们对您正在阅读的文件格式一无所知。但通常你不能删除 s.readInt64() 只是因为它未被使用,因为除了读取这个过程之外,你的流游标也会前进。如果您需要忽略该值,只需使用 discard s.readInt64() # Ignore size