2017-10-16 13 views
3

J'ai travaillé sur l'utilisation d'une bibliothèque C à partir de R en écrivant des fonctions C personnalisées en utilisant la fonctionnalité de la bibliothèque, puis en accédant à ces fonctions C à partir de R à l'aide de l'interface. .Stockage de pointeurs sur des structures C dans R sous forme d'entiers

Dans certains codes C, j'alloue de l'espace pour certaines structures personnalisées et je veux leur stocker des pointeurs dans R afin que je puisse utiliser ces structures dans des appels successifs à .C. En jouant avec la fonction .C, j'ai remarqué que je peux simplement lancer le pointeur sur la structure C vers int et le stocker dans R comme un entier. Passer cet entier à des appels ultérieurs via .C fonctionne bien, je peux garder une trace de mes structures et les utiliser sans problèmes.

Ma question un peu naïve: quel est le problème avec le stockage de ces pointeurs dans des entiers dans R? Cela fonctionne bien, donc je suppose qu'il doit y avoir un inconvénient, mais je n'ai trouvé aucune information à ce sujet.

+0

Je ne suis pas familier avec R, mais lancer un pointeur sur 'int' ne peut que causer des problèmes car' sizeof (void *) 'pourrait être plus grand que' sizeof (int) '. Il y a 'intptr_t' pour ça. – DeiDei

Répondre

3

Les entiers de R sont de 32 bits, même sur une plate-forme 64 bits. Par conséquent, lorsque vous travaillez sur un système 64 bits, cela ne fonctionnera pas (les pointeurs seront 64 bits).

R possède des fonctionnalités pour cela. Voir the 'Writing R Extensions' manual, the section on 'External pointers and weak references'.

Si vous êtes prêt à passer en C++ (ce qui ne signifie pas que vous devez réécrire tout votre code), vous pouvez utiliser le package Rcpp qui facilite cela. Voir par exemple External pointers with Rcpp