Тема: питання по CodeBlocks
Як за допомогою CodeBlocks аналізувати код? Наприклад є помилка з пам'яттю core dumped, як знайти де помилка за допомогою CodeBlocks ?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → питання по CodeBlocks
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Як за допомогою CodeBlocks аналізувати код? Наприклад є помилка з пам'яттю core dumped, як знайти де помилка за допомогою CodeBlocks ?
http://wiki.codeblocks.org/index.php?ti … de::Blocks
Core dumped - це реакція системи, а не зміст помилки. В будь-якому разі, C та C++ дуже люблять лазити в пам'яті куди не слід...
http://wiki.codeblocks.org/index.php?ti … de::Blocks
Core dumped - це реакція системи, а не зміст помилки. В будь-якому разі, C та C++ дуже люблять лазити в пам'яті куди не слід...
Так я й хочу за допомогою CodeBlocks знайти місце і зміст помилки, хіба вона не для того призначена?
Але не можу в ній розібратися.
Результат: Segmentation fault (core dumped)
Як дізнатися де виникла помилка і чому?
Щоб дізнатися, де, треба дебажити. Поставити перед підозрілим місцем точку зупинки, і далі йти порядково до падіння (це описується наприкінці статті за посиланням).
Щоб дізнатися чому - треба думати. Чи викладати код сюди
Щоб дізнатися, де, треба дебажити. Поставити перед підозрілим місцем точку зупинки, і далі йти порядково до падіння (це описується наприкінці статті за посиланням).
Щоб дізнатися чому - треба думати. Чи викладати код сюди
Там біля 100 рядків де може бути потенційне падіння, перебирати всі - не діло.
Я думав CodeBlocks зберігає логи змінних і може видасти останні ітерації перед падінням.
Тоді ставте точку зупинки посередині підозрілого коду, якщо впаде до того - знатимете, що треба було раніше. За 7 кроків максимум знайдете рядок
Тоді ставте точку зупинки посередині підозрілого коду, якщо впаде до того - знатимете, що треба було раніше. За 7 кроків максимум знайдете рядок
Не розумію, є великий цикл, програма пройшла цикл 23453 разів, і все ок.
На 23453+1 -му проходженні циклу десь гавкнуло. Як знайти ту точку?
23453 попередніх проходи тієї точки були успішними.
#include <vector>
#include <fstream>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <cfloat>
using namespace std;
int main (int argc, const char* argv[])
{
if (system("clear")) {}
cout << "======= The Lagrangian Zel'dovich Void Finder =======" << endl;
string dir_input = "/home/andrii/voronoi/voids/code/federico_upd/input/"; //test
string dir_output = "/home/andrii/voronoi/voids/code/federico_upd/output/"; //test
// ----- get the parameters of the method from the parameter file -----
string par_file = (argc>1) ? argv[1] : dir_input+"input_param.ini";
string file_in = dir_input+"coord_LCDM_0.5.txt";
string type = "a";
string output = "coord_LCDM_0.5";
int n_max = 1000;
string mode = "p";
int n_rnd = 3;
ifstream finput (par_file.c_str());
if (!finput) { cerr <<"Error in opening the parameter file "<<par_file<<"!\n\a"; exit(1); }
string line, par_name, par_value, eq;
while (getline(finput, line)) {
stringstream line_string (line);
line_string >> par_name;
if (par_name!="#" && !par_name.empty()) {
line_string >> eq;
line_string >> par_value;
if (eq != "=" || par_value.empty()) {
cerr << "Error in the parameters file at " << par_name << endl;
cerr << "Using the default value for " << par_name << endl;
}
if (par_name == "input") file_in = dir_input+par_value;
if (par_name == "type") type = par_value;
if (par_name == "output") output = par_value;
if (par_name == "n_max") n_max = atoi(par_value.c_str());
if (par_name == "mode") mode = par_value;
if (par_name == "n_rnd") n_rnd = atoi(par_value.c_str());
}
}
finput.clear(); finput.close();
cout << endl << "file_in = " << file_in << endl;
cout << endl << "type = " << type << endl;
cout << "output = " << output << endl;
cout << "n_max = " << n_max << endl;
cout << "mode = " << mode << endl;
cout << "n_rnd = " << n_rnd << endl << endl;
// --------------------------------------------------------------------
srand(time(NULL)); // seed for randomization
vector<double> xc, yc, zc;
double shift_x,shift_z,shift_y,min_k,dist_k,dist_min,dist,n1,n2,n3,sum1,sum2,dist_new4,dist_new2,min_x,min_y,max_x,max_y,min_z,max_z;
vector<int> num(20);
if (type=="a") {
ifstream fin (file_in.c_str());
if (!fin) { cerr <<"Error in opening ASCII file "<<file_in<<"!\n\a"; exit(1); }
while (fin >>n1>>n2>>n3) {
xc.push_back(n1);
yc.push_back(n2);
zc.push_back(n3);
}
fin.clear(); fin.close();
}
if (type=="b") {
short num;
float val;
ifstream fin (file_in.c_str(), ios::in|ios::binary|ios::ate);
if (!fin) { cerr <<"Error in opening binary file "<<file_in<<"!\n\a"; exit(2); }
if (fin.is_open())
fin.seekg (0, ios::beg);
fin.read ((char*)(&num), 2);
int n_blocks=num;
for (int i=1; i<=n_blocks; ++i) {
fin.read ((char*)(&num), 4);
int n_objs=num;
for (int j=1; j<=n_objs; ++j){
fin.read ((char*)(&val), 4);
xc.push_back(val);
fin.read ((char*)(&val), 4);
yc.push_back(val);
fin.read ((char*)(&val), 4);
zc.push_back(val);
}
fin.read ((char*)(&num), 4);
int n_objs2=num;
if (n_objs2!=n_objs) {cout<<"Wrong reading of input binary file"<<endl; exit(3);}
}
fin.close();
}
//else {cout << "Unable to open input binary file"<<endl; exit(3);}
int imax=int(xc.size());
vector<double> dist_link(imax),xr(imax),yr(imax),zr(imax);
vector<unsigned int> link(imax),used(imax), used_real(imax);
min_x=DBL_MAX;max_x=-DBL_MAX;
min_y=DBL_MAX;max_y=-DBL_MAX;
min_z=DBL_MAX;max_z=-DBL_MAX;
for (int i=0; i<imax; ++i) {
used[i]=0;
if (min_x>xc[i]) {min_x=xc[i];}
if (min_y>yc[i]) {min_y=yc[i];}
if (min_z>zc[i]) {min_z=zc[i];}
if (max_x<xc[i]) {max_x=xc[i];}
if (max_y<yc[i]) {max_y=yc[i];}
if (max_z<zc[i]) {max_z=zc[i];}
}
double size_x=max_x-min_x;
double size_y=max_y-min_y;
double size_z=max_z-min_z;
for (int o=1; o<=10; ++o)
num[o]=0;
for (int i=0; i<imax; ++i) {
for (int o=1; o<=10; ++o) {
if (xc[i]>min_x+(max_x-min_x)*0.1*(o-1) && xc[i]<min_x+(max_x-min_x)*0.1*o){
num[o]=num[o]+1;
}
}
}
double c = 0., d = 0., e = 0., f = 0.;
for (int o=1; o<=10; ++o) {
c += min_x+(max_x-min_x)*0.1*(o-0.5);
d += num[o];
e += pow(min_x+(max_x-min_x)*0.1*(o-0.5),2);
f += (min_x+(max_x-min_x)*0.1*(o-0.5))*num[o];
}
double koef_k=(f-0.1*c*d)/(e-0.1*c*c);
double koef_b=0.1*(d-koef_k*c);
double integ=1/(koef_k*0.5*(max_x*max_x-min_x*min_x)+koef_b*(max_x-min_x));
double mx,sum,rnd;
int rndd;
for (int rndd=1; rndd<=n_rnd; ++rndd) { /* generation of random field */
cout<<rndd<<" of "<<n_rnd<<" random realizations"<<endl;
for (int i=0; i<imax; ++i) { /* generation of random field */
if (mode=="t") {
rnd=double(rand())/double(RAND_MAX);
mx=min_x;
sum=0;
while (sum<rnd) {
mx=mx+0.05;
sum=sum+(koef_k*mx+koef_b)*integ*0.05;
}
xr[i]=mx;
}
if (mode=="n"||mode=="p") {xr[i]=min_x+(max_x-min_x)*double(rand())/double(RAND_MAX);}
yr[i]=min_y+(max_y-min_y)*double(rand())/double(RAND_MAX);
zr[i]=min_z+(max_z-min_z)*double(rand())/double(RAND_MAX);
used[i]=0;
used_real[i]=0;
}
stringstream ss;
ss << rndd;
string str = ss.str();
string name = dir_output+"displ";
name.append("_");
name.append(str);
name.append("_");
name.append(output);
ofstream fout1(name.c_str());
fout1.precision(7);
//test
name = dir_output+"test";
name.append("_");
name.append(str);
name.append("_");
name.append(output);
ofstream ftest(name.c_str());
ftest.precision(7);
//test
int jmax = imax;
// looking for the closest pairs
sum=0;
while (sum<0.95*jmax) {
int i=int(jmax*double(rand())/double(RAND_MAX)); // random number of real
int j=int(jmax*double(rand())/double(RAND_MAX)); // random number of random
if (used[j]!=1 && used_real[i]!=1) {
if (mode!="p") {
min_k=DBL_MAX;
dist_k=(xc[i]-xr[j])*(xc[i]-xr[j])+(yc[i]-yr[j])*(yc[i]-yr[j])+(zc[i]-zr[j])*(zc[i]-zr[j]);
if (dist_k<min_k) min_k=dist_k;
}
else {
min_k=DBL_MAX;
for (int xk=-1; xk<=1; ++xk) {
for (int yk=-1; yk<=1; ++yk) {
for (int zk=-1; zk<=1; ++zk) {
dist_k=(xc[i]-xr[j]-xk*size_x)*(xc[i]-xr[j]-xk*size_x)+(yc[i]-yr[j]-yk*size_y)*(yc[i]-yr[j]-yk*size_y)+(zc[i]-zr[j]-zk*size_z)*(zc[i]-zr[j]-zk*size_z);
if (dist_k<min_k) min_k=dist_k;
}
}
}
}
dist=min_k;
link[i]=j; dist_link[i]=dist;
used[j]=1; used_real[i]=1; sum=sum+1;
}
}
while (sum<jmax) {
for (int i=0; i<jmax; ++i) {
for (int j=0; j<jmax; ++j) {
if (used[j]!=1 && used_real[i]!=1) {
if (mode!="p") {
min_k=DBL_MAX;
dist_k=(xc[i]-xr[j])*(xc[i]-xr[j])+(yc[i]-yr[j])*(yc[i]-yr[j])+(zc[i]-zr[j])*(zc[i]-zr[j]);
if (dist_k<min_k) {min_k=dist_k;}
}
else {
min_k=DBL_MAX;
for (int xk=-1; xk<=1; ++xk) {
for (int yk=-1; yk<=1; ++yk) {
for (int zk=-1; zk<=1; ++zk) {
dist_k=(xc[i]-xr[j]-xk*size_x)*(xc[i]-xr[j]-xk*size_x)+(yc[i]-yr[j]-yk*size_y)*(yc[i]-yr[j]-yk*size_y)+(zc[i]-zr[j]-zk*size_z)*(zc[i]-zr[j]-zk*size_z);
if (dist_k<min_k) {min_k=dist_k;}
}
}
}
}
dist=min_k;
link[i]=j; dist_link[i]=dist;
used[j]=1; used_real[i]=1; sum=sum+1;
}
}
}
}
//swaping
for (int k=1; k<=n_max; ++k) { //iteration steps
if (k==int(n_max*0.1)) { cout <<"\r.....10% completed\r"; cout.flush(); }
if (k==int(n_max*0.15)) { cout <<"\r.....15% completed\r"; cout.flush(); }
if (k==int(n_max*0.2)) { cout <<"\r.....20% completed\r"; cout.flush(); }
if (k==int(n_max*0.25)) { cout <<"\r.....25% completed\r"; cout.flush(); }
if (k==int(n_max*0.3)) { cout <<"\r.....30% completed\r"; cout.flush(); }
if (k==int(n_max*0.4)) { cout <<"\r.....40% completed\r"; cout.flush(); }
if (k==int(n_max*0.5)) { cout <<"\r.....50% completed\r"; cout.flush(); }
if (k==int(n_max*0.6)) { cout <<"\r.....60% completed\r"; cout.flush(); }
if (k==int(n_max*0.7)) { cout <<"\r.....70% completed\r"; cout.flush(); }
if (k==int(n_max*0.8)) { cout <<"\r.....80% completed\r"; cout.flush(); }
if (k==int(n_max*0.9)) { cout <<"\r.....90% completed\r"; cout.flush(); }
for (int o=0; o<jmax; ++o) { //over all data points
int ii=int(jmax*double(rand())/double(RAND_MAX)); //random choosing of two pairs real-random
int i=int(jmax*double(rand())/double(RAND_MAX));
sum1=dist_link[i]+dist_link[ii]; // sum of two lenghts pair size
if (mode!="p") {
min_k=DBL_MAX;
dist_k=(xc[i]-xr[link[ii]])*(xc[i]-xr[link[ii]])+(yc[i]-yr[link[ii]])*(yc[i]-yr[link[ii]])+(zc[i]-zr[link[ii]])*(zc[i]-zr[link[ii]]); // new distance 1 after possible swaping
if (dist_k<min_k) {min_k=dist_k;}
}
else {
min_k=DBL_MAX;
for (int xk=-1; xk<=1; ++xk) {
for (int yk=-1; yk<=1; ++yk) {
for (int zk=-1; zk<=1; ++zk) {
dist_k=(xc[i]-xr[link[ii]]-xk*size_x)*(xc[i]-xr[link[ii]]-xk*size_x)+(yc[i]-yr[link[ii]]-yk*size_y)*(yc[i]-yr[link[ii]]-yk*size_y)+(zc[i]-zr[link[ii]]-zk*size_z)*(zc[i]-zr[link[ii]]-zk*size_z);
if (dist_k<min_k) {min_k=dist_k;}
}
}
}
}
dist_new4=min_k;
if (mode!="p") {
min_k=DBL_MAX;
dist_k=(xc[ii]-xr[link[i]])*(xc[ii]-xr[link[i]])+(yc[ii]-yr[link[i]])*(yc[ii]-yr[link[i]])+(zc[ii]-zr[link[i]])*(zc[ii]-zr[link[i]]); // new distance 2 after possible swaping
if (dist_k<min_k) {min_k=dist_k;}
}
else {
min_k=DBL_MAX;
for (int xk=-1; xk<=1; ++xk) {
for (int yk=-1; yk<=1; ++yk) {
for (int zk=-1; zk<=1; ++zk) {
dist_k=(xc[ii]-xr[link[i]]-xk*size_x)*(xc[ii]-xr[link[i]]-xk*size_x)+(yc[ii]-yr[link[i]]-yk*size_y)*(yc[ii]-yr[link[i]]-yk*size_y)+(zc[ii]-zr[link[i]]-zk*size_z)*(zc[ii]-zr[link[i]]-zk*size_z);
if (dist_k<min_k) {min_k=dist_k;}
}
}
}
}
dist_new2=min_k;
sum2=dist_new4+dist_new2; // new sum of distances after swapping
if (sum2<sum1) { // case of decreasing of the distance sum after swaping
int mih=link[i];
link[i]=link[ii];
link[ii]=mih;
dist_link[i]=dist_new4;
dist_link[ii]=dist_new2;
}
}
//test begin
double total=0;
for (int o=0; o<jmax; ++o) { //over all data points
total=total+dist_link[o];}
ftest<<total<<endl;
//test end
}
for (int i=0; i<jmax; ++i) {
shift_x=xr[link[i]]-xc[i];
shift_y=yr[link[i]]-yc[i];
shift_z=zr[link[i]]-zc[i];
if (shift_x>size_x*0.5) {shift_x=xr[link[i]]-size_x-xc[i];}
if (shift_x<-size_x*0.5) {shift_x=xr[link[i]]+size_x-xc[i];}
if (shift_y>size_y*0.5) {shift_y=yr[link[i]]-size_y-yc[i];}
if (shift_y<-size_y*0.5) {shift_y=yr[link[i]]+size_y-yc[i];}
if (shift_z>size_z*0.5) {shift_z=zr[link[i]]-size_z-zc[i];}
if (shift_z<-size_z*0.5) {shift_z=zr[link[i]]+size_z-zc[i];}
fout1<<xr[link[i]]<<" "<<yr[link[i]]<<" "<<zr[link[i]]<<" "<<shift_x<<" "<<shift_y<<" "<<shift_z<<endl;
// output random position x,y,z, shift at randomization dx,dy,dz
}
fout1.clear(); fout1.close();
ftest.clear(); ftest.close(); //for test
}
cout <<"\r \r"<<endl;
return 0;
}
Все знайшов помилку, замість
int ii=int(jmax*double(rand())/double(RAND_MAX));
треба
int ii=int((jmax-1)*double(rand())/double(RAND_MAX));
Шкода, що при цьому CodeBlocks ніяк не допоміг.
Тут таке простирадло, що взагалі щось зрозуміти важко. Якби розбити це на кілька функцій, на кшталт
- прочитати параметри;
- ввести дані;
- кілька функції по етапах обробки даних;
- вивести дані;
і додати ще якісь службові функції, щоб формули пристойніше виглядали (у вас дуже часто іде лінійне перетворення, пошук екстремуму - для цього є min_element, і обчислення відстані) - і буде все зрозуміліше і зручніше для пошуку помилок.
Так, і рядки 303-313 можна переписати
int percent = int( double( k ) / double( n_max ) * 100 ) ;
if ( percent % 5 == 0 ) {
cout <<"\r....." << percent << "% completed\r"; cout.flush();
}
Якщо, звісно, несуттєво, щоб 15% і 25% виводилися, а решта, що закінчується на 5 - ні.
пошук екстремуму - для цього є min_element, і обчислення відстані) - і буде все зрозуміліше і зручніше для пошуку помилок.
о, точно!
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися