8 entries, 1 page |
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 );
/usr/bin/perl: symbol lookup error: /home/Michaela/Perl XS/Mytest/blib/arch/auto/Mytest/Mytest.so: undefined symbol: strconcat
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
strcat() / strncat()
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; }
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!
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 );
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.
[...]
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.
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
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;
[...]
8 entries, 1 page |