Font
[thread]10894[/thread]

Probleme mit Perl XS

Tags: Similar Threads

Readers: 7


<< >> 8 entries, 1 page
MechaTikal
 2007-11-26 12:24
#103000 #103000
User since
2007-10-10
20 articles
BenutzerIn
[default_avatar]
Ich bin mir nicht sicher, in welchen Bereich meine Frage kommt, aber meiner Meinung nach passt sie besser hier rein.
Es geht um Perl XS. Ich habe zum Selbststudium das Buch Extended and Embedded Perl bekommen und arbeite das durch, habe aber das Gefühl, manche Beispiele funktionieren nicht.
In meiner XS-Datei steht folgende Funktion:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char *
strconcat(str1, str2, outstr)
char* str1
char* str2
char* outstr = NO_INIT
PREINIT:
STRLEN length;
CODE:
length = strlen(str1) + strlen (str2) +1;
New(0, outstr, length, char);
RETVAL = strconcat(str1, str2, outstr);
OUTPUT:
outstr
RETVAL
CLEANUP:
Safefree( outstr );


Wenn ich jetzt mit "make" neu kompiliere und das Skript laufen lasse, erhalte ich den Fehler:
Code: (dl )
/usr/bin/perl: symbol lookup error: /home/Michaela/Perl XS/Mytest/blib/arch/auto/Mytest/Mytest.so: undefined symbol: strconcat
und die Warnung:
Code: (dl )
1
2
3
Mytest.xs: In Funktion »XS_Mytest_strconcat«:
Mytest.xs:45: Warnung: Implizite Deklaration der Funktion »strconcat«
Mytest.xs:45: Warnung: Zuweisung erzeugt Zeiger von Ganzzahl ohne Typkonvertierung

Kennt die Datei strconcat nicht oder was soll das Problem sein? <string.h> ist eingebunden, andere Funktionen wie simples Multiplizieren klappen aber.
shigetsu
 2007-11-26 17:12
#103069 #103069
User since
2007-04-22
16 articles
BenutzerIn
[Homepage] [default_avatar]
Kann es sein, dass du ev.
Code: (dl )
strcat() / strncat()
meinst?

Desweiteren, hast du die nötigen Perl-eigene Header Includes?
MechaTikal
 2007-11-27 11:53
#103100 #103100
User since
2007-10-10
20 articles
BenutzerIn
[default_avatar]
Nein, ich meine strconcat, wie es im Buch beschrieben ist. Ich habe alles Zeichen für Zeichen abgetippt.
Perldatei sieht folgendermaßen aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/bin/perl

use ExtUtils::testlib;
use Mytest;         #hiermit wird Mytest.pm geladen

Mytest::print_hello_retval();  #Laden einer Funktion aus Mytest.xs
print "Three times 32 is ", Mytest::treble(32), "\n";
my $testwert = neue_funktion();
print "Testwert: $testwert\n";
my $str1 = "Das ist";
my $str2 = "ein Test";
my $outstr;
my $len = Mytest::strconcat($str1, $str2, $outstr);
print "$len\n";

sub neue_funktion {
        my $wert = 6;
        print "6+22*5-10/2 wird berechnet...\n";
        my $rueckgabewert = Mytest::berechne($wert);

        return $rueckgabewert;
}

XS siehe oben. Die restlichen Funktionen klappen, nur eben dieses strconcat nicht.

Mich ärgert es jedesmal, wenn ich ein Beispiel abtippe, um zu sehen was passiert, und nicht einmal das klappt. Dann frage ich mich: Hat sich der Autor geirrt oder bin ich zu blöd, ein paar Zeilen fehlerfrei abzuschreiben?
renee
 2007-11-27 12:02
#103101 #103101
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Zeig mal bitte den ganzen XS-Code... und die MyTest.pm.
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/
MechaTikal
 2007-11-27 12:14
#103102 #103102
User since
2007-10-10
20 articles
BenutzerIn
[default_avatar]
Mytest.pm:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package Mytest;

use 5.008008;
#use strict;
use warnings;
use Errno;
use AutoLoader;
use Carp;

require Exporter;
our @ISA = qw(Exporter);

our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
#Buch: our @EXPORT_OK = qw/ myfunc /;
our @EXPORT = qw(

);

our $VERSION = '0.01';

require XSLoader;
XSLoader::load('Mytest', $VERSION);

#im Buch so beschrieben, klappt aber nicht
sub myfunc {
my $arg = shift;
return $arg;
}

