Предоставление объекта C из внешней библиотеки C из C ++ в R и обратно с использованием Rcpp - PullRequest
1 голос
/ 30 сентября 2019

Это следующий вопрос: Предоставление структуры C с помощью Rcpp?

@ DirkEddelbuettel справедливо раскритиковал этот вышеупомянутый вопрос как слишком широкий по объему, поэтому я здесьпытаясь быть более точным в моих целях, предоставляя некоторый реальный код, иллюстрирующий мою попытку решить эту проблему.

Описание проблемы

Первое, что нужно : обратите внимание, что яиспользуйте (в некоторой степени, к сожалению, я изменю это в конце концов) два похожих имени в моем коде: GLuint и Gluint.

Я пытаюсь обернуть эту функциональность C OpenGL в R (взято отсюда: OpenGL Текстурные объекты и параметры ):

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);

Подход

Я использую Rcpp для достижения этих целей:

  1. Обеспечить способвыделение объекта Gluint из R;возможно, путем создания экземпляра объекта S4, который оборачивает объект C (GLuint tex) внутри?
  2. Затем, предоставьте R-функцию с именем gl_gen_textures, которая принимает целое число, и этот объект упоминается в 1. Внутренне этоФункция gl_gen_textures получает доступ к адресу памяти объекта GLuint C и передает его в glGenTextures (функция библиотеки C).
  3. В конечном итоге предоставляет способ уничтожения объекта Gluint, созданного в R, инаряду с этим внутренний GLuint C объект.

Фактический код

#include <Rcpp.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;


class Gluint {
public:
  Gluint() {}
  GLuint obj;
};

RCPP_MODULE(gluint_module) {
  class_<Gluint>("Gluint")
  .constructor()
  .field("obj", &Gluint::obj)
  ;
}

//' @export
// [[Rcpp::export]]
void gl_gen_textures(unsigned int n, Gluint& tex) {

  uint32_t _n;
  _n = (uint32_t) n; // Convert unsigned int to uint32_t.
  glGenTextures((GLsizei) _n, &(tex.obj));

}

Ошибки

В настоящее время этот код не компилируется. Я получаю следующие ошибки:

enter image description here

А вот фрагмент функции gl_gen_textures, сгенерированной в строках Rcpp :: Exports.cpp 136-146:

// gl_gen_textures
void gl_gen_textures(unsigned int n, Gluint& tex);
RcppExport SEXP _glfw_gl_gen_textures(SEXP nSEXP, SEXP texSEXP) {
BEGIN_RCPP
    Rcpp::RNGScope rcpp_rngScope_gen;
    Rcpp::traits::input_parameter< unsigned int >::type n(nSEXP);
    Rcpp::traits::input_parameter< Gluint& >::type tex(texSEXP);
    gl_gen_textures(n, tex);
    return R_NilValue;
END_RCPP
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...