Schrift
[thread]8913[/thread]

eine Frage zu objektorientertem Perl (Seite 10)



<< |< 1 ... 7 8 9 10 11 12 13 ... 15 >| >> 150 Einträge, 15 Seiten
ASDS
 2007-04-17 20:50
#75887 #75887
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,17.04.2007, 15:59]Vielleicht wäre es für dich praktischer dir ein Wiki:Buch anzuschaffen.

edit: In dem code ist in einer if-Bedingung noch ein $ zuviel:
Code: (dl )
1
2
3
4
 #wenns Links nicht mehr weiter geht, geh rechts weiter
   
             
else {    if ($zzahl > $$$refvalue {'zahl'}) { ### $$refvalue{'zahl'}


Und was renee gemeint hat war, dass $self->{'ref_wurzel'}->{'zahl'} beim Zeitpunkt der Ausgabe undef ist.
Das verursacht diese Warnung.[/quote]
buff... ich find meinen Fehler nicht, den ich da drinnen hab... könnt ihr mir nen Tipp geben?
ASDS
 2007-04-17 21:12
#75888 #75888
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
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
sub newtree {
######################
# Erstellen des Trees

my $ref_liste1 = shift;
my $zahl = undef;
my $ref_wurzel = undef;
my $refvalue = 0;

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

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


if($zzahl < $$ref_wurzel{'zahl'}) {

if(defined($$ref_wurzel{'linksweg'}))

{

$refvalue = $$ref_wurzel{'linksweg'}; #erster refvalue passt

}

else {

$$ref_wurzel{'linksweg'} = knot($zzahl);

$zahl = $ref_wurzel; #bleibt auch

last; #Ende
}

}


#wenns Links nicht mehr weiter geht, geh rechts weiter


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

if(defined($$ref_wurzel{'rechtsweg'}))

{

$refvalue = $$ref_wurzel{'rechtsweg'};
}

else {

$$ref_wurzel{'rechtsweg'} = knot($zzahl);

last;

}
}
}
}

}
return($ref_wurzel);
}


so gehts auch nicht.. ich hab mir gedacht es liegt vielleicht am refvalue.. aber das passt auch nicht...
Ronnie
 2007-04-17 21:41
#75889 #75889
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hallo ASDS,

dein Problem ist, dass dir einfach notwendige Grundkenntnisse über Objektorientierung fehlen. Es ist schwierig diese Infos in wenige Worte zu fassen. Ein Buch ist sicher sehr sinnvoll. Objektorientierung setzt eine andere Denkweise voraus, als klassische prozedurale Programmierung. Man kann sagen das ein Objekt ein eigener Typ ist. In einer schwachtypisierten Sprache wie Perl spielt das aber keine große Rolle. Eine Klasse beschreibt eine Art Schablone für Objekte. Ein Kerngedanke der Objektorientierung ist die Verbindung von Instanz und Methode. Eine Methode, spezieller eine Instanzmethode, unterscheidet sich von einer Funktion dadurch, das sie auf die Attribute des Objektes Zugriff hat. Eine Klassenmethode verändert Klassenattribute, die dann sämtliche Instanzen (Objekte) der Klasse betreffen. Beispiel für ein Klassenattribut könnte eine Variable sein, die die Anzahl erstellter Objekte zählt. Die Inkrementierung würde über den Konstruktor new mit realisiert werden. Dieser ist quasi ein Sonderfall einer Klassenmethode.

In deinem Quellcode setzt du eine Klasse für die Bäume ein, versuchst diese dann aber auf "klassische" Datentypen wie den Hash abzubilden. Jeder Knoten des Baumes ist aber ebenfalls ein Baum - wenn auch evtl. nur ein ganz kleiner. Deshalb ist es sinnvoll mit den Knoten als Objekten zu arbeiten. Jedes Objekt muss dann nur wissen, wie es auf seinen linken oder echten Ast zugreift, wobei die Methode schauen muss, ob der Ast mit einem weiteren Knoten verbunden ist, oder ein Wert repräsentiert.

