分割错误取决于我在C 中声明的顺序



我是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]

相关内容

  • 没有找到相关文章

最新更新