Schrift
[thread]11529[/thread]

Refernz übergabe in ein Objekt

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-03-27 14:18
#107541 #107541
Hallo miteinander,

ich habe ein Problem mit der Übergabe einer Referenz in eine Methode einer anderen Klasse.

Folgendes:

Code (perl): (dl )
1
2
print $ref;
$strategy->execute( $trace, $save, $time, $ref );


In dem Objekt in der Funktion execute sieht dies dann wie folgt aus:
Code (perl): (dl )
1
2
3
4
5
6
7
               my $objekt=shift;
        my $trace=shift;
        my $save=shift;
        my $kill=shift; #time per 200px
        my $progress=${(shift)};
               print $progress;
               print \$progress;


Mein Problem ist jetzt, dass in $ref eine andere Adresse steht als in \$progress.

Und somit hat eine Änderung in der Funktion execute keine Auswirkung auf die eignetliche Variable.....

Ich vermute ich übergebe irgnedwie nur eine Kopie.

Hat jemand eine Idee oder eine Vorschlag was ich falsch mache?

schonmal danke für die Antworten


edit pq: code-tags hinzugefügt
renee
 2008-03-27 14:25
#107542 #107542
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du dereferenzierst mit my $progress=${(shift)}; und erstellst damit eine Kopie.
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/
Gast Gast
 2008-03-27 14:30
#107544 #107544
Hi,

habe jetzt direkt $progress=shift genommen, problem ist aber gleich.

$ref=SCALAR(0x3573b8c)

$progress=SCALAR(0x2dd91b4)

danke für die schnelle Antwort, hast du ev. noch neh andere idee.
renee
 2008-03-27 14:32
#107545 #107545
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie und wo machst Du die Ausgaben?
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/
Gast Gast
 2008-03-27 15:03
#107547 #107547
Ok ich muss glaub etwas weiter ausholen,

Hauptprogramm:


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                $progress=50;
                $ref=\$progress;
                
        print $trace;
        print $save;

        print $ref; #Ausgabe 1

                

        $t = new threads \&actualize;
        $strategy->execute( $trace, $save, $time, $ref );
        print " Progress main $progress \n";# Ausgabe 2

        print " Ref main $ref \n"; # Ausgabe 3



        $mw->waitVariable( \$finish );


In der funktion execute im Objekt $strategy:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
                my $objekt=shift;
        my $trace=shift;
        my $save=shift;
        my $kill=shift; #time per 200px
        my $progress=shift;
        my $var=$$progress;

                print $progress; #Ausgabe 4
        print $var;
                
                $var=30;

Im Thread actualize Poll ich die Variable $progress und $ref um eine fortschrittsbalken je nach dem wie weit die Funktion execute ist anzuzeigen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
                                        while($progress<100){
                        $bar->value($progress);
                        sleep(1);       
                        print $progress; #Ausgabe 5
                        print \$progress; #Ausgabe 6
                        print $ref; #Ausgabe 7
                       }
                       $finish=1;


So nun endlich zum Ergebniss *g*:

Code (perl): (dl )
1
2
3
4
5
6
7
Ausgabe1:SCALAR(0x2ddb1d4)
Ausgabe2: Progress main 50 
Ausgabe3:Ref main SCALAR(0x2ddb1d4)
Ausgabe4:SCALAR(0x2ddb1d4)
Ausgabe5:50
Ausgabe6:SCALAR(0x70eb094)
Ausgabe7:SCALAR(0x70eb094)


Problem ist nun erstens das im Hauptprogramm $progress immer noch 50 ist obwohl in der Funktion execute auf 30 gesetzt wird.

Zweites Problem ist, dass in dem Thread die referenz $ref(bzw. \$progress) eine andere Adresse anzeigt.

Hoffe so ist ersichtlicher was bei mir nicht funktioniert.

edit pq: code-tags hinzugefügt
pq
 2008-03-27 15:25
#107549 #107549
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte benutze in zukunft code-tags.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Gast Gast
 2008-03-27 15:27
#107550 #107550
Jo sorry hab ich nicht dran gedacht.
renee
 2008-03-27 15:35
#107551 #107551
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du setzt $var auf "30" und das ist nur eine Kopie von dem ursprünglichen $progress. Wenn, dann musst Du statt dem $var = 30; ein $$progress = 30; machen.

Bei Threads ist das Ganze sowieso wieder etwas komplexer, weil da die Daten nicht zwischen den Threads geteilt werden, wenn Du sie nicht mit threads::shared explitzit teilst.
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/
Gast Gast
 2008-03-27 16:16
#107556 #107556
Cool jetzt klappt es mit den 30...

danke

Des mit den threads:shared hab ich mir gerade mal durchgelesen.

Hoffe ich krieg es hin.

Danke soweit mal für die freundliche und schnelle Unterstützung.
<< >> 9 Einträge, 1 Seite



View all threads created 2008-03-27 14:18.