2015-03-13 2 views
-3

Этот код хорошо работает на R с RcppОшибка кода Rcpp?

cppFunction(' 

double getMean (NumericVector x) { 

int n = x.length() ; 

double mn = 0.0 ; 

for (int it = 0 ; it < n ; it++) { 

mn += x(it)/n ; 

} 

return(mn) ; 

} 

') 

но добавив только еще одну линию выдает ошибку. Это просто простой код, чтобы попробовать Rcpp, чтобы узнать. Я вставил большую часть кода в цикл.

cppFunction(' 

double getMean (NumericVector x) { 

for (int jt = 0 ; jt < 100000 ; jt++) { 

int n = x.length() ; 

double mn = 0.0 ; 

for (int it = 0 ; it < n ; it++) { 

mn += x(it)/n ; 

} } 

return(mn) ; 

} 

') 

g++ -m64 -I"F:/Soft/R/R-31~1.1/include" -DNDEBUG  -I"F:/Soft/R/R-3.1.1/library/Rcpp/include"  -O2 -Wall -mtune=core2 -c file65c22223500.cpp -o file65c22223500.o 
file65c22223500.cpp: In function 'double getMean(Rcpp::NumericVector)': 
file65c22223500.cpp:14:8: error: 'mn' was not declared in this scope 
return(mn) ; 
     ^
file65c22223500.cpp:15:1: warning: control reaches end of non-void function [-Wreturn-type] 
} 
^ 
make: *** [file65c22223500.o] Error 1 
error message lost executed command 'make -f "F:/Soft/R/R-31~1.1 

/etc/x64/Makeconf" -f "F:/Soft/R/R-31~1.1/share/make/winshlib.mk" 

SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' 

SHLIB="sourceCpp_30227.dll" WIN=64 TCLBIN=64 OBJECTS="file65c22223500.o"' has 2 status error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, : 
    Error 1 occurred building shared library. 

В чем проблема?

ответ

2

Вы должны объявить только mn за пределами for loop.

Когда вы объявляете mn внутри своего for loop, его область действия ограничена рамкой цикла. Доступ к нему за пределами этого блока невозможен. Если вы объявите mn вне цикла, он будет доступен из всего функционального блока (как в первом коде, который вы указали).

Смежные вопросы