User since
2005-12-13
8
Artikel
BenutzerIn
Hallo Perl-Gemeinde!
In einer Funktion, die zyklisch sehr oft aufgerufen wird, wird ein recht großes, konstantes Array verwendet. Im Moment ist es so, das das Array mit 'my' lokal in der Funktion liegt. Das macht die Sache natürlich langsam, da das Array bei jedem Aufruf erzeugt und wieder zerstört wird.
Daher habe ich versucht, das Array auf die Dateiebene zu verschieben und habe es dort mit den Scope-Modifizierern 'my' und 'local' zu deklarieren versucht. Beides hat nicht funktioniert. Mit 'my' war das Array in der Funktion nicht definiert, mit 'local' wollte er bei der Deklaration und bei der Verwendung einen Package-Spezifizierer.
Die Frage: Wie deklariere ich eine Variable, so daß sie in der ganzen Datei, also auch in den Unterfunktionen, sichtbar ist?
User since
2005-12-13
8
Artikel
BenutzerIn
Danke für die Antwort. Ich habe es ausprobiert, leider hatte es nicht die erwünschte Wirkung. Ich habe das Array auf Dateiebene mit
our @CRC16Tab = ( ... hier die Werte ... ); # Array mit 256 initialisierten Werten
deklariert. Die aufrufende Funktion sieht so aus:
sub CalculateCRC16 # Bytewert, Initwert
{
# The CCITT-polynomial is: 0x1021
# X^16+X^12+X^5+1
return $CRC16Tab[(($_[1] >> 8) ^ $_[0]) & 0xFF] ^ (($_[1] << 8) & 0xFFFF);
}
Beim Zugriff auf das Array in der Funktion sagt Perl mir:
QuoteUse of uninitialized value in bitwise xor (^) at setchecksum.pl line 536
Die monierte Zeile ist die return-Zeile in der obigen Funktion.
Wo liegt der Fehler?
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
Nicht das Array ist das Problem, sondern die Uebergabeparameter an die Routine CalculateCRC16(). Uebergibst du evtl. beim Aufruf weniger als die zwei benoetigten Parameter?
Und fuer dateilokale Variablen ist my() schon korrekt.
User since
2005-12-13
8
Artikel
BenutzerIn
Das habe ich schon überprüft. Es werden immer 2 definierte Variablen übergeben.
Muß ich beim Zugriff auf das Array vielleicht etwas anders machen?
User since
2003-08-04
14371
Artikel
ModeratorIn
Schonmal ueberprueft, was hierbei rauskommt:
(($_[1] >> 8) ^ $_[0]) & 0xFF
? Vielleicht gibt es das Element im Array nicht!\n\n
<!--EDIT|renee|1134521207-->
User since
2005-12-13
8
Artikel
BenutzerIn
Ich hab's rausgefunden!
Ich mußte die Deklaration des Arrays ganz an den Anfang der Datei schieben, da das Hauptprogramm mit dem Aufruf der Subfunktion bei mir am Anfang des Skriptes steht. In Zukunft werde ich das am Ende des Skripts plazieren.
Trotzdem Danke für die vielen Antworten. Beim nächsten Problem werde ich mich wieder melden ;)
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=jokey,14.12.2005, 14:09]Ich mußte die Deklaration des Arrays ganz an den Anfang der Datei schieben, da das Hauptprogramm mit dem Aufruf der Subfunktion bei mir am Anfang des Skriptes steht.[/quote]
genau das hab ich mir gedacht... deswegen der Wink mit dem BEGIN