Rcpp error: static assertion failed: cannot convert type to SEXP, why?
Rcpp error: static assertion failed: cannot convert type to SEXP, why?
错误
我不明白为什么我在使用 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
错误来源
我正在尝试从 GLFW 库中包装这个 C 函数 glfwSetKeyCallback。
而且我知道错误是从下面的 CPP 源文件中以某种方式产生的,但我不明白我做错了什么:
glfw_types.h
#ifndef RCPP_GLFW_TYPES_H
#define RCPP_GLFW_TYPES_H
#include <Rcpp.h>
#include <GLFW/glfw3.h>
//
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);
}
编辑
下面编译函数 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);
}
非常感谢任何帮助!
#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);
}
错误
我不明白为什么我在使用 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
错误来源
我正在尝试从 GLFW 库中包装这个 C 函数 glfwSetKeyCallback。
而且我知道错误是从下面的 CPP 源文件中以某种方式产生的,但我不明白我做错了什么:
glfw_types.h
#ifndef RCPP_GLFW_TYPES_H
#define RCPP_GLFW_TYPES_H
#include <Rcpp.h>
#include <GLFW/glfw3.h>
//
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);
}
编辑
下面编译函数 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);
}
非常感谢任何帮助!
#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);
}