我正在尝试使用Rcpp在R中运行C代码,但是不确定如何转换用于保存文件中数据的缓冲区。在下面的第三行代码中,我分配了一个无符号的char缓冲区,而我的问题是我不知道要使用哪种Rcpp数据类型。将数据读入缓冲区后,我就知道了如何使用Rcpp :: NumericMatrix来保存最终结果,而不是字符缓冲区。我已经看到Dirk Eddelbuettel对类似问题的一些回答,他建议用Rcpp初始化命令替换所有的“ malloc”调用。我尝试使用Rcpp :: CharacterVector,但是最后循环中存在类型不匹配:Rcpp :: CharacterVector无法读取为无符号long long int。该代码为某些C编译器运行,但对其他C编译器抛出“内存损坏”错误,因此我宁愿按照Dirk建议的方式(使用Rcpp数据类型)进行操作,以便无论特定的编译器如何,代码都可以运行。 >
FILE *fp = fopen( filename, "r" );
fseek( fp, index_data_offset, SEEK_SET );
unsigned char* buf = (unsigned char *)malloc( 3 * number_of_index_entries * sizeof(unsigned long long int) );
fread( buf, sizeof("unsigned long long int"), (long)(3 * number_of_index_entries), fp );
fclose( fp );
// Convert "buf" into a 3-column matrix.
unsigned long long int l;
Rcpp::NumericMatrix ToC(3, number_of_index_entries);
for (int col=0; col<number_of_index_entries; col++ ) {
l = 0;
int offset = (col*3 + 0)*sizeof(unsigned long long int);
for (int i = 0; i < 8; ++i) {
l = l | ((unsigned long long int)buf[i+offset] << (8 * i));
}
ToC(0,col) = l;
l = 0;
offset = (col*3 + 1)*sizeof(unsigned long long int);
for (int i = 0; i < 8; ++i) {
l = l | ((unsigned long long int)buf[i+offset] << (8 * i));
}
ToC(1,col) = l;
l = 0;
offset = (col*3 + 2)*sizeof(unsigned long long int);
for (int i = 0; i < 8; ++i) {
l = l | ((unsigned long long int)buf[i+offset] << (8 * i));
}
ToC(2,col) = l;
}
return( ToC );
我正在尝试使用Rcpp在R中运行C代码,但是不确定如何转换用于保存文件中数据的缓冲区。在下面的第三行代码中,我分配了一个未签名的字符缓冲区,而我的问题是...
C和C ++可能很可爱。如果您知道自己在做什么,那么您既有一条[[very