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

eine Frage zu objektorientertem Perl (Seite 8)



<< |< 1 ... 5 6 7 8 9 10 11 ... 15 >| >> 150 Einträge, 15 Seiten
PerlProfi
 2007-04-17 16:33
#75867 #75867
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Eigentlich hat perl dir ja schon gesagt wo dein Fehler liegt:
Quote
"Can't locate object method "Neu" via packagge baum...etc.

Anscheinend gibt es keine methode Neu in deinem baum.pm.
Wobei ich das auch Baum.pm nennen würde.

Ausserdem sieht es nicht so aus, als ob das OOP wäre.
Deine Neu Methode sollte doch eigentlich ein Object zurücklieferen, keinen Array.
Und hinzufuegen wird wohl auch keine Klassenmethode sein, oder?
Genauso wenig wie ausgabe.
Bei allen 3 Methoden aufrufen hast du übrigens eine lexikalische Variable - @erstellebaum - in dem scope deiner Subroutine erstellt, welche den Rückgabewert bekommt und direkt danach vernichtet wird. Dass wolltest du bestimmt nicht.

In der if-Bedingung in BaumNeu ist übrigens noch ein Fehler, dass muss nicht == sondern =~ heißen und das push() willst du bestimmt nur ausführen, wenn eine Zahl eingegeben wurde. ( else{} )
Vielleicht möchtest du auch, dass bei ungültiger Eingabe nochmal nach einer Zahl verlangt wird, im Moment jedenfalls muss man keine 10 Zahlen eingeben. ( redo )

Du solltest dafür sorgen, dass deine Subroutinen alles was sie benötigen um richtig zu funktionieren, durch Parameter erhalten und nicht aus dem Hauptprogramm irgendwelche Variablen benutzen.

Viele deiner Fehler treten wohl auch auf, weil du deinen Programmcode nicht richtig strukturierst.

MfG
ASDS
 2007-04-17 16:47
#75868 #75868
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Quote
Anscheinend gibt es keine methode Neu in deinem baum.pm.
Wobei ich das auch Baum.pm nennen würde.

eigentlich sollte es die geben nämlich hier:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub Neu {
my $class = shift;
my $self = {};
bless( $self, $class );

my @liste = @_;
$self->{'ref_wurzel'} = newtree (\@liste);
return $self;
}


Quote
Deine Neu Methode sollte doch eigentlich ein Object zurücklieferen, keinen Array.
Und hinzufuegen wird wohl auch keine Klassenmethode sein, oder?
Genauso wenig wie ausgabe.
Bei allen 3 Methoden aufrufen hast du übrigens eine lexikalische Variable - @erstellebaum - in dem scope deiner Subroutine erstellt, welche den Rückgabewert bekommt und direkt danach vernichtet wird. Dass wolltest du bestimmt nicht.

