为什么删除已声明但未使用的变量会导致程序提前终止?
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
这个我想不通。当我从以下过程中删除 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