Schrift
[thread]12888[/thread]

Konstruktor mit einer Hashliste die ein Array beinhaltet?

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
MGlutaeus
 2008-12-10 16:36
#117051 #117051
User since
2008-12-10
5 Artikel
BenutzerIn
[default_avatar]
Hallo, ich komm nicht weiter!

Vielleicht ein eher einfaches Problem, aber ich als Perl-Anfänger komm einfach nicht drauf...

Also mein Problem ist, einerseits dass ich ein Objekt in der "test.pl" Datei anlegen möchte, welches aus einer statischen Variable "instability", aus diversen übergebenen Werten in einer Hashlist (als das Objekt selbst) worin zusätzlich noch eine ArrayListe ist. Und dann sind noch kleinere Debugging Fehler auf die ich auch nicht draufkommen, evtl als Folgefehler?

Vielleicht kann mir ein Perl-Profi einen paar Tips geben?

test.pl

Code (perl): (dl )
1
2
3
4
5
use strict;
use ca;

$sandHeap = ca->new(5,1,20,'0.0','0','0.0');
print $sandHeap->{dim};



ca.pl

Code (perl): (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
package ca;
use strict;

our $instability=4;

# Konstruktor

      sub new {
         my $class = shift;
         my $self = {};
         my @neighbourCells = {};
         bless ($self, $class);
         foreach (qw/n iniTime finTime rndInit useNorth useDiagnoal/ ){
                $self->set($_ => shift);
         }
         $self->set(neighbourCells => [@neighbourCells]);
         $self->addCells();
         $self->addCellsNeighbors();

         return $self;
        }

# Methoden um Zellen zur Liste, und NachbarZellen der Zellen hinzuzufügen

         sub addCells{
          my $self = shift; my $rnd=0; my $i=0;
                for($i=1; $i<=($self->{dim})*($self->{dim}); $i++){
                        if($self->{rndInit}){ $rnd = rand($ca::instability-1); }
                       push($self->{cellList}, Cell->new($rnd));
                }
        }

         sub addCellsNeighbors {
          my $self = shift;
                foreach($self->{cellList}) {
                        $_->addNeighbors($self->{dim},$self->{useNorth},$self->{useDiagonal});
                }
        }


cell.pl

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cell;

use ca;
use strict;

        our $cellCount=0;

         #Konstruktor
      sub new {
         my $class = shift;
         my $self = {};
         my @neighbourCells = {};
         $cell::cellCount = $cell::cellCount + 1;
         my $index = $cell::cellCount;
         bless ($self, $class);
         foreach (qw/value/){ $self->set($_ => shift); }
                $self->set(valueAfter => 0);
                $self->set(index => shift);
                $self->set(neighbourCells => [@neighbourCells]);
         return $self;
        }


Ansich geht es um ein Konstrukt für eine Lawinen Simulation ...
renee
 2008-12-10 17:01
#117052 #117052
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein paar Fragen:

* was willst Du mit my @neighbourCells = {}; erreichen?
* Wo wird ein initialer Wert für $self->{dim} festgelegt?
* Wo wird die Methode set definiert?
* Warum heißt es einmal cell und einmal Cell?
* Warum machst Du hier eine Schleife? foreach (qw/value/){ $self->set($_ => shift); }

Du übergibst an den Konstruktor von Cell nur einen Parameter. Im Konstruktor selbst machst Du aber mehrmals ein shift.

Bei push($self->{cellList}, Cell->new($rnd)); Musst Du als ersten Parameter ein Array angeben. Da Du hier etwas im Hash speichern willst, musst Du das erst dereferenzieren: push(@{$self->{cellList}}, Cell->new($rnd));

Ich würde Dir raten, mal ein paar Debug-Ausgaben (einfach ein "print $message") einzubauen. Dann kannst Du schon besser abschätzen wo Dein Fehler liegen könnte.
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/
pktm
 2008-12-10 17:02
#117053 #117053
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

- Packagenamen bitte immer mit einem Großbuchstaben beginnen.
- Module enden immer mit einer 1;
- Nimm mal noch use warnings;
- Arrays werden mit runden Klammern definiert:
my @array = ():

du suchst wohl sowas (ungetestet):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub new {
my $class = shift;
my @values = @_; # den ganzen rest einlesen
my $self = bless({},$class);
$self->{'key'} = \@values;
}

# ... somewhere else
use Data::Dumper qw/Dumper/;
my $ca = CA->new(1,2,3);
print Dumper $ca->{key};


Du möchtest dir eventuell auch Class::Accessor ansehen.

Edit: noch zu renees Debug-Vorschlag: Data::Dumper gibt dir komplexe Datenstrukturen leserlich aus.
http://www.intergastro-service.de (mein erstes CMS :) )
Linuxer
 2008-12-10 17:13
#117054 #117054
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Moduldateien sollten auf ".pm" enden, nicht auf ".pl".
Wenn Du also eine Datei hast, die ein Package "Foobar" definieren soll, dann sollte die dazugehörige Datei "Foobar.pm" heissen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
MGlutaeus
 2008-12-10 20:50
#117064 #117064
User since
2008-12-10
5 Artikel
BenutzerIn
[default_avatar]
* was willst Du mit my @neighbourCells = {}; erreichen?

Also es geht hier genauergesagt um ein Beispiel der theoretischen Informatik.
Ein Gitter besitzt Zellen. Diese Zellen wissen welche Zellen ihre Nachbarn sind durch die @neighbourCells Liste. Jede Zelle hat einen Wert, sagen wir bei einer Lawine 1-3 und 4 wäre dann quasi zuviel und es entsteht eine Lawine. Aus 4 wird Null und alle Nachbarzellen der ehemaligen 4 bekommt nun +1 weil sich der Schnee darauf verteilt, ja so geht es dann weiter und dann hat man den Ablauf einer Lawine.

* Wo wird ein initialer Wert für $self->{dim} festgelegt?

Damit wollte ich testen ob ich irgendetwas, indemfall hier die Dimension für die Moore-Matrix-Methode wo ich nicht reingeschrieben habe aus Übersichtsgründen.

* Wo wird die Methode set definiert?

Gute Frage, ich dachte das wäre so eine Standart-Methode? Indemfall nicht.

* Warum heißt es einmal cell und einmal Cell?

Danke, hab ich nicht bemerkt. Sollte alles klein sein.

* Warum machst Du hier eine Schleife? foreach (qw/value/){ $self->set($_ => shift); }

Hab es von der CA (Cellular Automaton = Zellulärer Automat) abgeschrieben und weiss nicht wie man das kürzer macht.



Danke für eure Vorschläge bis jetzt! Alledings funktioniert es immer noch nicht hm... was kann den da noch nicht stimmen?
Gast Gast
 2008-12-10 20:59
#117065 #117065
Was spuckt er mit "warnings!" für Meldungen aus?
Gast Gast
 2008-12-10 21:03
#117066 #117066
Du machst in "ca" kein "use cell;" "cell->new();" kann nicht aufgerufen werden. "warnings" würde hier meckern.
MGlutaeus
 2008-12-10 22:10
#117067 #117067
User since
2008-12-10
5 Artikel
BenutzerIn
[default_avatar]
cell.pm did not return a true value at ca.pm line 3;

Der Fehler kommt, weil deswegen auch nichts mehr ausgeführt wird

@pktm
Danke aber wie müsste ich es den auf die
Konstruktoren von ca und cell umschreiben?
Habs probiert aber es wollte wohl nicht
Gast Gast
 2008-12-10 22:24
#117069 #117069
Das wurde dir schon gesagt.
die letzte Zeile eines Perlmoduls muß "1" allso True zurückliefern.
am einfachsten ist in die letzte Zeile "1;" zu schreiben.
Das signalisiert, das das Laden des Moduls erfolgreich wahr. wird 0, undef oder ein ähnlicher unwahrer Wert zurück geliefert, verwirft Perl das Modul, als nicht nutzbar.
Gast Gast
 2008-12-10 22:26
#117070 #117070
Code: (dl )
foreach (qw/value/){ $self->set($_ => shift); }

ist einfach
Code (perl): (dl )
$self->set(value=>shift(@_));
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-12-10 16:36.