Bonjour,
J'ai un problème avec le langage R, adapté de S et SPLUS, je crois.
J'obtiens une erreur de segmentation (segmentation fault) en passant un argument de type character à un appel à une fonction C compilée dans un shared object (.so) par .C et chargé dans R par dyn.load()
D'après la doc, les arguments character correspondent à des pointeurs de type char ** en C.
1. quelle est la forme de l'allocation du pointeur char **s faite par R? Un seul bloc de dimension n*LEN (n: nombre d'éléments de mon vecteur character et LEN, la taille supposée d'un élément) ou un pointeur dynamique (style C) où les n blocs sont non contigus?
2. dans le cas où R alloue un bloc unique n*LEN, quelle est la valeur de LEN? 255, comme la doc semble le dire pour Fortran (en Fortran, il faut utiliser un argument character*255) ou pas?
3. Comment utiliser le i-ème élément de mon vecteur (appelons-le s en C) : s[i] ou (*s)+LEN*i (avec LEN=255?) ou autre chose?
Les réponses à 2 et 3 dépendent fortement de 1., alors c'est bien la Q 1 qui est fondamentale.
Un petit exemple (suivant la taille de n ou des éléments de s (100 ici), ça plante) :
Programme R :
n = 50
cat("R call to litchar\n")
dyn.load("lit.so")
ret = .C("litchar",noms=character(n),as.integer(n))
---
Code C :
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void litchar(char **s,int *n)
{
int i, j, c;
for (i=0;i<*n;i++) {
sprintf(s[i],"%6d ",i); /* écrit 'i' dans s' i-eme element... */
c = 'a' + (i % 26); /* c est la i-eme lettre de l'alphabet */
for (j=7 ; j<100 ; j++) s[i][j] = c; /* ... ajoute à s[i] des aaaaa, des bbbbb, etc. */
s[i][j] = 0; /* terminateur C */
fprintf(stderr,"s[%6d] : \"%s\" (%p)\n",i,s[i], s[i]); /* écrit i, l'elementi de s et son adresse */
}
}
Merci à tous.
HP