Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

zu Perl TK und der Gültigkeit von Variablen...

Diskussion: zu Perl TK und der Gültigkeit von Variablen... im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Seit gestern beschäftige ich mich mit Perl TK , und da meiner Meinung nach die gute alte "trial & ...

Antwort
Alt 11.06.07, 16:03   #1 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard zu Perl TK und der Gültigkeit von Variablen...

Anzeige

Seit gestern beschäftige ich mich mit Perl TK,
und da meiner Meinung nach die gute alte "trial & error"-Methode immer noch die beste ist,
hab ich mich dran gemacht ein kleines Sachspiel damit zu programmieren...


Das ganze soll (natürlich) eine grafische Oberfläche bekommen,
die soweit auch steht.

Damit man die Figuren bewegen kann hab ich mir gedacht
dass ich die Felder einfach zu Buttons mache,
die dann an eine Subroutine die Feldkoordinaten als Parameter mitgibt.


Dazu folgender Code-Ausschnitt:   

Code:
                for(my $j=1; $j <=8; $j++){
                    if($j % 2 == 0){
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'white',
                                                   -activebackground => 'lightgrey',
                                                   -foreground => 'black',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                     }else{
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'black',
                                                   -activebackground => 'darkgrey',
                                                   -foreground => 'white',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                    }
                }



Dieser Code soll 8 Buttons, abwechselnd schwarz, bzw weis ausgeben.
Problem hierbei ist
Code:
-command => sub{ out( $j ) }
bei dem $j nicht den Wert der Zählervariable der For-Schleife hat, sondern immer irgendeine (im aktuellen Programmdurchlauf immer gleichbleibende) Zahl.


Kann mir jemand sagen warum $j nicht den Wert der Zählervariable erhällt :-?



[ EDIT: ]

ok...
jetzt hat $j in der "command-Anweisung" immer den Wert 9...
obwohl ich eigentlich nix geändert habe... egal...

Hier mal der ganze Test-Code   
Code:
#!/usr/bin/perl

use English;
require Tk;
use Tk;


my $field_width = 9;
my $field_height = 4;


($playername[0],$playername[1]) = ('','');

 my @chessboard=('R','K','B','I','Q','B','K','R',
                 'P','P','P','P','P','P','P','P',
                 ' ',' ',' ',' ',' ',' ',' ',' ',
                 ' ',' ',' ',' ',' ',' ',' ',' ',
                 ' ',' ',' ',' ',' ',' ',' ',' ',
                 ' ',' ',' ',' ',' ',' ',' ',' ',
                 'p','p','p','p','p','p','p','p',
                 'r','k','b','i','q','b','k','r');




### CREATE MAIN-WINDOW-OBJECT
my $main = MainWindow -> new();
   $main -> minsize( qw(500 550));
   $main -> title("KEKSINAT0R's GUI-CHESS v1.0");
   $main -> configure(-background => 'darkgrey');



### CREATE MENU BAR:
my $menu_bar = $main -> Frame(-relief => 'groove',
                              -borderwidth => 3,
                              -background => 'darkred',)
-> pack(-side => 'top', -fill => 'x');

    ### CREATE FILE GROUP:
    my $file_mb = $menu_bar -> Menubutton(-text => 'File',
                                          -background => 'darkred',
                                          -activebackground => 'darkgrey',
                                          -foreground => 'white')
    -> pack(-side => 'left');
        $file_mb -> command(-label => 'Exit',
                            -activebackground => 'black',
                            -command => sub{$main->destroy});
        $file_mb -> separator();



### SPACER:
my $spacer = $main -> Frame(-background => 'yellow')
-> pack(-side => 'top', -fill => 'x');
    my $t1 = $spacer -> Label(-text => '', - background => 'black')
    -> pack();



### BOARD:
my $center = $main -> Frame(-background => 'black')
-> pack(-side => 'top', -fill => 'both');
    for($i=1; $i <=8; $i++){
        my $line = $main -> Frame()
        -> pack(-side => 'top');
            if($i % 2 == 0){
                for(my $j=1; $j <=8; $j++){
                    if($j % 2 == 0){
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'white',
                                                   -activebackground => 'lightgrey',
                                                   -foreground => 'black',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                    }else{
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'black',
                                                   -activebackground => 'darkgrey',
                                                   -foreground => 'white',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                    }
                }
            }else{
                for(our $j=1; $j <=8; $j++){
                    if($j % 2 == 0){
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'black',
                                                   -foreground => 'white',
                                                   -activebackground => 'darkgrey',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                     }else{
                        my $piece = $line -> Button(-text => ($chessboard[($i*8)-9+$j]),
                                                   -background => 'white',
                                                   -activebackground => 'lightgrey',
                                                   -foreground => 'black',
                                                   -width => $field_width,
                                                   -height => $field_height,
                                                   -command => sub{ out($j) })
                        -> pack(-side => 'left', -anchor => 'w');
                    }
                }
            }
    }




### SPACER:
my $spacer = $main -> Frame(-background => 'yellow')
-> pack(-side => 'top', -fill => 'x');
    my $t1 = $spacer -> Label(-text => '', - background => 'black')
    -> pack();




MainLoop();




