当前位置: 首页 > 知识库问答 >
问题:

将从值捕获的变量赋给Lambda参数时,gcc编译器出现分段错误

左丘阳晖
2023-03-14

我正在研究这个答案,并编写了代码:

bool generate(vector<int>& temp, int& target, const size_t width, const size_t i) {
    const auto replacement = temp[i];
    const auto result = target > replacement;

    if (result) {
        for_each(begin(temp), next(begin(temp), min(temp.size(), i + width - 1)), [=](auto& it) {
            if (target == it) {
                it = replacement;
            } else if (target < it) {
                --it;
            } });
    }
    target = replacement;
    return result;
}

int main() {
    const vector<char> rooms = { 0b1101,    0b110,  0b1101, 0b110,  0b1100, 0b101,  0b110,
                                 0b1110,    0b1001, 0b110,  0b1011, 0b1010, 0b1111, 0b1010,
                                 0b1000,    0b101,  0b11,   0b1110, 0b1011, 0b1110, 0b1010,
                                 0b1011,    0b1101, 0b101,  0b1,    0b101,  0b11,   0b1011 };
    const size_t width = 7U;
    auto result = 0;
    vector<int> temp(rooms.size());

    for (size_t i = 0U; i < rooms.size(); ++i) {
        const auto toWest = (rooms[i] & 0b1000) == 0;
        const auto toNorth = (rooms[i] & 0b100) == 0;
        const auto toEast = (rooms[i] & 0b10) == 0;
        const auto toSouth = (rooms[i] & 0b1) == 0;
        const auto west = toWest && temp[i - 1] != 0 ? temp[i - 1] : numeric_limits<int>::max();
        const auto north = toNorth && temp[i - width] != 0 ? temp[i - width] : numeric_limits<int>::max();
        const auto east = toEast && temp[i + 1] != 0 ? temp[i + 1] : numeric_limits<int>::max();

        temp[i] = min({ temp[i] != 0 ? temp[i] : numeric_limits<int>::max(), result + 1, west, north, east });

        if (temp[i] == result + 1) ++result;

        if (toWest) result -= generate(temp, temp[i - 1], width, i);
        if (toNorth) result -= generate(temp, temp[i - width], width, i);
        if (toEast) result -= generate(temp, temp[i + 1], width, i);
        if (toSouth) temp[i + width] = temp[i];
    }

    for (auto it = cbegin(temp); it != cend(temp);) {
        for (auto i = 0; i < width; ++i, ++it) cout << *it << '\t';
        cout << endl;
    }

    cout << endl << result << endl;
}

在gcc上编译时,此代码会出现错误:

内部编译器错误:分段错误< code>it =替换;

我在gcc 5.1、5.2和5.3上本地尝试过,它给出了所有这些都相同的编译器错误。Clang似乎对代码和Visual Studio很满意。这只是一个编译器错误,不是我犯的错误,对吧?

共有1个答案

仉英朗
2023-03-14

lambda中按值捕获常量变量以及由于分段错误导致的后续内部编译器错误是gcc 5.1-5.3中的一个错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70691

如果需要修复此错误的云编译器,可以在http://coliru.stacked-crooked.com因为它使用gcc6.1解决了这个问题

gcc 5.4 也应该对此进行更正: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70691#c5
它于 2016 年 6 月 3 日发布: https://gcc.gnu.org/gcc-5/

 类似资料:
  • 我正在将一个变量赋给一个数组,它是我在刀片文件中声明的。它返回一个错误 下面是我的代码: 我无法理解这个错误。谢谢!

  • 我想把列表中的对象分配给类变量。 感恩节:)

  • 我的代码是这样的: 但最后一句话: 总是停止编译说我需要给新变量分配一个返回值?在if语句之前,已经为k分配了一个值。当我把随机k语句放在if语句中时,它似乎是有效的,但这使得它毫无价值,不是吗?编辑器本身没有错误,但是当我编译时,它给了我这个: 线程“main”java中出现异常。lang.IndexOutOfBoundsException:索引:41,大小:36。util。ArrayList。

  • 对不起,我不知道这个问题的标题是什么。 我在C中有一个函数,它以λ作为参数。 然后我尝试调用这个函数。 我的问题是,我无法从lambda函数内部访问变量,如果我试图用

  • = 赋值操作符(在其前后没有空白符)。 不要混淆 = 与 -eq,后者用来进行比较而非赋值。 同时也要注意 = 根据使用场景既可作赋值操作符,也可作比较操作符。 样例 4-2. 变量赋值 #!/bin/bash # 非引用形式变量 echo # 什么时候变量是非引用形式,即变量名前没有 '$' 符号的呢? # 当变量在被赋值而不是被引用时。 # 赋值 a=879 echo "The value o

  • 当我尝试做以下操作时,我得到了数字或值错误。我正试图将40000长度的字符串赋给一个clob变量,它应该允许我对吗? 我是一个循环,如果试图追加字符串块,那么没有问题,但如果我试图一次性分配“超过32K的字符串”,那么就会出现错误。 我有一个要求,我必须为一个带有clob输入参数的过程分配32K+字符串。