IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Passer arguments character à C (par .C)


Sujet :

R

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Passer arguments character à C (par .C)
    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

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Trouvé!
    J'ai enfin la solution. Enfin, c'est plutôt bancal et pas très satisfaisant.

    On m'a aidé en me donnant un code semblable à ce que je voulais faire : utilisation de .Call au lieu de .C et utilisation de structures R de base SEXP pour allouer des choses et les retourner.

    J'ai aussi trouvé une réponse directe : il suffisait d'initialiser mon vecteur de character avec des chaînes non vides et ça ne plante plus. Si je comprends bien, R alloue un vecteur de character de la dimension demandée pour les éléments, mais ne prévoit pas d'espace de taille prédéfinie pour la valeur de ces éléments. En gros, R alloue un vecteur qui est en lecture seule ou en écriture, mais à condition de ne pas rallonger les chaînes de char. C'est dynamique, mais pas trop. Ils pourraient l'écrire quelque part, quand même!

    A bientôt.
    HP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2007, 12h40
  2. Réponses: 12
    Dernier message: 19/07/2006, 20h07
  3. Passer argument au singnal handler
    Par moniphal dans le forum C
    Réponses: 4
    Dernier message: 14/10/2005, 00h56
  4. [AS2] passer paramètre à un constructeur par attachMovie()
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 06/08/2005, 03h32
  5. Réponses: 10
    Dernier message: 03/03/2005, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo