Schrift
[thread]7539[/thread]

Newbie: Problem mit Variablen-Scope



<< >> 9 Einträge, 1 Seite
jokey
 2005-12-13 13:51
#60865 #60865
User since
2005-12-13
8 Artikel
BenutzerIn
[default_avatar]
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?
GwenDragon
 2005-12-13 14:20
#60866 #60866
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
jokey
 2005-12-13 14:31
#60867 #60867
User since
2005-12-13
8 Artikel
BenutzerIn
[default_avatar]
Danke für die Antwort. Ich habe es ausprobiert, leider hatte es nicht die erwünschte Wirkung. Ich habe das Array auf Dateiebene mit
Code: (dl )
our @CRC16Tab = ( ... hier die Werte ... ); # Array mit 256 initialisierten Werten
deklariert. Die aufrufende Funktion sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
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:
Quote
Use 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?
Dubu
 2005-12-13 15:29
#60868 #60868
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
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.
jokey
 2005-12-13 20:33
#60869 #60869
User since
2005-12-13
8 Artikel
BenutzerIn
[default_avatar]
Das habe ich schon überprüft. Es werden immer 2 definierte Variablen übergeben.
Muß ich beim Zugriff auf das Array vielleicht etwas anders machen?
renee
 2005-12-13 23:35
#60870 #60870
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schonmal ueberprueft, was hierbei rauskommt:
Code: (dl )
(($_[1] >> 8) ^ $_[0]) & 0xFF
? Vielleicht gibt es das Element im Array nicht!\n\n

<!--EDIT|renee|1134521207-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
esskar
 2005-12-14 01:47
#60871 #60871
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versuch es mal so

Code: (dl )
1
2
3
BEGIN {
our @CRC16Tab = ( ... hier die Werte ... ); # Array mit 256 initialisierten Werten
}
jokey
 2005-12-14 15:09
#60872 #60872
User since
2005-12-13
8 Artikel
BenutzerIn
[default_avatar]
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 ;)
esskar
 2005-12-14 15:16
#60873 #60873
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[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
<< >> 9 Einträge, 1 Seite



View all threads created 2005-12-13 13:51.