【问题标题】:Array won't be passed to function C++数组不会传递给函数 C++
【发布时间】: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


【解决方案1】:

您的代码正确地将完整数组传递给 binarysearch(或至少是起始地址和长度),您只有调试显示问题。

在 main 中,您有 h,一个 100001 long long 的数组,因此调试器将 h 显示为一个数组。当调用binarysearch 时,您对指针衰减进行了数组处理,您只是传递了数组的地址并丢失了它是一个数组以及它有多长的信息。所以在binarysearch 中,调试器无法知道函数是用数组调用的,它必须假定只传递了指向一个元素的指针。因此调试器只显示h1 中的地址和存储在*h1 中的值(这是h 的第一个元素)。

如果你想查看完整的数组,你可以到“Watch”窗口添加一个“h1,[n]”。这告诉调试器将h1 显示为包含n 元素的数组。另一个不太舒服的选择是打开“内存”窗口并将地址设置为h1

对于您的情况,另一种选择可能是不对数组进行指针衰减。您可以创建一个std::vector&lt;long long&gt; h; 并将其通过引用传递给long long binarysearch(std::vector&lt;long long&gt;&amp; h1, long long contentmax)。两个优点:vector 可以动态增长,因此当用户输入大于 100001 的数字 n 时不会出现缓冲区溢出,vector 始终是数据 + 长度,所以你只需传递它作为一个参数,长度总是正确的(vector_variable.size()nbinarysearch 中的替换)。

【讨论】:

  • 谢谢!然而,这只会让我更加困惑。如果正确传递了数组,什么可能导致程序处于循环中?(或至少处于类似循环的状态)
  • 代码中的错误可能导致程序处于循环中。
  • @DaniSuba 我敢打赌while (left &lt; right) { 是正确的,因为你会一直拥有if (check(h1, n, middle) == true) 或总是拥有else。旁注:您的 binaryseach 没有进行二进制搜索。 check 正在检查完整的数组。这不是二进制搜索所做的。二分查找只是看中间元素,然后在下一步决定是看左边还是右边。尽管如此,发现错误应该是关于 SO 的另一个问题,而不是对这个已经回答的问题的编辑。
  • 谢谢维尔纳!感谢您,我刚刚注意到我忘记将 middle=(l+r)/2 放在 while 循环中!
猜你喜欢
  • 2018-11-14
  • 2013-06-26
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多