sub out ($){
  print @_; print "\n";
}
keksinat0r ist offline   Mit Zitat antworten
Alt 11.06.07, 16:59   #2 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Tipp für die Zukunft: Gewöhne dir gleich an 'strict' zu benutzen (use strict; ). Damit mußt du zwar alle Variablen explizit beim ersten Aufruf mit 'my' deklarieren, dafür bekommst du aber auch vom Interpreter Meldungen, wenn die Gültigkeit nicht gegeben ist.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist gerade online   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 11.06.07, 17:13   #3 (permalink)
Themenstarter
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

Naja... das hat net viel geändert...
Ich hab auch mal die Warnmeldungen ausgeben lassen:

Code:
"my" variable $spacer masks earlier declaration in same scope at C:\Users\Chuck
Norris\Desktop\chess_2.0.pl line 118.
"my" variable $t1 masks earlier declaration in same scope at C:\Users\Chuck Norr
is\Desktop\chess_2.0.pl line 120.
Problem ist aber imemr noch das gleiche; Die Buttons geben für $i und für $j immer 9 mit anstatt dem aktuellen Zähler der For-Schleife

Das komische ist, dass er die Variablen bei -text noch korrekt einließt, da er die korrekten Buchstaben als Button-Titel aus "@chessboard" ließt...
wenn ich aber $i bzw $j via
sub{ print($i) }
ausgeben lasse steht auch immer 9 drin...
keksinat0r ist offline   Mit Zitat antworten
Alt 11.06.07, 17:19   #4 (permalink)
Moderator
 
Benutzerbild von bitmuncher
 
Registriert seit: 30.09.06
bitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcorebitmuncher Quadcore
Likes: 441
Standard

Dann lasse halt in der Schleife nochmal 2 extra Variablen hochzählen. Es ist eine Unart von C/Java/usw.-Programmierern das nicht zu tun. Aber abgesehen davon liegt dein Problem vermutlich eher hier:

Code:
 for(my $j=1; $j <=8; $j++){
Damit ist $j nur als Zähler also innerhalb von '(' und ')' gültig.
__________________
Mein Blog - Mein Job - Diaspora

Der Ring uns zu knechten besteht aus 12 Sternen auf blauem Grund.

Neue Beiträge im Habo via Twitter - Das HaBo auf FB - Das HaBo bei G+
bitmuncher ist gerade online   Mit Zitat antworten
Alt 11.06.07, 17:26   #5 (permalink)
Themenstarter
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

alter_beitrag   
"my" definiert variablen doch lokal in { und }.
Code:
my $i = 'x';
if(1==1){
  my $i = 'bla';
}
print($i);
gibt ja auch "x" und nicht "bla" aus.

$i und $j sind ja innerhalb des Button-Objekts auch noch gültig, "-text" liest wie ich schon geschrieben hab ja die korrekten Werte im Array ein, die wiederum mithilfe von $i und $j errechnet wird !?!

Bsp:
In dem kompletten Programmtext ist $i und $j in Zeile 70 gültig und hat die entsprechenden Zähler-Werte.
In Zeile 76 allerdings nichtmehr, da haben beide immer den Wert 9....

Das ist das was ich net ganz verstehe, da Beide Zeilen in den gleichen Klammern stehen, sowohl ( und ) alsauch { und } ... :-?


selbst wenn ich $i und $j global definiere ändert sich nichts :(


[ EDIT: ]

code   
Code:
#!/usr/bin/perl -w

use English;
use Tk;
use strict;

my $main = MainWindow -> new();
$main -> geometry('+100+300');

my $x = 0;
for( my $i = 1; $i < 5; $i++){
  my $button = $main -> Button(-text => 'test', -command => sub { print($i.'-'.$x); print ("\n") })
  ->pack(-side => 'top');
  $x++;
}

MainLoop();


Es ist vollkommen egal was in der Schleife hochgezählt wird...
die Ausgabe ist immer " 5-4 " also ist $i immer 5 udn $x immer 4.
...wohl wegen der Bedingung, $i wird mti 1 initialisiert und $x mit 0...

Wenn ich die Schleife jetzt folgendermaßen umbaue:
code   
Code:
for( my $i = 1; $i < 5; $i++){
  my $x=0;
  my $button = $main -> Button(-text => 'test', -command => sub { print($i.'-'.$x); print ("\n") })
  ->pack(-side => 'top');
  $x++;
}


Gibt er immer " 5-1 " aus ?!
-> man beachte dass $x vor dem erstellen des Buttons auf 0 gesetzt wird, und zwar bei jedem Duurchlauf....

Warum ist das so?
- ich kenn mich mit objektoriantierter Programmierung net so gut aus, aber könnte es sein dass der bereits erstellte Button einfach immer wieder überschrieben wird?

Einen Array kann ich bei $button nicht nutzen, da dann der Compiler mit nem Feher abbricht...

Wie kann ich sonst Buttons in einer Schleife erzeugen lassen, die dann auch die korrekten Werte ausgeben?
keksinat0r ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » zu Perl TK und der Gültigkeit von Variablen...
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
perl threads::shared - diverse Probleme mit "shared" variablen keksinat0r Code Kitchen 4 22.02.09 18:43
Seriennummer auf Gültigkeit überprüfen Knoxx Cryptography & Encryption 13 26.01.09 05:23
Perl - Funktionsnamen anhand von Variablen zusammensetzen bitmuncher Code Kitchen 7 20.07.08 16:36
Gültigkeit von Hyperlinks überprüfen. freakazoid (Web-) Design und webbasierte Sprachen 5 30.08.07 12:29
Variablen in C Dawen Code Kitchen 2 28.10.05 23:56


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61