小编RL-*_*L-S的帖子

编译器、库或用户错误?Eigen::Array,GCC 12.1,“数组下标 [...] 部分超出数组边界”

更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。

\n

这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):

\n
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n    Array<double, 2, 2> a;\n    a.setRandom();\n\n    Array<double, 3, 2> b;\n    b.col(0).tail(2) = a.col(1);\n    // b.col(0).template tail<2>() = a.col(1);\n\n    return b;\n}\n\nint main(){\n    std::cout << foo() << \'\\n\';\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32

\n

在以下情况下不会出现该错误: …

c++ arrays vectorization eigen eigen3

8
推荐指数
0
解决办法
845
查看次数

我可以使用 istream_iterator&lt;char&gt; 将一些 istream 内容复制到 std::string 中吗?

我有一个istream并且需要将两个分隔符之间的内容复制到一个std::string. 我可以找到定界符' streampos,但是当尝试使用它istream_iterator<char>来遍历流的部分时,它不起作用。这是我尝试过的:

#include <iostream>
#include <sstream>
#include <iterator>


std::string copyToString( std::istream& is )
{
    is >> std::ws;

    auto someLength {10};

    std::istream_iterator<char> beg {is};

    is.seekg( someLength, std::ios::cur );

    //std::istream_iterator<char> end { is };
    std::istream_iterator<char> end { std::next(beg, someLength) };

    return std::string{ beg, end };
}




int main()
{
    std::stringstream ss;
    ss.str( "   { my string content  }" );

    std::cout << "\"" << copyToString( ss ) << "\"\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计输出长度为 10 个字符,但它只是 …

c++ stdstring istream-iterator istream input-iterator

5
推荐指数
1
解决办法
222
查看次数

违反常量正确性:我应该实际期待哪些问题?

我想使用一个函数解析器库,其中成员函数FunctionParser::Eval()是非常量的,因为它将错误代码写入成员变量。我想将此函数解析器集成到代码库中,在该代码库中,将通过包含const该函数解析器的类的成员函数调用此函数,从而违反const正确性。

const成员函数是接口的一部分,其中constness 具有语义意义。我可以改变那个界面,所以这仍然是一个选择。作为测试,我曾经const_cast执行违反const正确性的代码,这不会导致任何错误或单元测试失败(至少不是在调试模式下)。

现在我的问题是:const在这种情况下违反正确性时,我应该期待什么问题?(这值得吗?)

c++

2
推荐指数
1
解决办法
58
查看次数

OpenMP 缩减:min 给出错误结果

我想在循环parallel外部的区域中使用 OpenMP 缩减for。根据OpenMP 参考parallel,可以在区域中使用归约子句,因此不需要for循环 or 。sections

reduction (min:...)但是,当在某个区域使用 OpenMP 时parallel,我得到的结果不正确。但是,如果我对 a 使用完全相同的结构reduction (max:...),则结果是正确的。如果我使用循环进行最小减少(#pragma omp for reduction (min:...)),结果是正确的,但我认为这没有必要。这是我的代码:

#include <omp.h>
#include <iostream>
#include <limits>
#include <algorithm>

int main(){
    auto minVar { std::numeric_limits<int>::max() };
    auto maxVar { std::numeric_limits<int>::min() };
    auto minVarLoop { std::numeric_limits<int>::max() };

    #pragma omp parallel
    {
        int threadNo { omp_get_thread_num() };

        #pragma omp reduction (min:minVar)
        minVar = std::min(minVar, threadNo);
        // minVar = minVar …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading g++ openmp c++11

1
推荐指数
1
解决办法
300
查看次数