回复 第29楼 的 dengmeng0203:哦,我懒了一下你也没有改啊:
re=.C("Login",as.character("abcdef"),as.character("efghlokm"),as.integer(0),as.integer(a))
这里
R 里面 as.character("abcdef") ;C里面 const char *
R 里面 as.character("efghlokm") ;C里面 const char *
R 里面 as.integer(0) ;C里面 const int *
你C的原型是
IN CHAR **a,IN CHAR **b,IN int *c,IN int *d
1. char **的问题
2. const修饰的问题
于是x000003的问题很好理解:
1. char * 到char**强制转换后offest出问题了;
2. C中某些赋值操作改变了as.character("abcdef")的长度,也就是说c_string这样的东西加了NULL这样的玩意儿引起指针错误了(C的话,就是段错误啦),所以看到offset如此靠前的错误。
要改的话:
1. IN CHAR **在R对应啥谁知道(我不知道)? 而且这样不用RALLOC申明的东西R没法做内存管理,也就没法free和确定长度,等,也就是说,就算R里有个东西类似,但只要你dll里做了更改长度啊之类的操作就会内存溢出(没法free或free错了)、越界(这个更有可能)等。
2. 和最后那个变量一样不要用const啊。。。
我的建议:
Cpp call R (RInside包提供支持)算了。但是这样Windows下应该只有llvm/gcc工具链可用吧(有谁能确认或纠正一下)?
对了,还有一个问题忘记说了。 32bit/64bit的offset不同啊。