将字符缓冲区移植到Rcpp中

问题描述 投票:0回答:1

我正在尝试使用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代码,但是不确定如何转换用于保存文件中数据的缓冲区。在下面的第三行代码中,我分配了一个未签名的字符缓冲区,而我的问题是...

r rcpp
1个回答
1
投票

C和C ++可能很可爱。如果您知道自己在做什么,那么您既有一条[[very

© www.soinside.com 2019 - 2024. All rights reserved.