perl xs - Gibt ein Perl-Array aus dem c-Array zurück

8

Mit XS versuche ich, Werte von einem C-Array in ein Perl-Array zu übergeben, das im Skript verwendet werden kann.

Hier ist der Code aus meiner xs-Datei:

%Vor%

Es kompiliert gut, aber wenn ich folgendes in Perl ausführe:

%Vor%

Es druckt nur ARRAY(0x1408cdc) , wenn ich erwarte, dass es eine Liste von Zahlen ausgibt.

Wie kann ich meinen Code so ändern, dass er ein Perl-Array korrekt zurückgibt?

    
ikegami 12.10.2017, 21:19
quelle

1 Antwort

9

Perl Subs können nur (0 oder mehr) Skalare zurückgeben. Wenn Sie versuchten, ein Array zurückzugeben (unmöglich, ohne Perl zu crashen!), Lieferte die typemap-Standard-Map stattdessen einen Verweis auf dieses Array.

Beachten Sie, dass Ihr Programm auch Speicher verliert (weil die Standardtypemap für AV* Ihr Array mortalisieren sollte, aber nicht).

Zurückgeben einer Referenz, Methode 1

%Vor%

Speicherleckprüfung:

  • Array's refcnt: 1 ( newAV ) -1 [verzögert] ( sv_2mortal ) +1 ( newRV ) = 1 [verzögert] (im Besitz von durch Bezugnahme)
  • Referenz refcnt: 1 ( newRV ) -1 [verzögert] ( sv_2mortal ) = 0 [verzögert]

Perl:

%Vor%

Zurückgeben einer Referenz, Methode 2

%Vor%

Speicherleckprüfung:

  • Array's refcnt: 1 ( newAV ) +0 ( newRV_noinc ) = 1 (gehört zur Referenz)
  • Referenz refcnt: 1 ( newRV_noinc ) -1 [verzögert] ( sv_2mortal ) = 0 [verzögert]

Perl: & lt; wie oben & gt;

Zurückgeben einer Referenz, Methode 3

%Vor%

Speicherleckprüfung:

  • Array's refcnt: 1 ( newAV ) +0 ( newRV_noinc ) = 1 (gehört zur Referenz)
  • Referenz refcnt: 1 ( newRV_noinc ) -1 [verzögert] ( mXPUSHs ) = 0 [verzögert]

Perl: & lt; wie oben & gt;

Skalare zurückgeben

Wir müssen den Kontext überprüfen, weil wir nicht mehr als einen Skalar außerhalb des Listenkontexts auf dem Stapel platzieren können.

%Vor%

Perl:

%Vor%

Hinweis: Das Refcnt-Dekrement um sv_2mortal wird verzögert, bis der Aufrufer die Refcnt erhöhen kann.

    
ikegami 12.10.2017, 21:48
quelle

Tags und Links