*wein* und wie mach ichs besser?
Ich glaub ich lass die Finger davon, OOP is nichts für mich :-(
DAnke jedenfalls für eure Hilfe, nach fast 1 Woche herum tun und veruschen geb ich jetzt wohl dochauf.
Ich dacht ich bin auf dem richtigen weg und das klingt jetzt voll so als wäre es eh hinten und vorne falsch... *seuftz* Nun ja...
renee
 2007-04-17 16:57
#75869 #75869
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht hilft Dir http://de.selfhtml.org/perl/sprache/objekte.htm etwas dabei, OOP zu verstehen.
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/
ASDS
 2007-04-17 17:06
#75870 #75870
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
gut.. ich versuchs nochmal... also....
Quote
sub new {
my $Objekt = shift;
my $Referenz = {};
bless($Referenz,$Objekt);
return($Referenz);
}


ich hab nichts anders in meinen Augen gemacht als ich:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub Neu {
  my $class = shift;
  my $self  = {};
  bless( $self, $class );

  my @liste = @_;
  $self->{'ref_wurzel'} = newtree (\@liste);
  return $self;
}
geschrieben habe.

und hier:
Quote
my $html = HTMLprint -> new();

das hab ich doch hier umgesetzt:
Code: (dl )
1
2
3
4
5
6
7
8
sub BaumNeu { 
  for(0..9){
        ....     }
   print "Sie haben folgende Zahlen eingegeben: (@liste1) \n";

$ebaum =baum->Neu(@liste1);

}
oder etwa nicht? ich erkenn daraus nicht was anders seins ollte.. okay, ich hab jetzt das @erstellebaum in $ebaum umgewandelt.. aber trotzdem geht es nicht.. er geht mir bis zueingabe der zahlen, sagt mir auch wenn ich keine Zahl eingebe... aber er gibt mir weder die Liste aus, noch erkennt er die sub Neu, die ich doch eindeutig erstellt hab.\n\n

<!--EDIT|ASDS|1176815229-->
renee
 2007-04-17 17:11
#75871 #75871
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
rufst Du die Subroutinen auch auf??

Poste doch mal den Code, den Du jetzt hast!
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/
ASDS
 2007-04-17 17:15
#75872 #75872
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
uff...
Mein .pm lautet: baum.pm und enthält folngenden Code
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use strict;
use warnings;



sub knot { return ( { 'zahl' => shift,
'linksweg' => undef,
'rechtsweg' => undef } );
}

sub newtree {
######################
# Erstellen des Trees

my $ref_liste1 = shift;
my $zahl = undef;

my $ref_wurzel = undef;

for my $zzahl (@$ref_liste1){
my $refvalue = $ref_wurzel;

if ($zahl)
{ while (1) {
############################
#Beginn des Vergleichs

if($zzahl < $$refvalue{'zahl'}) {
if(defined($$refvalue{'linksweg'}))
{
$refvalue = $$refvalue{'linksweg'};
}
else {
$$refvalue{'linksweg'} = knot($zzahl);
$zahl = $ref_wurzel;
last; #Ende
}
}
#######
#wenns Links nicht mehr weiter geht, geh rechts weiter

else { if ($zzahl > $$$refvalue {'zahl'}) {

if(defined($$refvalue{'rechtsweg'}))
{$refvalue = $$refvalue{'rechtsweg'};

}
else {
$$refvalue{'rechtsweg'} = knot($zzahl);
last;
}
}
}
}

}
return($ref_wurzel);
}



########
#Hauptprogramm
########

###################
#Ausgabe des Trees
####

sub ausgabe {
my $self = shift;
my $refvalue = shift;

if(defined($self->{'ref_wurzel'}->{'linksweg'})) {
ausgabe($$refvalue{'linksweg'})
}

print "$self->{'ref_wurzel'}->{'zahl'}\n";

if(defined($self->{'ref_wurzel'}->{'rechtsweg'})) {
ausgabe($$refvalue{'rechtsweg'})
}
}
ausgabe($ref_wurzel);


sub Neu {
my $class = shift;
my $self = {};
bless( $self, $class );

my @liste = @_;
$self->{'ref_wurzel'} = newtree (\@liste);
return $self;
}
###############
#Hinzufügen weiterer Äste
###############
sub hinzufuegen {
my $self = shift;
my @newList = @_;
if (defined($self->{ref_wurzel})){
my $list = $self->{ref_liste1};
foreach my $zzahl (@newList)
{ push(@$list, $zzahl); };
$self->{ref_wurzel} = newtree ($list);

}
}

}

1;


mein .pl lautet: MainBaum.pl und das hab ich so geschrieben:
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
use baum;
use strict;

my @liste1 = ();
my @liste2 = (4, 28, 9, 100, 12, 84, 10, 11);
my @HinzufuegenListe = ();
my @NeuListe = ();
my $ebaum = undef;

############################
#Eingabe der ersten 10 Zahlen / Liste 1
############################

sub BaumNeu {
for(0..9){
print "Bitte geben Sie eine Zahlen ein: ";
my $eingabe = <STDIN>;
if ( $eingabe =~ /^\D*$/)
{
print "Ungültige Eingabe, bitte geben sie nur Zahlen ein \n";
chomp($eingabe);
push @liste1,$eingabe;
}}
print "Sie haben folgende Zahlen eingegeben: (@liste1) \n";

$ebaum =baum->Neu(@liste1);

}
sub Hinzufuegen {
{my $zzahl = @_; }
$ebaum =baum->hinzufuegen(my @NeueListe);
}

sub Ausgabe {
$ebaum =baum->ausgabe(@HinzufuegenListe);}

BaumNeu;
Hinzufuegen;
Ausgabe;


an einer () nach BaumNeu kanns nicht liegen, oder? Wie gesagt, er kommt meiner Meinung ja nichts ins .pm und dort in die Methode NEU hinein, obowhl meiner Meinung nach der Pfad passt.
renee
 2007-04-17 17:20
#75873 #75873
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es fehlt ein package baum; am Anfang von baum.pm!

Wie schon gesagt wurde, solltest Du Deine Klasse Baum.pm nennen (und auch in der package-Anweisung dann Baum schreiben), weil komplett kleingeschriebene Namen für Pragmas wie strict oder warnings gedacht ist.
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/
renee
 2007-04-17 17:23
#75874 #75874
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aus
Code: (dl )
1
2
3
4
5
6
7
            if ( $eingabe =~ /^\D*$/)
{
print "Ungültige Eingabe, bitte geben sie nur Zahlen ein \n";
chomp($eingabe);
push @liste1,$eingabe;
}


Solltest Du
Code: (dl )
1
2
3
4
5
6
7
8
9
            if ( $eingabe =~ /^\D*$/)
{
print "Ungültige Eingabe, bitte geben sie nur Zahlen ein \n";
redo;
}
else{
chomp($eingabe);
push @liste1,$eingabe;
}


machen (wurde schon gesagt).

Es wäre auch ganz praktisch wenn Du Dir einen konsistenten Einrückstil angewöhnen würdest. Das würde uns das Lesen des Codes ziemlich erleichtern!\n\n

<!--EDIT|renee|1176816284-->
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/
renee
 2007-04-17 17:26
#75875 #75875
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wofür machst Du eigentlich immer die Mini-Blöcke wie
Code: (dl )
    {my $zzahl = @_; }
?

Du solltest da einfach die "{}" weglassen. So wie Du es hast, kannst Du später nicht mehr auf $zzahl zugreifen, weil sie den Gültigkeitsbereich schon verlassen hat.
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/
renee
 2007-04-17 17:33
#75876 #75876
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aus
Code: (dl )
$ebaum =baum->hinzufuegen(...)
musst Du
Code: (dl )
$ebaum->hinzufuegen(...)
machen. Es soll ja die Methode des Objekts aufgerufen werden.

Und aus
Code: (dl )
$ebaum =baum->ausgabe(...)
muss
Code: (dl )
$ebaum->ausgabe(...)
werden.
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/
<< |< 1 ... 5 6 7 8 9 10 11 ... 15 >| >> 150 Einträge, 15 Seiten



View all threads created 2007-04-10 15:14.