Rcpp:我无法将参数传递给 C++ 函数
Rcpp: I can't pass argument to c++ function
我正在尝试在 R 中使用 Rcpp 包。我有这个 c++ 代码可以在投票向量上使用 D'Hondt 方法:
#include <iostream>
#include <vector>
#include<Rcpp.h>
// original: http://www.brainum.es/code/ccplusplus/sistema-d-hondt-en-c
struct DhondtParty {
int votes, seats;
bool ok;
};
class Dhondt {
public:
DhondtParty* parties;
double minimun;
int votes,
numparties,
blank_votes,
esc;
Dhondt(int total,int arrayMem) {
this->esc = total;
this->numparties = 0; this->minimun = 0; this->blank_votes = 0;
this->parties = new DhondtParty[arrayMem];
}
void addblank(int pvotes) {
this->votes += pvotes;
this->blank_votes += pvotes;
}
void addparty(int partyvotes) {
DhondtParty party;
party.seats = 0;
party.votes = partyvotes;
party.ok = false;
this->parties[this->numparties] = party;
this->votes = this->votes+partyvotes;
this->numparties++;
}
void setminimun(double minimun) {
this->minimun = minimun;
}
void results() {
int i,z,mparty;
for(z=0;this->parties[z].votes;z++) {
if((double)this->parties[z].votes/(double)this->votes >= (double)this->minimun/100.0) this->parties[z].ok = true;
}
for(i=1;i<=this->esc;i++) {
mparty = -1;
for(z=0;this->parties[z].votes;z++) {
if(this->parties[z].ok && (this->parties[z].votes/(this->parties[z].seats+1) > this->parties[mparty].votes/(this->parties[mparty].seats+1) || mparty < 0)) {
mparty = z;
}
}
this->parties[mparty].seats++;
}
}
};
// [[Rcpp::export]]
Rcpp::NumericVector aplicaleydHont_a(){
Dhondt d(100,6); // Se llama a la clase, y se guarda en la variable d.
// Añadimos los partidos:
d.addparty(23);
d.addparty(21);
d.addparty(15);
d.addparty(11);
d.addparty(1);
d.addparty(18);
d.addblank(3); // votos en blanco
d.setminimun(3); // En %
d.results(); // Procesamos
Rcpp::NumericVector escas(d.numparties);
for(int i = 0; i < d.numparties; ++i){
std::cout << d.parties[i].seats << std::endl;
escas[i] = d.parties[i].seats;
}
return escas;
}
// [[Rcpp::export]]
Rcpp::NumericVector aplicaleydHont(int v){
Dhondt d(100,6); // Se llama a la clase, y se guarda en la variable d.
// Añadimos los partidos:
d.addparty(23);
d.addparty(21);
d.addparty(15);
d.addparty(11);
d.addparty(1);
d.addparty(18);
d.addblank(3); // votos en blanco
d.setminimun(3); // En %
d.results(); // Procesamos
Rcpp::NumericVector escas(d.numparties);
for(int i = 0; i < d.numparties; ++i){
std::cout << d.parties[i].seats << std::endl;
escas[i] = d.parties[i].seats;
}
return escas;
}
如您所见,我有一个 class 和两个相同的函数,第一个没有任何参数,第二个有一个参数。问题是当我使用带有参数的函数时(最后我想通过矢量参数传递选票)我没有得到任何结果。
我用来调用这个函数的R代码:
library(Rcpp)
Rcpp::sourceCpp('D:/Elecciones/modeloR_espa16/leydHont.cpp')
aplicaleydHont_a()
aplicaleydHont(1)
我得到了这个结果:
> aplicaleydHont_a()
35
21
15
11
0
18
[1] 35 21 15 11 0 18
> aplicaleydHont(1)
0
0
0
0
0
0
[1] 0 0 0 0 0 0
有人知道为什么我不能将参数传递给这些函数吗? Rcpp 和 c++ classes 的集成有问题吗?
谢谢!!
谢维
当我处理你的文件时,我得到以下输出:
dHondt.cpp: In function ‘Rcpp::NumericVector aplicaleydHont_a()’:
dHondt.cpp:35:29: warning: ‘d.Dhondt::votes’ is used uninitialized in this function [-Wuninitialized]
this->votes = this->votes+partyvotes;
~~~~~~^~~~~
dHondt.cpp: In function ‘Rcpp::NumericVector aplicaleydHont(int)’:
dHondt.cpp:35:29: warning: ‘d.Dhondt::votes’ is used uninitialized in this function [-Wuninitialized]
this->votes = this->votes+partyvotes;
~~~~~~^~~~~
>
aplicaleydHont_a()
0
0
0
0
0
0
[1] 0 0 0 0 0 0
>
aplicaleydHont(1)
0
0
0
0
0
0
[1] 0 0 0 0 0 0
添加后
this->votes = 0;
我得到的构造函数:
>
aplicaleydHont_a()
35
21
15
11
0
18
[1] 35 21 15 11 0 18
>
aplicaleydHont(1)
35
21
15
11
0
18
[1] 35 21 15 11 0 18
备注:
- 使用
Rcpp::Rcout
代替 std::cout
。
- 我会在构造函数中使用初始化列表。
- 我会使用
vector
而不是裸数组。
- 如果你需要一个裸数组,那么你就需要一个析构函数。
顺便说一句,在 CRAN 上搜索“D'Hondt”会产生几个结果。你检查过这些还不够吗?
我正在尝试在 R 中使用 Rcpp 包。我有这个 c++ 代码可以在投票向量上使用 D'Hondt 方法:
#include <iostream>
#include <vector>
#include<Rcpp.h>
// original: http://www.brainum.es/code/ccplusplus/sistema-d-hondt-en-c
struct DhondtParty {
int votes, seats;
bool ok;
};
class Dhondt {
public:
DhondtParty* parties;
double minimun;
int votes,
numparties,
blank_votes,
esc;
Dhondt(int total,int arrayMem) {
this->esc = total;
this->numparties = 0; this->minimun = 0; this->blank_votes = 0;
this->parties = new DhondtParty[arrayMem];
}
void addblank(int pvotes) {
this->votes += pvotes;
this->blank_votes += pvotes;
}
void addparty(int partyvotes) {
DhondtParty party;
party.seats = 0;
party.votes = partyvotes;
party.ok = false;
this->parties[this->numparties] = party;
this->votes = this->votes+partyvotes;
this->numparties++;
}
void setminimun(double minimun) {
this->minimun = minimun;
}
void results() {
int i,z,mparty;
for(z=0;this->parties[z].votes;z++) {
if((double)this->parties[z].votes/(double)this->votes >= (double)this->minimun/100.0) this->parties[z].ok = true;
}
for(i=1;i<=this->esc;i++) {
mparty = -1;
for(z=0;this->parties[z].votes;z++) {
if(this->parties[z].ok && (this->parties[z].votes/(this->parties[z].seats+1) > this->parties[mparty].votes/(this->parties[mparty].seats+1) || mparty < 0)) {
mparty = z;
}
}
this->parties[mparty].seats++;
}
}
};
// [[Rcpp::export]]
Rcpp::NumericVector aplicaleydHont_a(){
Dhondt d(100,6); // Se llama a la clase, y se guarda en la variable d.
// Añadimos los partidos:
d.addparty(23);
d.addparty(21);
d.addparty(15);
d.addparty(11);
d.addparty(1);
d.addparty(18);
d.addblank(3); // votos en blanco
d.setminimun(3); // En %
d.results(); // Procesamos
Rcpp::NumericVector escas(d.numparties);
for(int i = 0; i < d.numparties; ++i){
std::cout << d.parties[i].seats << std::endl;
escas[i] = d.parties[i].seats;
}
return escas;
}
// [[Rcpp::export]]
Rcpp::NumericVector aplicaleydHont(int v){
Dhondt d(100,6); // Se llama a la clase, y se guarda en la variable d.
// Añadimos los partidos:
d.addparty(23);
d.addparty(21);
d.addparty(15);
d.addparty(11);
d.addparty(1);
d.addparty(18);
d.addblank(3); // votos en blanco
d.setminimun(3); // En %
d.results(); // Procesamos
Rcpp::NumericVector escas(d.numparties);
for(int i = 0; i < d.numparties; ++i){
std::cout << d.parties[i].seats << std::endl;
escas[i] = d.parties[i].seats;
}
return escas;
}
如您所见,我有一个 class 和两个相同的函数,第一个没有任何参数,第二个有一个参数。问题是当我使用带有参数的函数时(最后我想通过矢量参数传递选票)我没有得到任何结果。
我用来调用这个函数的R代码:
library(Rcpp)
Rcpp::sourceCpp('D:/Elecciones/modeloR_espa16/leydHont.cpp')
aplicaleydHont_a()
aplicaleydHont(1)
我得到了这个结果:
> aplicaleydHont_a()
35
21
15
11
0
18
[1] 35 21 15 11 0 18
> aplicaleydHont(1)
0
0
0
0
0
0
[1] 0 0 0 0 0 0
有人知道为什么我不能将参数传递给这些函数吗? Rcpp 和 c++ classes 的集成有问题吗?
谢谢!!
谢维
当我处理你的文件时,我得到以下输出:
dHondt.cpp: In function ‘Rcpp::NumericVector aplicaleydHont_a()’:
dHondt.cpp:35:29: warning: ‘d.Dhondt::votes’ is used uninitialized in this function [-Wuninitialized]
this->votes = this->votes+partyvotes;
~~~~~~^~~~~
dHondt.cpp: In function ‘Rcpp::NumericVector aplicaleydHont(int)’:
dHondt.cpp:35:29: warning: ‘d.Dhondt::votes’ is used uninitialized in this function [-Wuninitialized]
this->votes = this->votes+partyvotes;
~~~~~~^~~~~
>
aplicaleydHont_a()
0
0
0
0
0
0
[1] 0 0 0 0 0 0
>
aplicaleydHont(1)
0
0
0
0
0
0
[1] 0 0 0 0 0 0
添加后
this->votes = 0;
我得到的构造函数:
>
aplicaleydHont_a()
35
21
15
11
0
18
[1] 35 21 15 11 0 18
>
aplicaleydHont(1)
35
21
15
11
0
18
[1] 35 21 15 11 0 18
备注:
- 使用
Rcpp::Rcout
代替std::cout
。 - 我会在构造函数中使用初始化列表。
- 我会使用
vector
而不是裸数组。 - 如果你需要一个裸数组,那么你就需要一个析构函数。
顺便说一句,在 CRAN 上搜索“D'Hondt”会产生几个结果。你检查过这些还不够吗?