我是c ++的新手。在过去9个月左右的时间里做这件事,并没有通过书本学习。我总是学到任何我想要完成的事情。这可能已经结束了我做一些草率的代码,所以如果你们建议更合适的代码,我很高兴,但主要是解决手头的问题。
我的代码做了什么:它应该创建一个结构,使我可以很容易地找到和使用半维x [-50; 50] y [-50; 50],但仅限于整数。我声明的此任务结构由“sqared radius”(最大值:5000)索引并填充:
只是让你知道我的代码中发生了什么。
现在问题是这样的:如果我在结构声明之前声明数组“radidx”,我最终得到了我的解决方案。但是如果我在结构之后声明它,我会得到一个分段错误,因为结构中的条目似乎非常错误。
据我所知,有一位朋友证实了这一点。我的代码之上的声明顺序 - 在使用任何这些声明之前很久 - 应该没有区别,所以这必须是因为我自己的一些草率编码。我想对此进行改进,以避免将来代码中出现类似问题,并在此处使用此代码。我们俩都不知道哪里出了什么问题。
#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <cmath>
#include <ctime>
#include <chrono>
#include <list>
#include <random>
using namespace std;
// int radidx[1030] = {0}; // Here it does work.
struct radii { int idx; int a=0; double r; int x[32]; int y[32]; };
radii radius[5000];
int radidx[1030] = {0}; // Here it doesn't work.
void rad_corr_init() {
int count [5001];
for (int i=0;i<5001;i++) count[i]=0;
/// Helper Function
/// count amount of positions with the same radius
for (int i=-50;i<51;i++)
for (int j=-50;j<51;j++)
count[i*i+j*j]++;
/// sort collected radii and exclude radii that don't exist so one can run a for-loop of an radius interval
int ik=0;
for (int i=1;i<5001;i++)
if(count[i]) {radidx[ik]=i; ik++;}
for (int i=-50;i<51;i++) // This is put here for testing
for (int j=-50;j<51;j++) { // This is put here for testing
int il = i*i+j*j; // This is put here for testing
radius[il].a=0; // This is put here for testing
} // This is put here for testing
/// Create Radius Structure
for (int i=-50;i<51;i++)
for (int j=-50;j<51;j++) {
int il = i*i+j*j;
int im = radius[il].a;
if (!radius[il].a) radius[il].r = sqrt(il);
radius[il].x[im] = i;
radius[il].y[im] = j;
radius[il].a++;
}
for (int i=0;i<1030;i++) {printf("%d\t%d\n",i,radidx[i]) /* This is put here for testing */ ;radius[radidx[i]].idx = i;}
}
int main() {
FILE * result = fopen( "result.txt", "w" );
rad_corr_init();
for (int i=0;i<1030;i++) {
int in = radidx[i];
int io = radius[in].a;
for (int j=0;j<io;j++) {
cout << i << '\t' << in << '\t' << radius[in].r << '\t' << j << '\t' << radius[in].x[j] << '\t' << radius[in].y[j] << endl;
fprintf(result, "%d\t%d\t%d\t%d\t%f\t%d\t%d\n", i, radius[in].idx, in, radius[in].r, j, radius[in].x[j], radius[in].y[j]);
}
}
// system("pause");
return 0;
}
我使用以下命令进行编译(如果这是问题的一部分):
g++ radius.cpp -std=c++11 -o ~[some name]/Desktop/run.out;time ~[some name]/Desktop/run.out
g++ -O4 radius.cpp -std=c++11 -o ~[some name]/Desktop/run.out;time ~[some name]/Desktop/run.out
谢谢你们的帮助。
答案 0 :(得分:4)
count
有5001个条目,radius
只有5000个条目。当您访问radius[50*50+50*50]
(= radius[5000]
)时,超出数组范围并覆盖radius
之后内存中的内容。
解决方案是将声明更改为radii radius[5001]
。