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 C :
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)) ---
Merci à tous.
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 */ } }
Harold
Partager