【发布时间】:2013-11-22 03:01:48
【问题描述】:
我有以下代码:
iterator = u.U.begin(); //u.U is a map<bitset,long>
int sizeofIterator = u.U.size();
for ( int pp = 0; pp<sizeofIterator; pp++ ){
double *faux = new double[q];
for (int k = 0 ; k<q ; k++){
faux[k]=1;
}
for (int k=0; k<q ; k++){
for (int i=0; i<I ; i++){
faux[k]= faux[k]*successProbability(theta[k],a[i],b[i],c[i]);
}
faux[k] = faux[k]*nodeWeight[k];
}
double sum = 0;
for (int k=0; k<q ; k++){
sum += faux[k];
}
for (int k=0; k<q; k++){
faux[k] = faux[k]/sum;
faux[k] = iterator->second * faux[k];
f[k] = faux[k]+f[k];
for(int i = 0; i<I; i++){
if(iterator->first[i]){
double aux = faux[k];
r[k*I+i]=r[k*I+i]+aux;
}
}
}
iterator++;
}
运行该代码时,我遇到了分段错误。我得到了一些结论,我知道问题出在这条线上
iterator++;
迭代器必须迭代 32 次(map 的大小)但在第 18 次迭代时出现段错误
提示: 当我在线评论辅助时: r[k*I+i]=r[k*I+i]+辅助;
即我把以下 r[k*I+i]=r[k*I+i]+0;//+aux;
所有的作品(但我需要执行那个总和,当然!)
¿你知道为什么吗?你能帮我吗?
提前致谢
编辑:我们无法在更少的代码上复制错误,它只是工作,但不是我们想要工作的代码:(
【问题讨论】:
-
试着把它变成一个简短的完整例子。
-
你能在每次迭代期间打印出
aux的值吗,这样行吗? -
我的猜测是:寻找字段
r!我认为段违规发生在那里。原因是,如果您将aux注释掉,那么循环中不会发生任何事情,并且编译器可能会优化某些内容。此外,可以根据iterator忽略相应的块。与iterator有联系。我猜索引超出范围。在使用之前打印k*I+i,并将其与r的边界进行比较。
标签: c++ map iterator segmentation-fault bitset