【发布时间】:2018-06-16 13:40:52
【问题描述】:
我有 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
【问题讨论】:
-
最后一段代码还在执行吗?调试器告诉你什么?
-
不要在栈上分配
punct v[100000];这样的大数组,因为栈空间比较有限。使用::std::vector在堆上分配它们。 -
这可能是
punct v[100000]的错。您正在为此数组16 * 100000 =~ 1.5MB分配 lots 的堆栈空间。请尝试堆分配。一条线索:use vector -
@tomix86 我认为 long double 是(通常)每个 10 个字节?另外...回复OP:可以通过命令增加堆栈大小(每个操作系统不同)
-
@user202729 AFAIK 它取决于架构和编译器,long double 应至少 8 字节长,请参阅here。我做了一个快速检查,使用 VS2017 为 x64 编译它确实是 8 个字节。
标签: c++ stack-overflow polygon area