【发布时间】:2021-05-23 21:01:55
【问题描述】:
程序陷入循环。我用调试器检查了它,发现我的数组没有从我的主函数传递到“binarysearch”函数,并且从那里,它不会被传递给“check”函数。 smallestwrh = binarysearch(h, n, contentmax);
不会传递给
long long binarysearch(long long *h1, int n, long long contentmax)
Visual Studio 调试器告诉我,在“binarysearch”函数中,h1 是:+h1 0x0171c2bc {-3689348814741910324} __int64 *
我也收到此堆栈相关的错误消息,但我不确定这是否是我的问题的原因:“函数使用'800048'字节的堆栈:超过/分析:堆栈大小'16384'。考虑移动一些要堆的数据。”
完整代码:
#include <iostream>
#include <fstream>
using namespace std;
ifstream be("buldo.in");
ofstream ki("buldo.out");
bool check(long long *h2, int n, long long H) {
//igazat küld vissza amennyiben a H magasságra le lehet lapítani a földet
int i; long long content = 0;
for (i = 1; i <= n; i++) {
if (h2[i] > H)
content += h2[i] - H;
else {
if (content >= H - h2[i])
content -= H - h2[i];
else
return false;
}
}
return true;
}
long long binarysearch(long long *h1, int n, long long contentmax) {
long long left, right, middle;
left = 1; right = contentmax; middle = (left + right) / 2;
while (left < right) {
if (check(h1, n, middle) == true) {
left = middle + 1;
}
else {
right = middle;
}
}
return right;
}
int main() {
int n, i; long long h[100001], H, sum = 0, contentmax, smallestwrh;
be >> n;
for (i = 1; i <= n; i++) {
be >> h[i];
}
for (i = 1; i <= n; i++)
sum += h[i];
contentmax = (sum / n) + 1; //a legnagyobb földtartalom ami elfér a buldózernél a magasságok számtani átlaga
smallestwrh = binarysearch(h, n, contentmax); //megkeresi a legkisebb magasságot amire nem működik
ki << smallestwrh - 1;
return 0;
}```
【问题讨论】:
-
"并发现,我的数组没有从我的主函数传递给“binarysearch”函数,并且从那里,它不会被传递给“check”函数“那不是真的,你为什么相信?
-
当我通过 Visual Studio 调试器检查 h1 时,它不显示 h 的元素,只显示一个大的负数。 (+h1 0x0171c2bc {-3689348814741910324} __int64 * )
-
在 C/C++ 中,数组从零开始枚举。您不初始化 h[0]。因此,您会得到一些随机值,例如 -3689348814741910324。您不访问 h[0],因此从技术上讲它可能是正确的。但最好解决这个问题。您会收到有关堆栈大小的警告,因为 long h[100001] 是 800008 字节。建议您使用动态内存。
std::vector将是您的最佳选择。了解n后即可分配向量。不要忘记通过引用传递它。 -
我知道数组是从0枚举的。当我在main函数中检查我的h数组时,第0个数字是一个很大的负数(因为我从1开始索引),之后有4个整数,以及更多的大负数。但是,当我在函数中检查 h1 时,没有多个数字,只是一个很大的负数。(所以我的 4 个整数和其他未索引的空格由于某种原因消失了)。
-
我正在使用内置的 Visual Studio 调试器。
标签: c++ arrays function parameter-passing