Ошибка Rcpp: статическое утверждение не удалось: невозможно преобразовать тип в SEXP, почему? - PullRequest
2 голосов
/ 03 октября 2019

Ошибка

Я не могу понять, почему у меня возникает эта ошибка компиляции с использованием Rcpp (версия 1.0.2):

Из файла /home/rmagno/R/x86_64-pc-linux-gnu-library/3.6/Rcpp/include/Rcpp/internal/wrap.h:

Line 523 static assertion failed: cannot convert type to SEXP

enter image description here

Источник ошибки

Я пытаюсь обернуть эту функцию C glfwSetKeyCallback из библиотеки GLFW.

И я знаю, что ошибка как-то проистекает из исходного файла CPP ниже, но я не понимаю, что я делаю неправильно:

glfw_types.h

#ifndef RCPP_GLFW_TYPES_H
#define RCPP_GLFW_TYPES_H

#include <Rcpp.h>
#include <GLFW/glfw3.h>

// https://stackoverflow.com/questions/41210595/s4-object-with-a-pointer-to-a-c-struct

typedef Rcpp::XPtr<GLFWwindow, Rcpp::PreserveStorage, glfwDestroyWindow> GLFWwindow_ptr;

#endif

glfw_set_key_callback.cpp

#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(window, key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}

EDIT

Исходный код, который компилирует функцию glfw_destroy_window и экспортирует ее как glfwDestroyWindow, использует тип GLFWwindow_ptr, компилирует и работает из R простоотлично.

glfwDestroyWindow.cpp

#include "glfw_types.h"
using namespace Rcpp;

//' @export
// [[Rcpp::export("glfwDestroyWindow")]]
void glfw_destroy_window(GLFWwindow_ptr window) {
  glfwDestroyWindow((GLFWwindow*)window);
  R_ClearExternalPtr(window);
}

РЕДАКТИРОВАТЬ 2

Эта функция также отлично работает:

#include "glfw_types.h"
using namespace Rcpp;

//' @export
// [[Rcpp::export("glfwCreateWindow")]]
GLFWwindow_ptr glfw_create_window(int width, int height, std::string title) {
  const char *title_c = title.c_str();
  return GLFWwindow_ptr(glfwCreateWindow(width, height, title_c, NULL, NULL), true);
}

РЕДАКТИРОВАТЬ 3

Кажется, это работает ...

Новый glfw_set_key_callback.cpp

#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(GLFWwindow_ptr(window, true), key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 04 октября 2019
#include "glfw_types.h"
using namespace Rcpp;

namespace {
  std::unique_ptr<Rcpp::Function> key_callback_func_ptr;
}

void glfw_set_key_callback_wrapper(GLFWwindow* window, int key, int scancode, int action, int modes)
{
  (*key_callback_func_ptr)(GLFWwindow_ptr(window, false), key, scancode, action, modes);
}

// [[Rcpp::export]]
void glfw_set_key_callback(GLFWwindow_ptr window, Rcpp::Function key_callback) {

  key_callback_func_ptr = std::make_unique<Rcpp::Function>(key_callback);
  glfwSetKeyCallback((GLFWwindow*)window, (GLFWkeyfun) glfw_set_key_callback_wrapper);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...