gpt4 book ai didi

c - C : Consult SEXP PROTECT Stack Height 中的 R 扩展

转载 作者:太空狗 更新时间:2023-10-29 15:02:03 27 4
gpt4 key购买 nike

我正在使用 .Call 接口(interface)编写 R 扩展,我正在尝试追踪堆栈不平衡警告。如果我能够在代码中的不同点查询堆栈高度以隔离内部 C 函数,这些函数不会以相同的 SEXP PROTECT 堆栈高度返回,我会发现这非常有帮助。

有办法吗?

是的,我意识到如果我使用 Rcpp,我就不必担心这些,但我在这里太深了,无法改变。

一种不太理想的可能性是这样的模式:

int start, end;
PROTECT_WITH_INDEX(R_NilValue, &start);
UNPROTECT(1);
call_to_suspect_fun();
PROTECT_WITH_INDEX(R_NilValue, &end);
UNPROTECT(1);
if(start != end) error("Stack imbalance right here!");

这看起来 super 尴尬。我想它很容易变成一个函数,但如果没有更好的内置选项,我会感到惊讶。

最佳答案

堆栈的顶部不是公共(public) API 的一部分,但可以使其可见

#include "Rinternals.h"

extern int R_PPStackTop;

SEXP stacktop()
{
SEXP x;
Rprintf("%d\n", R_PPStackTop);
x = PROTECT(allocVector(INTSXP, 1));
Rprintf("%d\n", R_PPStackTop);
UNPROTECT(1);
Rprintf("%d\n", R_PPStackTop);
return Rf_ScalarInteger(R_PPStackTop);
}

导致

$ R CMD SHLIB stacktop.c 2&> /dev/null
$ R --vanilla -e "dyn.load('stacktop.so'); .Call('stacktop')"
> dyn.load('stacktop.so'); .Call('stacktop')
3
4
3
[1] 3

关于c - C : Consult SEXP PROTECT Stack Height 中的 R 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424025/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com