Почему здесь не работает assert?

вот код:

#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

3 ответов


отметим, что assert() etc явно запрещены для загрузки CRAN. Цитата из политика РЕПО CRAN страницы:

код и примеры, приведенные в пакете, никогда ничего не должны делать что может быть расценено как злонамеренное или антисоциальное. Ниже приведены наглядные примеры из прошлого опыта.

  • скомпилированный код никогда не должен завершать процесс R, в котором он выполняется. Таким образом, C / C++ вызывает assert/abort/exit, Fortran вызывает STOP и так далее следует избегать. Также код R не может вызывать q().

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


проблема решена с помощью 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);
}

для g++ используйте -g для включения параметров отладки:

g++ -g code.cpp

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