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