As far as I understand, in tcl if you want to pass a named array to a function, you have to access the upper scope of the caller via the upvar
command within the callee body. Is this the only way to pass an array in tcl ?
If you want to pass an array, which s essentially a collection of variables, to a procedure in TCL, you can use the command `upvar` as explained earlier. You are passing a name to the procedure and then using it to access the array at the previous level.
upvar , a built-in Tcl command, links a variable at the current level to another variable at or above the current level.
A whole array cannot be passed as an argument to a function in C++. You can, however, pass a pointer to an array without an index by specifying the array's name.
Creating an Array To create multiple array keys and values in one operation, use array set. Array names have the same restrictions as any other Tcl variable. In Tcl, everything is a string. Quoting strings is mostly not necessary, and can even be a problem, as in the previous example.
As Michael indicated, there are several ways, plus a wiki page that discusses it. Just to have some of that information here, some options are:
By Upvar
proc by_upvar {&arrName} {
upvar 1 ${&arrName} arr
puts arr(mykey)
set arr(myotherkey) 2
}
set myarr(mykey) 1
by_upvar myarr
info exists myarr(myotherkey) => true
By array get/set
proc by_getset {agv} {
array set arr $agv
puts arr(mykey)
set arr(myotherkey) 2
return [array get arr]
}
set myarr(mykey) 1
array set mynewarr [by_upvar myarr]
info exists myarr(myotherkey) => false
info exists mynewarr(myotherkey) => true
There are other ways, like converting it into a list first (via array get
and array set
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With