Hier ist Rekursion der richtige Weg. Jedes Objekt kann das nächste bitten eine Methoden auf übergebene Werte anzuwenden. Evtl. helfen dir diese nicht direkt auf deinen Quellcode bezogenen Infos weiter. OOP ist etwas in das man sich schrittweise eindenken muss. Hat auch bei mir etwas länger gedauert, lohnt sich aber durchaus. Und es gibt immer noch neues zu entdecken.
ASDS
 2007-04-17 22:06
#75890 #75890
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Hallo Ronnie,
dein Beitrag ist bestimmt lieb gemeint hilft mir aber nur bedingt bei meinem Problem... mir is jetzt gerade vielleicht ein fehler aufgefallen. Allerdings.. hab ich jetzt wieder syntaxfehler drinnen...
Ich bitte hier um hilfe, sonst verzweifel ich jetzt schon langsam


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
sub newtree {
######################
# Erstellen des Trees

my $ref_liste1 = shift;
my $knoten = undef;
my $ref_wurzel = undef;


for my $zzahl (@$ref_liste1){
# my $refvalue = $ref_wurzel;
if ($knoten)
{ while (1) {
############################
#Beginn des Vergleichs


if($zzahl < $$knoten{'zahl'}) {

if(defined($$knoten{'linksweg'}))

{

$knoten = $$knoten{'linksweg'};

}

else {

$$knoten{'linksweg'} = knot($zzahl);

$knoten = $ref_wurzel;

last; #Ende
}

}

#wenns Links nicht mehr weiter geht, geh rechts weiter


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

if(defined($$knoten{'rechtsweg'}))

{

$knoten =$$knoten{'rechtsweg'};
}

else {

$$knoten{'rechtsweg'} = knot($zzahl);

$konten = $ref_wurzel;

last;

}
else {
$ref_wurzel= knot($zzahl);
$knoten = $ref_wurzel;}
}

}
}

}
return($ref_wurzel);
}

warum schaut der code hier drinnen so doof aus, bei mir is der ur schön formatiert, liegt das am VI?\n\n

<!--EDIT|ASDS|1176833287-->
ASDS
 2007-04-17 23:01
#75891 #75891
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
so nein aus.... wenn ich bis morgen keine Lösung gefunden hab und ich find echt kein, weil ich hab jetzt schon ur viel ausprobiert mit der eingabe und so... dann kack ich drauf...ich will auch nicht mehr! DAnke für eure Hilfe
PerlProfi
 2007-04-17 23:09
#75892 #75892
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Wenn du uns noch die Fehlermeldungen verraten könntest und die Zeilen hervorheben würdest, wäre es einfacher dir zu helfen.

Ausserdem verstehe ich nicht ganz, wieso du Ronnies Hilfe ablehnst. Er hat dir am Anfang eine kleine Klasse geschrieben, die doch genau das tun soll, was du hier gerade versuchst, oder ?
Und er hat dir verraten, wie du deinen Baum praktisch aufbauen kannst, sodass du keine Probleme mit der Ausgabe, oder anderem bekommst.

Probier doch erstmal diese Klasse neu zu schreiben und dann kannst du sie ja noch erweitern, wenn du möchtest.

MfG
ASDS
 2007-04-17 23:20
#75893 #75893
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Ach ich lehn Ronnies hilfe doch nicht ab... aus der Darstellung hab ich mir eh rausgeholt, was ich brauchte oder verstanden habe...
die Fehlermeldung steht doch eh oben:
Use of uninitialized value in concatention <.> or string at Baum.pm line 100 <STDIN> line 10.

Wo der fehler is weiß ich doch eh schon, dank renee und zwar hier:
Code: (dl )
 print "$self->{'ref_wurzel'}->{'zahl'}\n";
