J'ai un fichier SWIG pour faire beaucoup de liaisons pour les langues. Il y a une variable dans la source C, qui est une liste de longueur fixe, avec un type entier. Quand j'y accède en Perl, il n'y a pas d'éléments - montre simplement que c'est un ARRAY.SWIG typedef - Perl array
Même problème était en Python, mais je ne pouvais fixe avec un typemap SWIG:
#ifdef SWIGPYTHON
%typemap(out) int [ANY] {
...
Ok, I'ld aiment à le faire à nouveau avec Perl - mais je ne suis pas un expert en Perl, Je peux corriger ce typemap pour Perl. Voilà ce que je cherche:
#ifdef SWIGPERL
%typemap(out) int [ANY] {
SV* sv = newSV(0);
AV* av = (AV *)sv_2mortal((SV *)newAV());
int i = 0,len = 0;
printf("len: %d\n", $1_dim0);
len = $1_dim0;
for (i = 0; i < len ; i++) {
SV* perlval = newSV(0);
sv_setiv(perlval, (IV)$1[i]);
av_push(av, perlval);
}
SvSetSV($result, newRV_noinc((SV *)av));
}
#endif
Le script Perl me montre le "len: 10", quand il fonctionne, mais le tableau est vide:
$i=1;
foreach(@m) {
print $i, "'", $_, "'\n";
$i=$i+1;
}
le résultat est:
0 ''
Qu'est-ce qui me manque?
Merci,
a.
EDIT: voici le script Perl:
#!/usr/bin/perl
use example1;
# this function set up the built-in list in example1 module
example1::get_att(7);
my @m = $example1::m->{ilist};
# "m" is a C structure in C source, and it has an "int ilist[10];" member.
# get_att(int n) will fill this list with "n" number
# This will be accesable in binded lanugage (eg in Python) as like this:
# print m.ilist -> [0, 3, 6, 9, 12, 15, 18, 0, 0, 0]
$i = 0;
foreach(@m) {
print $i, "'", $_, "'\n";
$i=$i+1;
}
Maintenant, ce script produit ce résultat:
len: 10
0''
Le "len: 10" sortie est venu de SWIG typedef - voir "printf (" len:% d ... "line ...
J'ai terminé la post - voir la partie "EDIT". De quoi avez-vous besoin encore plus? – airween
[Croisé] (http: //www.perlmonks.org /? node_id = 1164929). – choroba
Oui, c'est crossposted - y a-t-il une liste de forums/listes de diffusion, cela dépend de Stackoverflow, et sera marqué comme crosspost? Je pensais que le SO et Perlmonks sont deux endroits différents. En tout cas, je m'excuse pour crosspost, désolé. – airween