2014-01-28 8 views
5

Вот код:Почему утверждение не работает здесь?

#include <Rcpp.h> 
#include <iostream> 
#include <assert.h> 
#include <stdio.h> 

using namespace Rcpp; 


// [[Rcpp::export]] 
double eudist(NumericVector x, NumericVector y) { 
    int nx = x.size(); 
    int ny = y.size(); 
    std::cout << nx << '\n' << ny << std::endl; 
    assert(nx == ny); 

    double dist=0; 
    for(int i = 0; i < nx; i++) { 
     dist += pow(x[i] - y[i], 2); 
    } 

    return sqrt(dist); 
} 

После поиска его в R, я получаю следующий результат, по-видимому, не прервать, если есть ошибка:

#//////////////////////////////////////////////////// 
sourceCpp('x.cpp') 
#//////////////////////////////////////////////////// 
eudist(c(0, 0), c(1, 1)) 
2 
2 
[1] 1.4142 
#//////////////////////////////////////////////////// 
eudist(c(0, 0), c(1, 1, 1)) 
2 
3 
[1] 1.4142 
+4

Как вы это компилируете? 'assert' будет удален препроцессором, если вы определите' NDEBUG'; это, наверное, то, что происходит. –

+0

Три ура и надпись для переключения на 'throw()' –

+2

О, и быть приверженцем: используйте 'Rcpp :: Rcout' вместо' std :: cout' для записи в буферы ввода/вывода R. –

ответ

4

Отметьте, что assert() и т. Д. Явно запрещены для загрузки CRAN. Цитируя CRAN Repo Policy страницы:

The code and examples provided in a package should never do anything which might be regarded as malicious or anti-social. The following are illustrative examples from past experience.

  • Compiled code should never terminate the R process within which it is running. Thus C/C++ calls to assert/abort/exit , Fortran calls to STOP and so on must be avoided. Nor may R code call q() .

Таким образом, ответ о режиме отладки технически правильно, но обратите внимание, что вы не должны использовать это, если вы планируете загрузить CRAN в какой-то момент.

0

Для г ++ использовать -g для включить параметры отладки:

g++ -g code.cpp 

Или режим отладки в Visual Studio.

3

Проблема решена путем использования throw вместо assert, Rcpp на самом деле положит вещи в правильный блок try-catch, что очень приятно.

#include <Rcpp.h> 
#include <iostream> 
#include <assert.h> 
#include <stdio.h> 

using namespace Rcpp; 


// [[Rcpp::export]] 
double eudist(NumericVector x, NumericVector y) { 
    int nx = x.size(); 
    int ny = y.size(); 
    Rcout << nx << '\n' << ny << std::endl; 

    if(nx != ny) { 
     throw std::invalid_argument("Two vectors are not of the same length!"); 
    } 

    double dist=0; 
    for(int i = 0; i < nx; i++) { 
     dist += pow(x[i] - y[i], 2); 
    } 

    return sqrt(dist); 
} 
Смежные вопросы