debugmeldung

debugmeldung

am 10.01.2007 09:19:30 von Frank Kulow

Hallo NG,

was sagt mir eigentlich die Meldung: "scalar context return from
main::DMA2:"?

Der Debugger hält mehrfach mit solchen Meldungen an, obwohl doch alle
Breakpoint gelöscht sind.



DB<10> B *
Deleting all breakpoints...
DB<11> r
scalar context return from main::DMA2: ' 571'
main::gui(subs2.pm:515): chomp($ergakt);#zeilenwechsel weg
DB<11>






Frank

Re: debugmeldung

am 10.01.2007 12:29:01 von Ferry Bolhar

Frank Kulow:

> was sagt mir eigentlich die Meldung: "scalar context return from
> main::DMA2:"?

Sie sagt, das die Funktion DMA2 einen Rückgabewert im skalaren
Context, dh. einen skalaren Wert oder eine Referenz, zurückgeliefert
hat, z.B:

my sub xxx {
....
return $value;
}

Hier wird der Wert der skalaren Variable $value zurückgeliefert,
d.h., der von der Funktion zurückgelieferte Context ist skalar. Zum
Unterschied von:

my sub xxx {
...
return ($value1,$value2);
}

Hier wird eine Liste von Werten zuürckgeliefet, d.h., der Context
der Funktion ist ein Listencontext.

Beachte, dass auch ein

return ($value);

Listencontext zurückliefert, auch wenn hier nur eine Liste mit einem
Element zurückgeliefert wird.

(Die Funktion wantarray sagt dir, in welchem Context eine Funktion
aufgerufen wird dh., welcher Rückgabecontext vom Aufrufer
erwartet wird).

Der "r"-Befehl des Debugger führt die gerade aufgerufene Funktion
fertig aus und gibt dann aus, welchen Context ("void" = kein Wert,
"scalar" = ein Wert, "list" = (meistens) mehrere Werte) sie zurück-
geliefert hat (in Perl 6 wird es noch viel mehr Contexte geben).
Das kann für das Debugging hilfreich sein, man kann es aber mit

o printRet=0

auch abschalten.

> Der Debugger hält mehrfach mit solchen Meldungen an, obwohl doch alle
> Breakpoint gelöscht sind.

Das hat nichts mit Breakpoints zu tun. Wenn du dich im Single-Step-Modus
befindest, wird jede Anweisung einzeln abgearbeitet, dann hält der Debugger
wieder an. Der "r"-Befehl sagt ihm lediglich, dass er den Rest der gerade
aktiven Funktion als "Single Step" ansehen soll. Daher führt der Debugger
die Funktion fertig aus und hält danach - mit jenem Befehl, der dem die
Funktion aufrufenden Befehl folgt - wieder an.

HTH & LG,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: debugmeldung

am 13.01.2007 20:33:38 von hjp-usenet2

On 2007-01-10 11:29, Ferry Bolhar wrote:
> Frank Kulow:
>> was sagt mir eigentlich die Meldung: "scalar context return from
>> main::DMA2:"?
>
> Sie sagt, das die Funktion DMA2 einen Rückgabewert im skalaren
> Context, dh. einen skalaren Wert oder eine Referenz, zurückgeliefert
> hat, z.B:
>
> my sub xxx {
> ....
> return $value;
> }
>
> Hier wird der Wert der skalaren Variable $value zurückgeliefert,
> d.h., der von der Funktion zurückgelieferte Context ist skalar.

Der Context kann m.W. nicht von der Funktion "zurückgeliefert" werden,
sondern wird zur Compilezeit für den Aufruf ermittelt. Je nach Context
liefert die Funktion dann entweder eine Liste oder einen Skalar zurück.

Vergleiche:

---8<------8<------8<------8<------8<------8<------8<------8<---
#!/usr/bin/perl
use warnings;
use strict;

sub foo {
if ($_[0] == 2) {
return (11, 12);
} else {
return 11;
}
}


my @x;
my $x;

@x = foo(1);
@x = foo(2);
$x = foo(1);
$x = foo(2);
--->8------>8------>8------>8------>8------>8------>8------> 8---

Wenn man das im Debugger durchgeht, bekommt man:

list context return from main::foo:
0 11

list context return from main::foo:
0 11
1 12

scalar context return from main::foo: 11

scalar context return from main::foo: 12


Das heißt, ob das ein Listen-Kontext oder ein skalarer Kontext ist,
hängt hier ausschließlich davon ab, ob das Ergebnis @x oder $x
zugewiesen wird, nicht davon, ob in der Funktion »return (11, 12)« oder
»return 11« ausgeführt wird.

hp


--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd

Re: debugmeldung

am 15.01.2007 08:15:16 von Ferry Bolhar

Peter J. Holzer:

> Das heißt, ob das ein Listen-Kontext oder ein skalarer Kontext ist,
> hängt hier ausschließlich davon ab, ob das Ergebnis @x oder $x
> zugewiesen wird, nicht davon, ob in der Funktion »return (11, 12)« oder
> »return 11« ausgeführt wird.

Ja, du hast recht. Das habe ich ungenau formuliert. Interessant kann
es allerdings dann werden, wenn der Code, in dessen "Context" eine
Funktion ausgewertet wird, erst zur Laufzeit zusammengebaut und
dann mittels eval (String-eval!) ausgewertet wird.

Erwähnenswert erscheint mir auch der Unterschied zwischen

$x = foo(...); und
($x) = foo(....);

Ersterer Befehl führt zu einem "scalar context return", letzterer zu
einem "list context return".

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: debugmeldung

am 15.01.2007 10:03:55 von Frank Seitz

Ferry Bolhar wrote:
> Peter J. Holzer:
>>
>>Das heißt, ob das ein Listen-Kontext oder ein skalarer Kontext ist,
>>hängt hier ausschließlich davon ab, ob das Ergebnis @x oder $x
>>zugewiesen wird, nicht davon, ob in der Funktion »return (11, 12)« oder
>>»return 11« ausgeführt wird.
>
> Ja, du hast recht. Das habe ich ungenau formuliert. Interessant kann
> es allerdings dann werden, wenn der Code, in dessen "Context" eine
> Funktion ausgewertet wird, erst zur Laufzeit zusammengebaut und
> dann mittels eval (String-eval!) ausgewertet wird.

Wieso? Auch dann ist der Kontext immer bekannt, behaupte ich mal.

> Erwähnenswert erscheint mir auch der Unterschied zwischen
>
> $x = foo(...); und
> ($x) = foo(....);
>
> Ersterer Befehl führt zu einem "scalar context return", letzterer zu
> einem "list context return".

Ja, klar, durch (...) wird schließlich ein List-Kontext forciert.
List-Kontext ist der Normalfall, Skalar-Kontext eher die Ausnahme.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel