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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
n = 50
 
cat("R call to litchar\n")
dyn.load("lit.so")
ret = .C("litchar",noms=character(n),as.integer(n))
---
Code C :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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.
Harold