KAPITEL 13. DER PROTOKOLLMONITOR
Globale und lokale Variablen
Variablen in Lua sind per default global und nach ihrer ersten Deklaration von
überall im Skript sichtbar bzw. zugänglich. Dies kann bei vermeintlich unab-
hängigen Variablen gleichen Namens zu merkwürdigen Resultaten führen. Be-
trachten Sie dazu folgende Zeilen:
1
function chksum ( data )
2
n = 0
3
f o r i =1 ,# data do
4
n = n + data : b y t e ( i )
5
end
r e t u r n n % 255
6
end
7
8
function o u t ( )
9
t h e c u r r e n t t e l e g r a m
10
t g = t e l e g r a m s . t h i s ( )
11
query t h e c u r r e n t t e l e g r a m l e n g t h
12
n = t g . s i z e ( )
13
a s i m p l e checksum
14
sum = chksum ( t g : s t r i n g ( ) )
15
t e l e g r a m s l e s s than 8 b y t e need a s p e c i a l h a n d l i n g
i f ( n < 8 ) then
16
17
do something w i t h s m a l l t e l e g r a m s
end
18
19
end
In Zeile 12 weisen wir die aktuelle Telegrammlänge der Variable n zu und be-
rechnen anschließend die Prüfsumme des Telegramms, indem wir der Funktion
chksum das Telegramm als Lua String übergeben. Und hier lauert das eigent-
liche Problem!
Die chksum Funktion verwendet intern ebenfalls eine Variable n zur Aufsum-
mierung der einzelnen Bytewerte. Aus der Sicht des Lua Interpreters existiert
diese ABER bereits (deklariert durch die vorherige Zuweisung der Telegramm-
länge). n wird deshalb in Zeile 2 (in der chksum Funktion) zuerst auf 0 gesetzt
und danach mit den Bytes des Strings data aufaddiert.
Bei der Abfrage in Zeile 16 enthält n nicht mehr die Telegrammlänge sondern
die Summe der Telegrammbytes! Nicht gerade das was wir beabsichtigten!
Sie können natürlich die Variable n in der chksum Funktion einfach umbenen-
nen. Dies ist aber vor allem bei umfangreicheren Templates nicht immer so
leicht möglich und bedeutet einen nicht zu unterschätzender Pflegeaufwand.
Eine bedeutend einfachere Lösung ist: Variablen, die nur innerhalb einer Funk-
tion benötigt werden, als 'lokal' zu deklarieren. Lua reserviert hierfür das Schlüs-
selwort local. Auf unser Beispiel angewandt reicht die Änderung von Zeile 2:
function chksum ( data )
1
l o c a l n = 0
2
f o r i =1 ,# data do
3
4
n = n + data : b y t e ( i )
5
end
6
r e t u r n n % 255
7
end
Die lokale Variable n existiert jetzt nur noch innerhalb der Funktion chksum
und hat mit der Telegrammlänge n in Zeile 12 nichts mehr gemeinsam.
Aber was ist mit der Variable i?
Die Laufvariable innerhalb einer for Schleife hält Lua generell lokal. Sie ist nur
112