Почему здесь не работает 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.