gpt4 book ai didi

c++ - stringstream 不适用于 OSX 10.6 上的 Rcpp

转载 作者:行者123 更新时间:2023-11-28 03:43:11 24 4
gpt4 key购买 nike

似乎 std::stringstream 不适用于 Rcpp。为了隔离问题,我编写了一个最小程序:

#include <string>
#include <sstream>
#include <Rcpp.h>

float atof(std::string a) {
std::stringstream ss(a);
Rf_PrintValue(Rcpp::wrap(a));
float f;
Rf_PrintValue(Rcpp::wrap(f));
ss >> f;
Rf_PrintValue(Rcpp::wrap(f));
return (f);
}

RcppExport SEXP tsmall(SEXP sR) {
std::string sC = Rcpp::as<std::string>(sR);
return Rcpp::wrap(atof(sC));
}

tsmall 应该只是将字符串转换为 float 。 Rf_PrintValue 用于调试。现在在 OSX 10.16.7 上的 R 中,我得到

> dyn.load("min.so")
> a = .Call("tsmall","0.213245")
[1] "0.213245"
[1] 0
[1] 0
> a
[1] 0

在另一台机器(Ubuntu)上,它按预期工作:

> dyn.load("min.so")
> a = .Call("tsmall","0.213245")
[1] "0.213245"
[1] 1.401298e-45
[1] 0.213245
> a
[1] 0.213245

我在 OSX 上尝试了一个普通的 C++ 小程序,使用 stringstream 转换字符串和 float 当然效果很好。

OSX 上使用的编译器是 MacPorts g++-mp-4.4。

更新:我在 Stringstream not working with doubles when _GLIBCXX_DEBUG enabled 发现了一个关于 stringstream 和 OSX 的问题。 .但是,当我使用/usr/bin/g++-4.2 中的默认 gcc-4.2 编译该问题中的测试程序时,出现错误,但使用/opt/local/bin/g++-mp-4.4 编译工作正常。

但是,我已经将 Rcpp 代码编译为

$ PKG_CPPFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \
R CMD SHLIB min.cpp

使用了 gcc-4.4:

/opt/local/bin/g++-mp-4.4 -I/opt/local/lib/R/include -I/opt/local/lib/R/include/x86_64 -I/opt/local/lib/R/library/Rcpp/include -I/opt/local/include    -fPIC  -pipe -O2 -m64 -c min.cpp -o min.o
/opt/local/bin/g++-mp-4.4 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/opt/local/lib -o min.so min.o /opt/local/lib/R/library/Rcpp/lib/x86_64/libRcpp.a -L/opt/local/lib/R/lib/x86_64 -lR

所以我不确定这是否是同一个问题。

更新 2:https://discussions.apple.com/thread/2166586?threadID=2166586&tstart=0 的讨论之后,我在代码的顶部添加了以下内容:

#ifdef GLIBCXXDEBUG
#define GLIBCXX_DEBUGDEFINED "1"
#else
#define GLIBCXX_DEBUGDEFINED "<undefined>"
#endif

并根据@Kerrek 的建议将 f 初始化为 float f=0;stof 中(尽管这应该不会改变任何东西)。

Mac 上的输出仍然相同。

最佳答案

我不知道 R 或 RCPP,但我敢打赌以下代码会触发未定义的行为:

    float f;
Rf_PrintValue(Rcpp::wrap(f));

在使用 f 之前,您永远不会初始化,读取未初始化的变量是 UB。为了安全起见,请说类似float f = 0; 的内容。

关于c++ - stringstream 不适用于 OSX 10.6 上的 Rcpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479858/

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