Tcl/Tk: Array als Paramter an Funktion übergeben
7. Oktober 2009 | 15:20:11
Vor der Version 8.5 konnte man in Tcl Arrays nur auf nachfolgend gezeigtem Wege als Argument an Funktionen übergeben und innerhalb dieser darauf zugreifen. Mit Version 8.5 bekam Tcl den Typ Dictionary spendiert, der diese ganze Angelegenheit (Übergabe an Funktionen und Zugriff darauf) wesentlich vereinfachte und beschleunigte. Aber leider bin ich momentan zu Tcl 8.4 verdammt.
Im ersten Abschnitt wird die Übergabe einer einfachen Variablen demonstriert. Im nachfolgenden Abschnitt übergeben wir dann ein Array:
Nun noch das Beispiel mit dem Array:
Nebenbei bemerkt: in Tcl kann man das '#'-Zeichen verwenden, um einen einzeiligen Kommentar zu schreiben (bzw. Code auszukommentieren). Wenn man mehrere Zeilen kommentieren möchte, so muss man vor jeder Zeile das '#'-Zeichen setzen oder - wie im Beispiel gezeigt - if-Blöcke benutzen. Dass ist auch einer der Gründe, warum ich so ein großer "Tcl-Fan" bin ... Achso, noch ein Grund: solltet ihr so etwas wie im folgenden Beispiel schreiben, so rafft der sch... Tcl-Interpreter nicht, dass es sich um Kommentar handelt und wirft statt dessen einen Fehler:
Im ersten Abschnitt wird die Übergabe einer einfachen Variablen demonstriert. Im nachfolgenden Abschnitt übergeben wir dann ein Array:
#------------------ einfache Variable testen --------------------------
if { 0 } {
proc testVar { param } {
upvar $param localVar
set m [expr $localVar+1]
}
set globalVar 1
puts "globalVar = $globalVar"
testVar globalVar
puts "globalVar = $globalVar"
}#------------------ einfaches Array testen --------------------------
if { 1 } {
proc testAry { param } {
upvar $param localAry
foreach {key val} [array get localAry] {
puts "$key = $val"
}
}
set globalAry(eins) "Eintrag eins"
set globalAry(zwei) "Eintrag zwei"
foreach {key val} [array get globalAry] {
puts "$key = $val"
}
testAry globalAry
}# --- Achte darauf, was bzw. wo du auskommentierst ----
# nachfolgend auskommentiertes if verursacht Fehler (wegen nicht geschlossener
# geschweifter Klammer). Tcl rafft nicht, dass die Zeile auskommentiert wurde (???)
# if { $test == 1 } {
if { $test == 0 } {
...
}

