区域计算中的堆栈溢出

时间:2018-01-07 08:53:35

标签: c++ stack-overflow polygon area

我有三维定义多边形的N个点。我使用以下代码来计算该多边形的面积,但是我得到了堆栈溢出,我无法理解为什么。起初我以为是while函数超出界限但显然不是?

#include<iostream>
#include<fstream>
using namespace std;

struct punct {
    long double x;
    long double y;
};

int main()
{
    int N;
    long double aria = 0.0f;
    punct v[100000];
    ifstream f("aria.in");
    ofstream g("aria.out");
    f >> N;
    for (int i = 1; i <= N; i++) {
        f >> v[i].x >> v[i].y;
    }

    int k = 1;
    while (k <= N - 1) {
        aria = aria + (v[k].x * v[k + 1].y - v[k + 1].x * v[k].y);
        k++;
    }

    aria = aria + (v[N].x * v[1].y - v[1].x * v[N].y);
    aria = 1 / 2 * aria;

    g << aria;

    f.close();
    g.close();
    return 0;
}

我的输入文件aria.in包含以下内容:

4
-2 -2
2 -2
2 2
-2 2

2 个答案:

答案 0 :(得分:3)

这一行

punct v[100000];

错误,因为它对于堆栈来说太大了

使用std::vector代替,即

#include <vector>

....

std::vector<punct> v(100000);

另外,您应该检查是否实际打开了文件

答案 1 :(得分:1)

您正在尝试在堆栈上使用malloc 100000 punct,这会导致堆栈溢出。

你可以在堆上malloc:

punct *v = new  punct[100000 + 1];

这应解决堆栈溢出问题。 为了完整,最好在不需要之后释放内存。

delete [] v;

您还可以使用c ++ 11 new vector

#include <vector>
std::vector<punct> v(100000 + 1);

array容器来做

#include <array>
std::array<punct, 100000 + 1> v;

注意到我向100000添加了一个,因为您的代码看起来像1开始索引。但是,c ++从zero计算索引。这是你的选择。