Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6262[/thread]

Komische von Rekursiven Durchsuchalgorithmus



<< >> 7 Einträge, 1 Seite
format_c
 2004-05-16 22:54
#82456 #82456
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi ich hab hier folgenden Suchalgorithmus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for my $file (@verz) {
$Config{tl}->update();
last if $Config{abbr} == 1;
$text2 = '.' x $i;
$i = 0 if ++$i > 3;
if ($file =~ /\.lnk$/) {
_check($file);
next;
}
if(-d $file) {
opendir DIR,$file or die "Konnte Verzeichnis $file nicht öffnen: $!";
push @verz,map { $file . '\\' . $_ } grep !/^\.\.?$/ && (-d $file . '\\' . $_ or /\.lnk$/i), readdir DIR;
closedir DIR;
}
}


Wenn ich ein Verzeichnis z.B. C:\Temp eingebe funktioniert er wunderbar

wenn ich jedoch einfach C:\ eingebe bringt Tk einen Fehler was ich absolut nicht nachvollziehen kann
Code: (dl )
1
2
3
4
Tk::Error: Tk::Button=HASH(0x29b1404) is not a Tk object at D:/Perl/site/lib/Tk.pm line 91.
(ConfigSpecs,Configure,[\&Tk::After::_cancelAll,{}],_names_)
Tk callback for .toplevel1.frame.button
(command bound to event)


Kann das jemand nachvollziehen?

Gruß Alex\n\n

<!--EDIT|format_c|1084733714-->
coax
 2004-05-16 23:20
#82457 #82457
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
hm..
man kann ja gar nicht richtig erkennen wo durch der Fehler zu stande kommt, irgendwie fehlt da der Code mit den Tk-Kram ;)
,,Das perlt aber heute wieder...'' -- Dittsche
format_c
 2004-05-16 23:24
#82458 #82458
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich könnte ja die ganzen 300 Zeilen posten weil ich nicht genau weis wo der Fehler herkommt.
Hier der Code des Dialoges wo der Pfad eingegeben wird:
Code: (dl )
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
    my $w = 350;
my $h = 200;
# Abbruchsvariable resetten falls gesetzt
$Config{abbr} &&= 0;

my ($width,$height,$pos_x,$pos_y) = split /\+|x/,$Config{main_window}->geometry();
$Config{tl} = $Config{main_window}->Toplevel(-title=>'Startkriterien');
$Config{tl}->Icon(-image=>$Config{Icon});
$Config{tl}->minsize($w,$h);
$Config{tl}->geometry('+' .
int($width / 2 + $pos_x - $w / 2) .
'+' .
int($height / 2 + $pos_y - $h / 2)
);
$Config{tl}->focusForce();
my $frame = $Config{tl}->Frame()->pack(-anchor=>'n');

$frame->Label(-text=>'') ->grid(-column=>0,-row=>0,-sticky=>'ew');
$frame->Label(-text=>'') ->grid(-column=>1,-row=>0,-sticky=>'ew');

$frame->Label(-text=>'Startpfad:',-anchor=>'w') ->grid(-column=>0,-row=>1,-sticky=>'ew');
$frame->Entry(-textvariable=>\$Config{start}) ->grid(-column=>1,-row=>1,-sticky=>'ew');

$frame->Label(-text=>'Suchtext:',-anchor=>'w') ->grid(-column=>0,-row=>2,-sticky=>'ew');
$frame->Entry(-textvariable=>\$Config{suche}) ->grid(-column=>1,-row=>2,-sticky=>'ew');

$frame->Label(-text=>'Ersetzung:',-anchor=>'w') ->grid(-column=>0,-row=>3,-sticky=>'ew');
$frame->Entry(-textvariable=>\$Config{ersetzung}) ->grid(-column=>1,-row=>3,-sticky=>'ew');

$frame->Label(-text=>'Versuchen das Ziel aufzulösen?:',-anchor=>'w') ->grid(-column=>0,-row=>4,-sticky=>'ew');
$frame->Checkbutton(-variable=>\$Config{resolve},-anchor=>'w') ->grid(-column=>1,-row=>4,-sticky=>'ew');

$frame->Label(-text=>'Bestätigung beim Auflösen?:',-anchor=>'w') ->grid(-column=>0,-row=>5,-sticky=>'ew');
$frame->Checkbutton(-variable=>\$Config{confirm},-anchor=>'w') ->grid(-column=>1,-row=>5,-sticky=>'ew');

$frame->Label(-text=>'') ->grid(-column=>0,-row=>6,-sticky=>'ew');
$frame->Label(-text=>'') ->grid(-column=>1,-row=>6,-sticky=>'ew');

$frame->Button(-text => 'Start',
-command => \&_durchsuchen,
-width => 20) ->grid(-column=>0,-row=>7);
$frame->Button(-text => 'Abbrechen',
-command => sub{$Config{tl}->destroy();},
-width => 20) ->grid(-column=>1,-row=>7);

# Bindungen
$Config{tl}->bind('<Return>',\&_durchsuchen);