sub AUTOLOAD {
my $sub = $AUTOLOAD;
(my $constname = $sub) =~ s/.*:://;
my $val =constant($constname);
if ($! != 0) {
if ($! =~ /Invalid/ || $!{EINVAL}) {
$AutoLoader::AUTOLOAD = $sub;
goto &AutoLoader::AUTOLOAD;

}
else {
croak "Your vendor has not defined constant $constname";
}
no strict 'refs';
*$sub = sub () { $val };

}
goto &$sub;

}


1;

__END__
# Below is stub documentation for your module. You'd better edit it!


Mytest.XS:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <stdio.h>
#include "ppport.h"
#include <string.h>

MODULE = Mytest PACKAGE = Mytest

int
print_hello_retval()
CODE:
RETVAL = printf("Hello, world!");
OUTPUT:
RETVAL

int
treble(x)
int x
CODE:
RETVAL = 3*x;
OUTPUT:
RETVAL

int
berechne(y)
int y
CODE:
RETVAL = y+22*5-10/2;
OUTPUT:
RETVAL

char *
strconcat(str1, str2, outstr)
char* str1
char* str2
char* outstr = NO_INIT
PREINIT:
STRLEN length;
CODE:
length = strlen(str1) + strlen (str2) +1;
New(0, outstr, length, char);
RETVAL = strconcat(str1, str2, outstr);
OUTPUT:
outstr
RETVAL
CLEANUP:
Safefree( outstr );
murphy
 2007-11-27 16:41
#103151 #103151
User since
2004-07-19
1776 articles
HausmeisterIn
[Homepage]
user image
MechaTikal+2007-11-27 10:53:46--
Nein, ich meine strconcat, wie es im Buch beschrieben ist. Ich habe alles Zeichen für Zeichen abgetippt.
[...]


strconcat als C-Funktion wird halt nirgends deklariert, geschweige denn definiert. Folglich schmeißt Dir der Compiler eine Warnung raus und der dynamische Linker einen Fehler.

Ich denke auch, dass Du vermutlich etwas wie strncat oder strlcat zusammen mit malloc aus der C-Bibliothek verwenden willst.
When C++ is your hammer, every problem looks like your thumb.
MechaTikal
 2007-11-27 17:03
#103163 #103163
User since
2007-10-10
20 articles
BenutzerIn
[default_avatar]
murphy+2007-11-27 15:41:37--
MechaTikal+2007-11-27 10:53:46--
Nein, ich meine strconcat, wie es im Buch beschrieben ist. Ich habe alles Zeichen für Zeichen abgetippt.
[...]


strconcat als C-Funktion wird halt nirgends deklariert, geschweige denn definiert. Folglich schmeißt Dir der Compiler eine Warnung raus und der dynamische Linker einen Fehler.

Ich denke auch, dass Du vermutlich etwas wie strncat oder strlcat zusammen mit malloc aus der C-Bibliothek verwenden willst.

strncat funktioniert tatsächlich halbwegs, abgesehen von der Meldung
Code: (dl )
1
2
Mytest.xs:46: Warnung: Übergabe des Arguments 3 von »__builtin___strncat_chk«  erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
Mytest.xs:46: Warnung: Übergabe des Arguments 3 von »__strncat_ichk« erzeugt Ganzzahl von Zeiger ohne Typkonvertierung
beim Ausführen von make.
Da stell ich mir trotzdem noch die Frage, warum es im Buch mehrfach strconcat heisst?! Ich meine, ich habe bis jetzt kaum Ahnung von XS und bei C war ich auch keine Schlaubergerin, aber wenn ich ein Buch durcharbeite, kann ich doch erwarten, dass die Beispiele fehlerfrei sind, oder ist das eine Milchmädchenrechnung?
murphy
 2007-11-27 20:52
#103188 #103188
User since
2004-07-19
1776 articles
HausmeisterIn
[Homepage]
user image
Vielleicht ist das Beispiel ja gar nicht zur direkten Ausführung bestimmt.

Einfach strncat statt strconcat hinzuschreiben ist aber keine Lösung. Wie Dir auch Dein Kompiler mitteilt, stimmt da schon die Signatur des Aufrufes nicht!

Korrekt wäre zum Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
[...]
CODE:
length = strlen(str1) + strlen (str2) + 1;
Newxz(outstr, length, char);
strlcat(outstr, str1, length);
strlcat(outstr, str2, length);
RETVAL = outstr;
[...]


Falls Deine C-Bibliothek kein strlcat hat, ist sie schlecht ;-) Man kann das ganze auch mit strncat schreiben, das ist bloß hässlicher.
When C++ is your hammer, every problem looks like your thumb.
<< >> 8 entries, 1 page



View all threads created 2007-11-26 12:24.