我是C 的新手。在过去的9个月左右的时间里,这是这样做的。我总是学到我刚刚尝试完成的一切。这可能是我做一些草率的代码,所以我很高兴,如果你们建议建议使用更合适的代码,但主要解决了当前的问题。
我的代码要做的:应该创建一个结构,使我在二维x [-50; 50] y [-50; 50]中更容易找到并使用半径,但仅适用于整数。我对此任务的声明结构由" sqared radius"(最大:5000)索引,并填充:
- 索引(以后使用数组" radidx")
- 相同半径的位置数量
- 其真实半径(SQRT)
- 每个坐标的x和y位置
只是让您知道我的代码中发生了什么。
现在问题出现了:如果我在结构声明之前声明" 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("%dt%dn",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, "%dt%dt%dt%dt%ft%dt%dn", 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
谢谢大家的帮助。
您有5001个count
条目,但radius
只有5000个条目。当您访问radius[50*50+50*50]
(= radius[5000]
)时,您超过了数组的边界,并在radius
之后覆盖内存中的任何内容。
解决方案是将声明更改为 radii radius[5001]
。