Und hier die sub _durchsuchen
Code: (dl )
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    # Toplevel zerstören
$Config{tl}->destroy();
$Config{start} ||= '';
$Config{such} ||= '';
$Config{ersetzung} ||= '';
# Pfüfung der ausgefüllten Felder
unless (-d $Config{start}) {
$Config{main_window}->messageBox(-title=>'Felder wurden nicht korrekt ausgefüllt!',
-message=>"Das Verzeichnis $Config{start} ist kein Verzeichnis oder existier nicht.",
-icon=>'error',
-type=>'OK'
);
return;
}
if ($Config{suche} xor $Config{ersetzung}) {
$Config{main_window}->messageBox(-title=>'Felder wurden nicht korrekt ausgefüllt!',
-message=>"Bitte Such und Ersetzungsfeld ausfüllen um Ersetzung durchzuführen oder keines um keine Ersetzung durchzuführen.",
-icon=>'error',
-type=>'OK'
);
return;
}

#------------------------------------------------------------------------------------------
----
# Toplevel zur Beschäftigung anzeigen
#------------------------------------------------------------------------------------------
----
my $w = 150;
my $h = 100;
my $text1 = 'Durchsuche';
my $text2 = '';
my $Icon = $Config{main_window}->Photo(-file=>$FindBin::Bin . '/chklnk.gif');
my ($width,$height,$pos_x,$pos_y) = split /\+|x/,$Config{main_window}->geometry();
$Config{tl} = $Config{main_window}->Toplevel(-title=>'Durchsuche...');
$Config{tl}->Icon(-image=>$Config{Icon});
$Config{tl}->minsize($w,$h);
$Config{tl}->geometry('+' .
int($width / 2 + $pos_x - $w / 2) .
'+' .
int($height / 2 + $pos_y - $h / 2)
);
$Config{tl}->focusForce();
my $frame1 = $Config{tl}->Frame()->pack();
my $frame2 = $Config{tl}->Frame()->pack();
$frame1->Label(-text=>$text1,-anchor=>'w')->pack(-side=>'left');
$frame1->Label(-textvariable=>\$text2,-anchor=>'w',-width=>5)->pack(-side=>'left');
$frame2->Label(-image=>$Icon)->pack(-side=>'top');
$frame2->Button(-width=>20,
-text=>'Abbruch',
-underline=>0,
-command=>sub{$Config{abbr} = 1;$Config{tl}->destroy();}
)->pack(-side=>'top');
$Config{tl}->bind('<Return>',sub{$Config{abbr} = 1;$Config{tl}->destroy();});
$Config{tl}->bind('<a>', sub{$Config{abbr} = 1;$Config{tl}->destroy();});
#------------------------------------------------------------------------------------------
------


my $i = 0;
my @verz = ($Config{start});

for my $file (@verz) {
$Config{tl}->update();
last if $Config{abbr} == 1;
$text2 = '.' x $i;
$i = 0 if ++$i > 3;
if ($file =~ /\.lnk$/) {
_check($file);
next;
}
if(-d $file) {
opendir DIR,$file or die "Konnte Verzeichnis $file nicht öffnen: $!";
push @verz,map { $file . '\\' . $_ } grep !/^\.\.?$/ && (-d $file . '\\' . $_ or /\.lnk$/i), readdir DIR;
closedir DIR;
}
}
$Config{tl}->destroy();
unless ($Config{abbr} == 1) {
$Config{main_window}->messageBox(-title=>'Suche abgeschlossen',
-message=>"Suche im Verzeichnis $Config{start} abgeschlossen",
-icon=>'info',
-type=>'OK'
);
}


Gruß Alex
coax
 2004-05-17 00:16
#82459 #82459
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Hab den Code mal uebernommen und dabei die Zeile fuer das GIF-Icon und in der Suche die mit den Aufruf von check() auskommentiert weil ich das Icon und check() nicht habe.
Ich kann nun C:\ eingeben und es laeuft bis zum Ende durch.

Setz bei dir mal $Config{start} mit 'C:\' als Defaultwert (damit du ihn nicht immer von Hand eingeben musst) und kommentiere mal die Anweisungen in _durchsuchen komplett aus. Dann entkommentierst du sukzessiv die Anweisungszeilen-/bloecke und testest jedesmal den Ablauf des Progamms.
Ein paar Variablenausgaben koennten zur Kontrolle nicht schaden.
Ich denke mal so solltest du der Fehlerquelle auf die Schliche kommen.

Grusz coax.\n\n

<!--EDIT|coax|1084738688-->
,,Das perlt aber heute wieder...'' -- Dittsche
format_c
 2004-05-17 02:02
#82460 #82460
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ah danke für den Tipp hab den Fehler gefunden.

Habe ja in Config{tl} mein Toplevel gespeichert, dann zerstört und dann wieder ein neues generiert. Dachte destroy wäre so ähnlich wie undef.

ein undef $Config{tl}; hat den Fehler beseitigt.

Gruß ALex
coax
 2004-05-17 02:22
#82461 #82461
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Gleiche Fehlermeldung hatte ich erfahren wenn ich auf den Abbruch-Button drueckte, schau mal ob das jetzt richtig funtz.
,,Das perlt aber heute wieder...'' -- Dittsche
ronald
 2004-05-17 10:55
#82462 #82462
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Gib mal die Namen der Verzeichnisse/Dateien aus. Vielleicht fällt dir dann beim letzten Namen etwas auf. Enthält er Leerzeichen oder \ oder ß oder Klammern? Manchmal gibt es Dateien, die ^h enthalten oder :wq heissen usw.
<< >> 7 Einträge, 1 Seite



View all threads created 2004-05-16 22:54.