TCL/TK 如何优化具有多个输入的程序
TCL/TK How to optimize a procedure with many inputs
我正在尝试优化一个程序,该程序应该输入大约 200 个不同的值;由于这些原因,我想让它尽可能标准化。 proc 应将值(24 列,按固定长度分开)保存在输出 txt 文件中,如下所示:
NAME Pipe1 Pipe2 ... Pipe24
INITIAL_NUMBER 100000 106500 ... 208000
Prop1 301 303 ... 325
Prop2 302 304 ... 326
到目前为止,我的程序在输入 all 中声明了不同的变量。这是前两列的示例。
CreateText $MTCollector1 $MTCollector2 $MTNumGas1 $MTNumGas2 $MTPconvGas1 $MTPconvGas2 $MTMatGas1 $MTMatGas2 }
proc CreateText { MTCollector1 MTCollector2 MTNumGas1 MTNumGas2 MTPconvGas1 MTPconvGas2 MTMatGas1 MTMatGas2} {
set OutputTable [open "Output.txt" w]
puts $OutputTable "[ format "%-16s" NAME] [ format "%-16s" $MTCollector1][ format "%-16s" $MTCollector2]"
puts $OutputTable "[ format "%-16s" INITIAL_NUMBER] [ format "%-16s" $MTNumGas1][ format "%-16s" $MTNumGas2]"
puts $OutputTable "[ format "%-16s" Prop1] [ format "%-16s" $MTPconvGas1][ format "%-16s" $MTPconvGas2]"
puts $OutputTable "[ format "%-16s" Prop2] [ format "%-16s" $MTMatGas1][ format "%-16s" $MTMatGas2]"
}
有没有办法在不声明所有变量的情况下提高效率?
您可以使用变量名来做到这一点。
显然,您的变量名是由变量前缀和列号串联而成。
这个例子是测试过的,这里限制为2列,但没有限制。
# Assuming that vars $MTCollector1, $MTCollector2, etc are set
set MTCollector1 Pipe1
set MTCollector2 Pipe2
set MTNumGas1 100000
set MTNumGas2 106500
set MTPconvGas1 301
set MTPconvGas2 303
set MTMatGas1 302
set MTMatGas2 304
set listVars [list MTCollector MTNumGas MTPconvGas MTMatGas]
set listNames [list NAME INITIAL_NUMBER Prop1 Prop2]
set colNumber 2
proc CreateText { listVars listNames colNumber } {
set OutputTable [open "Output.txt" w]
set nbvars [llength $listVars]
for { set i 0 } { $i < $nbvars } { incr i } {
puts -nonewline $OutputTable [ format "%-16s" [lindex $listNames $i]]
for { set j 1 } { $j <= $colNumber } { incr j } {
set varprefix [lindex $listVars $i]
set varname [set varprefix][set j]
upvar 1 $varname var
puts -nonewline $OutputTable [format "%-16s" $var]
}
puts $OutputTable ""
}
close $OutputTable
}
我相信其他 tclers 可以构建更惯用的东西,但它似乎可以作为您的示例。
正如 Johannes 评论的那样,将数据存储在字典中会产生非常干净的代码:
proc main {} {
set data [dict create]
# however you generate your data, add it to the dictionary
dict lappend data NAME Pipe1 Pipe2 ... Pipe24
dict lappend data INITIAL_NUMBER 100000 106500 ... 208000
dict lappend data Prop1 301 303 ... 325
dict lappend data Prop2 302 304 ... 326
CreateText $data
}
proc CreateText {data} {
set fid stdout ;# test with stdout instead of a file
dict for {key values} $data {
puts -nonewline $fid [format "%-32s" $key]
foreach value $values {
puts -nonewline $fid [format "%-16s" $value]
}
puts $fid ""
}
close $fid
}
main
我正在尝试优化一个程序,该程序应该输入大约 200 个不同的值;由于这些原因,我想让它尽可能标准化。 proc 应将值(24 列,按固定长度分开)保存在输出 txt 文件中,如下所示:
NAME Pipe1 Pipe2 ... Pipe24
INITIAL_NUMBER 100000 106500 ... 208000
Prop1 301 303 ... 325
Prop2 302 304 ... 326
到目前为止,我的程序在输入 all 中声明了不同的变量。这是前两列的示例。
CreateText $MTCollector1 $MTCollector2 $MTNumGas1 $MTNumGas2 $MTPconvGas1 $MTPconvGas2 $MTMatGas1 $MTMatGas2 }
proc CreateText { MTCollector1 MTCollector2 MTNumGas1 MTNumGas2 MTPconvGas1 MTPconvGas2 MTMatGas1 MTMatGas2} {
set OutputTable [open "Output.txt" w]
puts $OutputTable "[ format "%-16s" NAME] [ format "%-16s" $MTCollector1][ format "%-16s" $MTCollector2]"
puts $OutputTable "[ format "%-16s" INITIAL_NUMBER] [ format "%-16s" $MTNumGas1][ format "%-16s" $MTNumGas2]"
puts $OutputTable "[ format "%-16s" Prop1] [ format "%-16s" $MTPconvGas1][ format "%-16s" $MTPconvGas2]"
puts $OutputTable "[ format "%-16s" Prop2] [ format "%-16s" $MTMatGas1][ format "%-16s" $MTMatGas2]"
}
有没有办法在不声明所有变量的情况下提高效率?
您可以使用变量名来做到这一点。 显然,您的变量名是由变量前缀和列号串联而成。
这个例子是测试过的,这里限制为2列,但没有限制。
# Assuming that vars $MTCollector1, $MTCollector2, etc are set
set MTCollector1 Pipe1
set MTCollector2 Pipe2
set MTNumGas1 100000
set MTNumGas2 106500
set MTPconvGas1 301
set MTPconvGas2 303
set MTMatGas1 302
set MTMatGas2 304
set listVars [list MTCollector MTNumGas MTPconvGas MTMatGas]
set listNames [list NAME INITIAL_NUMBER Prop1 Prop2]
set colNumber 2
proc CreateText { listVars listNames colNumber } {
set OutputTable [open "Output.txt" w]
set nbvars [llength $listVars]
for { set i 0 } { $i < $nbvars } { incr i } {
puts -nonewline $OutputTable [ format "%-16s" [lindex $listNames $i]]
for { set j 1 } { $j <= $colNumber } { incr j } {
set varprefix [lindex $listVars $i]
set varname [set varprefix][set j]
upvar 1 $varname var
puts -nonewline $OutputTable [format "%-16s" $var]
}
puts $OutputTable ""
}
close $OutputTable
}
我相信其他 tclers 可以构建更惯用的东西,但它似乎可以作为您的示例。
正如 Johannes 评论的那样,将数据存储在字典中会产生非常干净的代码:
proc main {} {
set data [dict create]
# however you generate your data, add it to the dictionary
dict lappend data NAME Pipe1 Pipe2 ... Pipe24
dict lappend data INITIAL_NUMBER 100000 106500 ... 208000
dict lappend data Prop1 301 303 ... 325
dict lappend data Prop2 302 304 ... 326
CreateText $data
}
proc CreateText {data} {
set fid stdout ;# test with stdout instead of a file
dict for {key values} $data {
puts -nonewline $fid [format "%-32s" $key]
foreach value $values {
puts -nonewline $fid [format "%-16s" $value]
}
puts $fid ""
}
close $fid
}
main