我有三维定义多边形的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
答案 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
计算索引。这是你的选择。