0
我真的是C++新手。我知道這可能是由於錯誤的內存分配,但我已經嘗試運行表明僅僅誤差線,發現沒有錯......libC++ abi.dylib:以std :: length_error類型的未捕獲異常終止:向量
功能的錯誤部分(t爲1211200 * 7數組):
vector<double>tmp;
vector<size_t>tmpsort;
long ctmp=1000000,c=570404,l=1211200,indt=0;
double** m = new double*[ctmp];
for(int i = 0; i < ctmp; ++i)
m[i] = new double[7];
double** mt = new double*[c];
for(int i = 0; i < c; ++i)
mt[i] = new double[7];
for (int i=0; i<l; i++) {
if (t[i][0]!=0&&t[i][1]!=0) {
mt[indt][0]=t[i][0];
mt[indt][1]=t[i][1];
mt[indt][2]=t[i][2];
mt[indt][3]=t[i][3];
mt[indt][4]=t[i][4];
mt[indt][5]=t[i][5];
mt[indt][6]=t[i][6];
indt++;
}
}
for (int i=0; i<c; i++) {
tmp.push_back(pow(pow(distanceEarth(mt[i][1], mt[i][0], d[1], d[0]),2)+pow(mt[i][2]-d[2],2),0.5));
}
tmpsort.assign(ordered(tmp).begin(), ordered(tmp).end());//signal SIGABRT
for (int i=0; i<1000; i++) {
m[i][0]=mt[tmpsort[i]][0];
m[i][1]=mt[tmpsort[i]][1];
m[i][2]=mt[tmpsort[i]][2];
m[i][3]=mt[tmpsort[i]][3];
m[i][4]=mt[tmpsort[i]][4];
m[i][5]=mt[tmpsort[i]][5];
m[i][6]=mt[tmpsort[i]][6];
}
c=1000;
對於有序(從c++ sort keeping track of indices):
template <typename T>
vector<size_t> ordered(vector<T> const& values) {
vector<size_t> indices(values.size());
iota(begin(indices), end(indices), static_cast<size_t>(0));
sort(begin(indices), end(indices),[&](size_t a, size_t b) { return values[a] < values[b];});
return indices;
}
對於distanceEarth(其可以返回兩個點之間的距離的函數):
double deg2rad(double deg) {
return (deg * M_PI/180);}
double rad2deg(double rad) {
return (rad * 180/M_PI);}
double distanceEarth(double lat1d, double lon1d, double lat2d, double lon2d) {
double lat1r, lon1r, lat2r, lon2r, u, v;
lat1r = deg2rad(lat1d);
lon1r = deg2rad(lon1d);
lat2r = deg2rad(lat2d);
lon2r = deg2rad(lon2d);
u = sin((lat2r - lat1r)/2);
v = sin((lon2r - lon1r)/2);
return 2.0 * earthRadiusKm * asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v));}
終端將錯誤消息顯示爲標題。任何人都可以建議我接下來要檢查什麼?謝謝!
謝謝。我可以問我可以如何將訂單(tmp)分配給tmpsort?該功能不是主要功能,所以我不能在這裏使用「=」... – dinex
它們都似乎是'矢量',所以明確的分配應該工作。 –
Xcode提示「沒有可行的重載」='「。我使用push_back代替它併成功地工作。 – dinex