问题陈述
我正在从未知来源导入一组坐标,我无权查看。
set yMin [lindex [lindex $bbox 0] 1]
puts "yMin: <$yMin>"
它工作正常。
yMin:<-6.149999999999999e-02>
括号用于检查是否有任何空格甚至隐藏的选项卡。但是,如果yMin乘以任何数字,例如 0.5,就会出错。
set Y2 [expr {0.5 * $yMin}]
在执行
从“set Y2 [expr {0.5 * $yMin}]”中调用的“expr {0.5 * $yMin}”时,不能使用空字符串作为“*”的操作数
即使只打印了yMin,它仍然有空操作数错误。
set Y1 [expr $yMin]
puts "Y1: <$Y1>"
表达式“”中的空表达式(解析表达式“”)
从“expr $yMin”
中调用 从“set Y1 [expr $yMin]”中调用
但是有一个有趣的测试。如果添加花括号,它会起作用!
set Y1 [expr {$yMin}]
puts "Y1: <$Y1>"
Y1:<-0.06149999999999999>
如何重现问题
感谢 Glenn Jackman(请参阅下面的回复),
% set bbox {{-4.599999999999999e-02 -6.149999999999999e-02} {8.000000000000002e-02 6.149999999999999e-02}}
{-4.599999999999999e-02 -6.149999999999999e-02} {8.000000000000002e-02 6.149999999999999e-02}
% set yMin [lindex [lindex $bbox 0] 1]
-6.149999999999999e-02
% expr {1 + $yMin}
0.9385
实际上,这似乎无法重现问题(这就是我有这篇文章的原因)。但它至少可以是一个模板。
试错
以下代码用于检查它是否真的为空。原来不是空的。
if {$yMin eq {}} {
puts "Empty records"
exit 1
} else {
puts "yMin is not empty: <$yMin>
}
yMin 不为空:<-6.149999999999999e-02>
最后,我尝试了trim、map和regsub来删除任何空格和制表符,但它们都不起作用。
set trim_yMin [string trim $yMin]
puts "trim_yMin: <$trim_yMin>"
set map_yMin [string map {" " ""} $yMin]
puts "map_yMin: <$map_yMin>"
regsub -all {\s} $yMin {} reg_yMin
puts "reg_yMin: <$reg_yMin>"
if {$trim_yMin eq {} || $map_yMin eq {} || $reg_yMin eq {}} {
puts "Empty records"
exit 1
} else {
puts "trim_yMin is not empty: <$reg_yMin>"
puts "map_yMin is not empty: <$reg_yMin>"
puts "reg_yMin is not empty: <$reg_yMin>"
}
trim_yMin: <-6.149999999999999e-02>
map_yMin: <-6.149999999999999e-02>
reg_yMin: <-6.149999999999999e-02>
trim_yMin is not empty: <-6.149999999999999e-02>
map_yMin is not empty: <-6.149999999999999e-02 >
reg_yMin 不为空:<-6.149999999999999e-02>
这里我只显示regsub的结果。其他人的结果是一样的。
set reg_Y2 [expr {0.5 * $reg_yMin}]
puts "0.5 * reg_yMin: $reg_Y2"
在执行从“set reg_Y2 [expr {0.5 * $reg_yMin}]”中调用的
“expr {0.5 * $reg_yMin}”时,不能使用空字符串作为“*”的操作数
请你帮助我好吗?我真的不知道我还能尝试什么。提前致谢。
更新和回复
至埃尔贡:
puts $bbox;
set yMin [lindex [lindex $bbox 0] 1]
puts "yMin: <$yMin>"
{-4.599999999999999e-02 -6.14999999999999e-02} {8.000000000000002e-02 6.149999999999999e-02}
yMin: <-6.149999999999999e-02>
set Y2 [expr {0.5 * $yMin}]
puts $Y2
在执行
从“set Y2 [expr {0.5 * $yMin}]”中调用的“expr {0.5 * $yMin}”时,不能使用空字符串作为“*”的操作数
给贝纳哈:
puts [tcl::unsupported::representation $yMin]
value 是一个引用计数为 4 的字符串,对象指针位于 0x44ed0910,内部表示 0x450d6120:(nil),字符串表示“-6.14999999999 ....”
给肖恩,
puts [tcl::unsupported::representation $yMin]
puts [binary encode hex $yMin]
puts [tcl::unsupported::representation $yMin]
puts [string is double -strict $yMin]
puts [tcl::unsupported::representation $yMin]
value 是一个引用计数为 4 的字符串,对象指针位于 0x44ed6030,内部表示为 0x450de4b0:(nil),字符串表示“-6.1499999999 ...”
2d362e313439393939393939393939393939652d3032
value 是一个字节数组,引用计数为 3,内部表示为 3,对象指针位于 04460 0x44ee0dc0:(nil),字符串表示“-6.1499999999...”
1
值是引用计数为 4 的 double,对象指针位于 0x44ed6030,内部表示 0xbfaf7ced916872af:(nil),字符串表示“-6.1499999999...”
set Y2 [expr {0.5 * -6.149999999999999e-02}]
puts "Y2: $Y2"
set new_Y2 [expr {0.5*-6.149999999999999e-02}]
puts "new_Y2: $new_Y2"
Y2:-0.030749999999999996
新_Y2:-0.030749999999999996
对谢尔特布朗来说,
错误信息已更改!也许它表明了什么?
puts [tcl::unsupported::representation $yMin]
set yMin " $yMin"
puts [tcl::unsupported::representation $yMin]
set Y2 [expr {0.5 * $yMin}]
puts $Y2
value 是一个引用计数为 4 的字符串,对象指针位于 0x44ec28a0,内部表示 0x450be540:(nil),字符串表示“-6.1499999999...”
value 是一个引用计数为 2 的字符串,对象指针位于 0x446bbc70,内部表示 0x44695fd0 :(nil),字符串表示“-6.149999999...”
不能使用非数字字符串作为“*”的操作数,
同时执行
从
“set Y2 [expr {0.5 * $yMin}]"
如果在 string 为 double -strict $yMin 后值变为 double 后计算仍然失败,则取二进制编码十六进制 $yMin 的结果,将其转换回字符串(使用二进制解码十六进制)并在计算。
puts "Is yMin double? : [string is double -strict $yMin]"
set binary_yMin [binary encode hex $yMin]
set double_binary_yMin [binary decode hex $binary_yMin]
puts "yMin: $yMin"
puts "Binary of double yMin: $binary_yMin"
puts "Double binary double: $double_binary_yMin"
set Y2 [expr {0.5 * $double_binary_yMin}]
puts $Y2
yMin 是双倍的吗?:1
yMin:-6.149999999999999e-02
double yMin 的二进制:2d362e313439393939393939393939393939652d3032
双二进制双精度:-6.149999999999999e-02
不能使用空字符串作为“*”
在执行“expr {} 0 * $double_”
中的操作数 {} “设置 Y2 [expr {0.5 * $double_binary_yMin}]”
你用 tcl::mathop::* 0.5 $yMin 得到什么?
puts [tcl::mathop::* 0.5 $yMin]
在执行从“puts [tcl::mathop::* 0.5 $yMin]”中调用的
“tcl::mathop::* 0.5 $yMin”时,不能使用空字符串作为“*”的操作数