substr als parameter in func. von swig
substr als parameter in func. von swig
am 22.06.2006 15:52:26 von kbsoft
wir benutzen perl mit swig. Ab perl wersion 5.8.0 (und je nach
kompilierung), funktioniert dieses einfache Programm nicht.
use sdget;
my @lnr =3D ();
my $i;
$lnr[0] =3D "71100+12345";
$lnr[1] =3D "71200+98765";
for($i=3D0;$i<2;$i++) {
sdget::get($i+100,substr($lnr[$i],0,5));
}
Die Funktion sdget::get ist eine C-Funktion, die int liefert und
einfach nur die übergebenen Parameter printet:
#include
int
sdget(int nr, char * value)
{
printf("SDGET:nr=3D%d, value=3D%s,
value(pointer)=3D%p\n",nr,value,value);
return(0);
}
wie man leicht dem Programm entnehmen kann, müsste die Ausgabe sein:
SDGET:nr=3D100, value=3D71100, value(pointer)=3D0x81433a8
SDGET:nr=3D101, value=3D71200, value(pointer)=3D0x81433a8
Leider ist es bei den akt. ausgelieferten Distributionen mit perl 5.8.0
..7 nicht
so und die Ausgabe sieht so aus:
SDGET:nr=3D100, value=3D71100, value(pointer)=3D0x81433a8
SDGET:nr=3D101, value=3D, value(pointer)=3D0x4002a3e8
Wie man sieht, misslingt der 2-te Aufruf von sdget, bzw. der Perl
übergibt an die c-funktion nur Müll.
Interessanterweise funktioniert das Ganze dann, wenn 'substr' nicht als
Parameter übergeben wird, sondern wenn man substraktion zuerst
durchführt und das Ergebniss dann an sdget::get übergibt, also z.B:
$x =3D substr($lnr[$i],0,5);
sdget::get($i+100,$x);
Weitere Erkenisse:
- es funktioniert, wenn man perl selber kompiliert (z.B. 5.8.0) , aber
ohne multithreading, debugging ...
- das fehlverhalten zeigt sich mit allen swig versionen
Die Fragen:
- wo soll man eher suchen , perl oder swig
- falls perl, welche möglichkeiten hat man, um z.B. den fehler näher
einzugrenzen, z.B. den perl zwischencode zu vergleichen. Gibt es
Quellen, wo die Internas von perl beschrieben werden
gruss jan
Re: substr als parameter in func. von swig
am 22.06.2006 16:14:55 von Mirco Wahab
Thus spoke kbsoft@gmx.de (on 2006-06-22 15:52):
> wir benutzen perl mit swig. Ab perl wersion 5.8.0 (und je nach
> kompilierung), funktioniert dieses einfache Programm nicht.
> ...
> Die Fragen:
> - wo soll man eher suchen , perl oder swig
> - falls perl, welche möglichkeiten hat man, um z.B. den fehler näher
> einzugrenzen, z.B. den perl zwischencode zu vergleichen. Gibt es
> Quellen, wo die Internas von perl beschrieben werden
Ich hab gerade mal probiert, hier
bei mir klappts (Inline C). Vielleicht
am Interface von Perl <==> SWIG?
use strict;
use warnings;
my @lnr = qw{ 71100+12345 71200+98765 };
print "$] $^O\n";
for my $i (0 .. 1) {
sdget( $i+100, substr($lnr[$i], 0, 5) );
}
use Inline C => <<'END_OF_C_CODE';
#include
int sdget(int nr, char * value)
{
printf("SDGET:nr=%d, value=%s, value(pointer)=%p\n",
nr, value, value);
return 0;
}
END_OF_C_CODE
==> Ausgabe:
5.008008 MSWin32
SDGET:nr=100, value=71100, value(pointer)=0182D56C
SDGET:nr=101, value=71200, value(pointer)=0182D56C
Viele Grüße
Mirco
Re: substr als parameter in func. von swig
am 22.06.2006 23:53:10 von Slaven Rezic
kbsoft@gmx.de writes:
> wir benutzen perl mit swig. Ab perl wersion 5.8.0 (und je nach
> kompilierung), funktioniert dieses einfache Programm nicht.
>
> use sdget;
> my @lnr = ();
> my $i;
>
> $lnr[0] = "71100+12345";
> $lnr[1] = "71200+98765";
> for($i=0;$i<2;$i++) {
> sdget::get($i+100,substr($lnr[$i],0,5));
> }
>
> Die Funktion sdget::get ist eine C-Funktion, die int liefert und
> einfach nur die übergebenen Parameter printet:
>
> #include
> int
> sdget(int nr, char * value)
> {
> printf("SDGET:nr=%d, value=%s,
> value(pointer)=%p\n",nr,value,value);
> return(0);
> }
>
> wie man leicht dem Programm entnehmen kann, müsste die Ausgabe sein:
>
> SDGET:nr=100, value=71100, value(pointer)=0x81433a8
> SDGET:nr=101, value=71200, value(pointer)=0x81433a8
>
> Leider ist es bei den akt. ausgelieferten Distributionen mit perl 5.8.0
> ..7 nicht
> so und die Ausgabe sieht so aus:
>
> SDGET:nr=100, value=71100, value(pointer)=0x81433a8
> SDGET:nr=101, value=, value(pointer)=0x4002a3e8
>
> Wie man sieht, misslingt der 2-te Aufruf von sdget, bzw. der Perl
> übergibt an die c-funktion nur Müll.
>
> Interessanterweise funktioniert das Ganze dann, wenn 'substr' nicht als
> Parameter übergeben wird, sondern wenn man substraktion zuerst
> durchführt und das Ergebniss dann an sdget::get übergibt, also z.B:
>
> $x = substr($lnr[$i],0,5);
> sdget::get($i+100,$x);
>
>
> Weitere Erkenisse:
> - es funktioniert, wenn man perl selber kompiliert (z.B. 5.8.0) , aber
> ohne multithreading, debugging ...
^^^^^^^^^^^^^^
> - das fehlverhalten zeigt sich mit allen swig versionen
>
> Die Fragen:
> - wo soll man eher suchen , perl oder swig
> - falls perl, welche möglichkeiten hat man, um z.B. den fehler näher
> einzugrenzen, z.B. den perl zwischencode zu vergleichen. Gibt es
> Quellen, wo die Internas von perl beschrieben werden
>
Ich würde auf das Threading tippen. Bei Perls mit Thread-Support
wird (fast) jede interne Perl-Funktionen mit einem zusätzlichen
Parameter aufgerufen, auch wenn "use threads" gar nicht verwendet
wird. Ich könnte mir vorstellen, dass swig damit noch nicht
zurechtkommt.
Wenn das tatsächlich der Fall ist und es keine neuere swig-Version
gibt, die dieses Problem behebt, dann solltest du vielleicht
überlegen, ob du nicht besser auf XS oder Inline::C umsteigst.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
sf-upload: make batch releases on SourceForge
http://sf-upload.sf.net
Re: substr als parameter in func. von swig
am 23.06.2006 09:18:39 von Ferry Bolhar
Jan:
> Weitere Erkenisse:
> - es funktioniert, wenn man perl selber kompiliert (z.B. 5.8.0) , aber
> ohne multithreading, debugging ...
> - das fehlverhalten zeigt sich mit allen swig versionen
Was hat "swig" damit zu tun? Du hast doch zunächst einmal nur eine
XS-Funktion, die mit zwei Argumenten aufgerufen wird und diese
einig wenig formatiert ausgibt.
> Die Fragen:
> - wo soll man eher suchen , perl oder swig
In Perl. Bzw. würde ich erstmal versuchen, eine einfache XS-Funktion
zu schreiben, die genau dasselbe wie die sdget() Funktion macht.
Ich habe bei mir probiert und es funktioniert problemlos (Perl 5.8.6,
Standard Red Hat Fedora 4 Distribution).
> falls perl, welche möglichkeiten hat man, um z.B. den fehler näher
> einzugrenzen, z.B. den perl zwischencode zu vergleichen. Gibt es
> Quellen, wo die Internas von perl beschrieben werden
perldoc perlapi
perldoc perlguts
perldoc perlintern
perldoc perlxs
perldoc perlxstut
Ist allerdings nichts für schwache Nerven!
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: substr als parameter in func. von swig
am 23.06.2006 09:33:11 von Ferry Bolhar
Slaven Rezic:
> Ich würde auf das Threading tippen. Bei Perls mit Thread-Support
> wird (fast) jede interne Perl-Funktionen mit einem zusätzlichen
> Parameter aufgerufen, auch wenn "use threads" gar nicht verwendet
> wird. Ich könnte mir vorstellen, dass swig damit noch nicht
> zurechtkommt.
Ja. Deswegen hätte ich ja gemeint, dass Jan erstmal auf mit seinem
Perl, wo das Problem auftritt, equivalenten XS-Code (direkt oder
mit Inline::C) schreibt und nachsieht, ob der Fehler hier auch auftritt.
In seinem Beispiel haben die Pointeradressen alle Werte, die mit
8 beginnen (übrigens auch bei mir), lediglich der letzte beginnt mit
4, liegt also in einem ganz anderen Bereich. Das läßt mich vermuten,
dass hier zwischem dem ersten und zweiten Aufruf von sdget() etwas
vom swig-Code überschrieben wird. Dadurch, dass er sdget() mit
reinem XS programmiert, kann er mal feststellen, ob der Fehler dort
auch auftritt (was ich nicht glaube).
Deine Annahme mit dem Threading halte ich für weniger wahr-
scheinlich, denn das mit dem zusätzlichen Argument wird von den
diversen Headerdateien für den Benutzer weitgehend transparent
abgehandelt und sollte, solange man sich nicht selbst in die Niederungen
der Thread-Programmierung wagt, keinen Unterschied machen (ich
selbst hatte nie Probleme, denselben XS-Code auf non-threaded und
threaded Perl-Versionen zu übersetzen und laufen zu lassen). Außer-
dem würde dann ja auch der erste Aufruf der Funktion nicht klappen.
> Wenn das tatsächlich der Fall ist und es keine neuere swig-Version
> gibt, die dieses Problem behebt, dann solltest du vielleicht
> überlegen, ob du nicht besser auf XS oder Inline::C umsteigst.
Ja. Bzw. sollte man sich den von swig generierten C-Code mal
näher ansehen. Ich persönlich bin ein großer Fan von Inline.
LG, Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at