Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8990[/thread]

Perlxs: array als eingabewerte und Rückgabewerte



<< >> 8 Einträge, 1 Seite
blaise4714
 2007-05-10 14:50
#76615 #76615
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo @lle,
nachdem ich viel über PerlXs gelesen habe, habe ich eine frage:
ich möchte eine funktion in Xs schreiben: als eingabe werte sollte ein array sein. Als Rückgabe auch eine Array:

mein Xs datei(code) ist folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include <stdio.h>
#include <string.h>
MODULE = Mytest PACKAGE = Mytest

AV*
hello(test)
AV* test;
CODE:
 RETVAL = newAV();
 sv_2mortal((SV*)RETVAL);
OUTPUT:
 RETVAL

kann jmd mir helfen?
vielen dank
murphy
 2007-05-10 18:46
#76616 #76616
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Deine Funktionshülle sieht soweit in Ordnung aus. Um das Rückgabearray mit Werten zu füllen, kannst Du zum Beispiel void av_push(AV *, SV *) verwenden und zum Auslesen der Daten im Eingabearray SV **av_fetch(AV *, I32, I32).

Die Dokumentation aller Perl-API-Funktionen findest Du in perlapi und ein Beispiel wie man ein Eingabearray zerlegt und ein Ausgabearray erzeugt wird auch in perlxstut beschrieben.
When C++ is your hammer, every problem looks like your thumb.
blaise4714
 2007-05-11 16:40
#76617 #76617
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielen dank Murphy!
Nachdem ich die dokumente gelesen habe, ist es mir trotzdem nicht klar..
Laut perlstut, ist mein funktion richtig. Aber bei compilieren habe ich immer als fehlern:
"segmentation fault" oder
"ARRAY(0x5053d0)"
...
hast du ein dummy beispiel?
danke
murphy
 2007-05-11 19:03
#76618 #76618
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe schon lange keinen XS-Code mehr geschrieben, daher kann ich Dir kein Beispiel aus dem Ärmel schütteln.

Wenn bei Deinem Programm irgendwo ARRAY(...) angezeigt wird, dann ist das aber doch gut. Offensichtlich liegt an dieser Stelle eine Arrayreferenz vor -- und die Funktion, die Du schreiben möchtest, erhält ja nun als Parameter eine Arrayreferenz und gibt auch wieder eine zurück.

Wenn irgendwo eine Speicherschutzverletzung auftritt, so ist der wahrscheinlichste Grund der, dass Du in deinem XS-Code irgendwo Perl einen NULL-Pointer vorgesetzt hast. Ohne Glaskugel und den Quellcode kann ich Dir da nicht weiterhelfen. Wirf halt den gdb an und schaue nach, wo der Fehler auftritt...
When C++ is your hammer, every problem looks like your thumb.
murphy
 2007-05-11 19:39
#76619 #76619
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe nochmal kurz die Dokumentation aufgeschlagen und eine Beispielfunktion gebastelt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
AV *frobnicate(AV *foo)
INIT:
int i;

CODE:
RETVAL = newAV();
sv_2mortal((SV *)RETVAL);

for (i = 0; i < av_len(foo); i += 2) {
SV **cell = av_fetch(foo, i, 0);
if (cell && *cell)
av_push(RETVAL, SvREFCNT_inc(*cell));
}

OUTPUT:
RETVAL


Diese unglaublich sinnvolle Funktion liest aus der ihr übergebenen Arrayreferenz jedes zweite Element aus und hängt es an eine neue Arrayreferenz an, die sie erstellt und zurückgibt.
When C++ is your hammer, every problem looks like your thumb.
blaise4714
 2007-05-14 15:53
#76620 #76620
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielen Dank Murphy!
ich habe eben dein code ausprobiert! aber es ging nicht:
test.pl:
se ExtUtils::testlib;
use Mytest;
@tester = ("Manch", "Mal","test");
$test = Mytest::frobnicate(@tester);
print "@test\n";


Fehlermeldung:Usage: Mytest::frobnicate(foo) at test.pl\n\n

<!--EDIT|blaise4714|1179143743-->
PerlProfi
 2007-05-14 16:39
#76621 #76621
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Musst du nicht ein Arrayreferenz an frobnicate() übergeben, du übergibst in deinem Beispiel aber 3 Skalare.
Also einfach einen \ ( Backslash ) vor @tester:
Code: (dl )
$test = Mytest::frobnicate(\@tester);


MfG
blaise4714
 2007-05-14 17:16
#76622 #76622
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
thanks PerlProfi!
wenn ich so schreibt wie du sagt, so habe dann als ausgabe:
ARRAY(0x5053d0)
Mfg
<< >> 8 Einträge, 1 Seite



View all threads created 2007-05-10 14:50.