2008年6月4日 星期三

TCL中,將陣列(Array) 轉成不含Index 的 List 字串

### 取得陣列大小,如 Array1 的大小為 (3,5)
### 傳入 GetArraySize Array1 取得的值為 { 3 5 } 的 List
### 可由 [lindex [GetArraySize Array1] 0] 的方式取出 Row
###  [lindex [GetArraySize Array1] 1] 的方式取出 Col

proc
GetArraySize {arryName} {
    set listName ""
    upvar $arryName arryNameII
    set arrRowMax 0
    set arrColMax 0
    foreach {value} [array get arryNameII] {lappend arrElment $value}
    for {set i 1} {$i = [llength $arrElment]} {set i [expr $i+2]} {
        set arrIdx [lindex $arrElment [expr $i-1]]
        set arrRow [string range $arrIdx 0 [expr [string first "," $arrIdx 0] - 1] ]
        set arrCol [string range $arrIdx [expr [string first "," $arrIdx 0] + 1] [string length $arrIdx]
]
        if {$arrRow>$arrRowMax} {set arrRowMax $arrRow}
        if {$arrCol>$arrColMax} {set arrColMax $arrCol}
    }       
    return "$arrRowMax $arrColMax"
}

### 將陣列轉成List
### 因為用TCL的 array get 會連同 Array Index 同時轉成 List
### 所以另外寫一個 procedure ,將陣列內容轉成不含 Index 的 List
### 這一段才是主要的程轉換 Function

proc Array2List {srcArrName} {
    upvar $srcArrName srcArrNameII
   ### 呼叫副程式取出陣列的 Row 及 Col 大小
    set srcArrNameII_r [lindex [GetArraySize srcArrNameII] 0]
    set srcArrNameII_c [lindex [GetArraySize srcArrNameII] 1]
    set destListName ""
    for {set i 1} {$i <= $srcArrNameII_r} {incr i } {
        set temp ""
        for {set j 1} {$j <= $srcArrNameII_c} {incr j } {
             lappend temp 0
        }
        lappend destListName $temp
    }
    for {set i 1} {$i <= $srcArrNameII_r} {incr i } {
        for {set j 1} {$j <= $srcArrNameII_c} {incr j } {
             lset destListName [expr $i-1] [expr $j-1] [expr double ($srcArrNameII($i,$j))]
        }
    }
    return $destListName
}

沒有留言:

張貼留言