std::vector<vector<vector> > >
형태로 3 차원 텐서 fafr
을 반환하는 함수 getfafr(N,n,twoq)
이 있습니다. 동일한 크기가 아닙니다 (즉 fafr[i][j].size()
은 i,j
등으로 다를 수 있음). 이는 push_back()
을 사용하여 구현됩니다.std :: vector.push_back()에 이상한 (메모리?) 문제가 발생했습니다
똑같은 매개 변수를 사용하여 함수를 실행하면 다른 텐서가 생길 수 있습니다. 때로는 적어도 요소 중 일부는 횡설수설합니다. 한 예는 getfafr(12,3,1)
을 코드의 다른 지점에서 한 번에 실행하면 fafr[2][0][10]=270
이되고 다른 하나는 fafr[2][0][10]=-6.88461e-309
이됩니다.
이상한 점은 항상 std::cout
을 사용하여 생성 후 화면에 텐서를 인쇄하면 문제가 사라진다는 것입니다.
이런 식으로 push_back()
을 사용하면 이전 데이터를 나중에 또는 다른 것으로 덮어 쓰는 등의 메모리 문제가 발생할 수 있습니다. 여기에 기능입니다 :
vector<vector<vector<double> > > getfafr(int N, int n, int twoq) {
vector<vector<vector<double> > > fafr;
for(int nu=0;nu<n;nu++) {
fafr.push_back(vector<vector<double> >(twoq+nu+1));
for(int om=0;om<=twoq+nu;om++) {
for(int tmo=0;tmo<N-nu-twoq;tmo++) {
fafr[nu][om].push_back(bin(twoq+nu, om));
for(int i=N-tmo-nu-twoq;i<=N-1-tmo-om;i++) fafr[nu][om][tmo]*=i;
for(int i=tmo+1;i<=tmo+om;i++) fafr[nu][om][tmo]*=i;
}
}
}
return fafr;
}
'operator []'에서'at'를 사용하도록 전환하면 문제가 명백해질 것이라는 느낌이 들게됩니다. –
흠, 나를 위해서가 아니야. 그게 무슨 뜻인지''std :: out_of_range'' 오류를주지 않았습니까? – jorgen
'bin()'은 무엇을 반환합니까? –