und hier meinte er... dass es daran liegt, dass in meiner sub newtree etwas nicht passt... auch die kann ich gerne nochmal einstellen, so wie ich sie jetzt hab...
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
sub newtree {
######################
# Erstellen des Trees

my $ref_liste1 = shift;
my $knoten = undef;
my $ref_wurzel = undef;


for my $zzahl (@$ref_liste1){
# my $refvalue = $ref_wurzel;
if ($knoten)
{ while (1) {

if($zzahl < $$knoten{'zahl'}) { #Beginn des Vergleichs

if(defined($$knoten{'linksweg'}))

{

$knoten = $$knoten{'linksweg'};

}

else {

$knoten->{'linksweg'} = knot($zzahl);

$knoten = $ref_wurzel;

last; #Ende
}

}

#wenns Links nicht mehr weiter geht, geh rechts weiter


else { if ($zzahl >= $$knoten{'zahl'}) {
if(defined($knoten->{'rechtsweg'}))

{

$knoten =$$knoten{'rechtsweg'};
}

else {

$$knoten{'rechtsweg'} = knot($zzahl);

$knoten = $ref_wurzel;

last;

}

}


else {
$ref_wurzel= knot($zzahl);
$knoten = $ref_wurzel;}

}
}

}
return $ref_wurzel;
}


ich weiß schon irgendwo ist da ein fehler mit der übergabe der Zahlen..aber ich finds nicht. außerdem hab ich sie jetzt umgeschrieben:


Die Klasse Neu hab ich doch schon:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub new {
my $x = shift;
my $class = ref($x) || $x;
my @liste = @_;
my $ref_wurzel = newtree(\@liste);
my $self = {
wurzel => $ref_wurzel,
list => \@liste
};
bless ($self, $class);
return $self;
}
Ronnie
 2007-04-17 23:44
#75894 #75894
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
So, hier nochmal ein funktionierendes Beispiel für einen binären Baum in Perl-OOP (ohne Moose). Das entspricht inhaltlich meiner obigen Ausführung:
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

package BinTree;

sub new {
my $class = shift;
my $val = shift;
my $self = { val => $val, l => undef, r => undef };
bless $self, ref($class) || $class;
return $self;
}

sub set_l {
my $self = shift;
my $val = shift;

if (ref $self->{l}) {
$self->{l}->append($val);
} else {
$self->{l} = $self->new($val);
}
}

sub set_r {
my $self = shift;
my $val = shift;

if (ref $self->{r}) {
$self->{r}->append($val);
} else {
$self->{r} = $self->new($val);
}
}

sub to_s {
my $self = shift;
my $v = $self->{val};
my $l = ref $self->{l} ? $self->{l}->to_s : undef;
my $r = ref $self->{r} ? $self->{r}->to_s : undef;
return join ', ', grep defined, ($l, $v, $r);
}

sub append {
my $self = shift;
my @vals = @_;
while ( my $n = shift @vals ) {
if ($n < $self->{val}) { $self->set_l($n) }
elsif ($n > $self->{val}) { $self->set_r($n) }
}
}

package main;

my @list = (20, 4, 28, 9, 100, 12, 84, 10, 11);
my $tree = BinTree->new(shift @list);
$tree->append(@list);

print $tree->to_s . "\n" x 2;
print Dumper $tree;
ASDS
 2007-04-17 23:57
#75895 #75895
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
okay umgelegt auf meins würde meine Klasse Neu so lauten:
Code: (dl )
1
2
3
4
5
6
7
sub neu {
my $class = shift;
my $ref_wurzel = newtree(\@liste);
my $self = { val => $ref_wurzel, l => \@liste};
bless $self, ref($class) || $class;
return $self;
}
ODER?
das is die variante die du geschrieben hast
Code: (dl )
1
2
3
4
5
6
7
sub new {
my $class = shift;
my $val = shift;
my $self = { val => $val, l => undef, r => undef };
bless $self, ref($class) || $class;
return $self;
}
ASDS
 2007-04-18 00:00
#75896 #75896
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Schaut mal...
ich häng da hartnäckig n meinem beispiel, denn wenn ich es mit dem hinbekomm -auch mit eurer hilfe- dann kann ich es mir nachher in Ruhe durchdenken, und ich mach mir jedenmal Notizen in einem Worddoc wie was funktioniert. steht eh schon recht viel drinnen.
nur momentan... häng ich voll an der einen Methode eben, wo irgendwo ein übergabe fehler sein sollte.
<< |< 1 ... 7 8 9 10 11 12 13 ... 15 >| >> 150 Einträge, 15 Seiten



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