标签: c++

为什么gcc抱怨我的循环?

我有一些相当简单的代码,仍然gcc抱怨(in -O3 -march=native)关于循环展开:

cannot optimize loop, the loop counter may overflow [-Wunsafe-loop-optimizations]
for(auto& plan : fw)
^
Run Code Online (Sandbox Code Playgroud)

这是我的代码版本(剥离了所有fftw的东西,否则它会很长)

class FFTWManager
{
    public:
        void setChannels(unsigned int n)
        {
            fw.resize(n);
            bw.resize(n);
                            //some fftw-specific stuff comes here
        }

        void forward()
        {
            for(auto& plan : fw)
                fftw_execute(plan);
        }

        void backward()
        {
            for(auto& plan : bw)
                fftw_execute(plan);
        }

    private:
        std::vector<fftw_plan> fw = {};
        std::vector<fftw_plan> bw = {};
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中,向量永远不会超过2的大小.


根据评论编辑:我使用了很多标志.

-pedantic -Wextra -Weffc++ -Wall -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion -Wdisabled-optimization -Wformat -Wformat=1 -Wformat-nonliteral -Wformat-security …

c++ gcc for-loop c++11

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

在引用限定符上重载成员函数的用例是什么?

C++ 11使得基于引用限定符重载成员函数成为可能:

class Foo {
public:
  void f() &;   // for when *this is an lvalue
  void f() &&;  // for when *this is an rvalue
};

Foo obj;
obj.f();               // calls lvalue overload
std::move(obj).f();    // calls rvalue overload
Run Code Online (Sandbox Code Playgroud)

我理解这是如何工作的,但它的用例是什么?

我看到N2819建议将标准库中的大多数赋值运算符限制为左值目标(即向赋值运算符添加" &"引用限定符),但这被拒绝了.所以这是一个潜在的用例,委员会决定不再使用它.那么,再一次,什么是合理的用例?

c++ overloading qualifiers rvalue-reference c++11

24
推荐指数
2
解决办法
3131
查看次数

Mac C++/eclipse无法调试:启动命令时出错:gdb --version

我在mac上使用c ++/eclipse kepler,我无法调试任何项目.错误是"启动命令时出错:gdb --version"除此之外,我可以使用其他库构建和运行我的代码.

我搜索了一个与我的问题类似的网站:C++ eclipse的Debugger出现以下错误.'启动程序名'遇到了...启动命令时出错:gdb --version

但是,如果我使用的是Mac,我应该改变什么?

c++ eclipse macos gdb

24
推荐指数
3
解决办法
4万
查看次数

可能的分段错误:我是否正确使用"this->"运算符?

我正在做一个我有问题的作业问题.如果你不方便协助解决作业问题,我应该说我的导师鼓励我们在完全难倒的时候在这个网站上寻求帮助.另外,我已经完成了自己的任务的基本部分,现在我正在做一个可选的挑战问题.无论如何,关于问题!

作为一般的OOP和C++的新手,我无法理解"this->"运算符.我们没有在课堂上介绍它,但我已经在其他地方看到了它,我猜它是如何被使用的.

对于作业,我必须创建一个基于控制台的Tic-Tac-Toe游戏.只有作业的挑战部分需要我们创建一个AI对手,而我们没有获得任何额外的功劳来应对挑战,我只是想知道如何去做.我正在研究像minimax和游戏树这样的东西,但是现在我只是想创建一个"选择一个随机的,开放的"功能.

我有一个名为TicTacToe的课程,它基本上就是整个课程.我将在下面发布与问题相关的部分,但是给我一个错误的部分是这个子程序:

void TicTacToe::makeAutoMove(){
    srand(time(NULL));
    int row = rand() % 3 + 1;
    int col = rand() % 3 + 1;
    if(this->isValidMove(row, col)){
        this->makeMove(row, col);
    }else{
        this->makeAutoMove();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个函数唯一要做的就是在板上移动,假设它是开放的.董事会的设置如下:

char board[4][4];
Run Code Online (Sandbox Code Playgroud)

当我打印它时,它看起来像:

   1  2  3
1  -  -  - 
2  -  -  -
3  -  -  -
Run Code Online (Sandbox Code Playgroud)

问题在于,有时计算机会进行移动,因为函数的随机性,我会发现一个难以追踪的错误.我认为这是一个段错误,但我无法分辨,因为我无法在调试器中复制它.

我认为"this->"运算符用作指针,如果指针为NULL并且它被访问它可能会给我这个问题.它是否正确?有没有办法来解决这个问题?

我理解这对社区的许多成员来说可能是一个非常低级别的问题,但我会感谢你的帮助,只要它没有附带关于这是多么微不足道的讽刺言论,或者我必须是多么愚蠢.我在学习,这意味着我有时会遇到一些愚蠢的问题.

如果它有帮助,这里有更多我的.cpp文件:

TicTacToe::TicTacToe()
{
    for(int row = 0; row < kNumRows; row++){
        for(int col = 0; col < kNumCols; col++){
            if(col == 0 && …
Run Code Online (Sandbox Code Playgroud)

c++ oop this

24
推荐指数
4
解决办法
882
查看次数

可观察行为和未定义行为 - 如果我不调用析构函数会发生什么?

注意:我见过类似的问题,但没有一个答案是准确的,所以我自己也会这样问.

这是一个非常挑剔的"语言 - 律师"问题; 我正在寻找权威的答案.

C++标准说:

程序可以通过重用对象占用的存储来结束任何对象的生命周期,或者通过使用非平凡的析构函数显式调用类类型的对象的析构函数来结束任何对象的生命周期.对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数; 但是,如果没有对析构函数的显式调用或者如果没有使用delete-expression来释放存储,则不应该隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都有未定义的行为.

我根本不明白"取决于副作用"是什么意思.

一般问题是:

是忘记调用析构函数而不是忘记使用同一个函数调用普通函数?

举例说明我的观点是:

考虑下面这样的程序.还要考虑明显的变化(例如,如果我不在另一个上构造一个对象,但我仍然忘记调用析构函数,如果我打印输出来观察它,等等):

#include <math.h>
#include <stdio.h>

struct MakeRandom
{
    int *p;
    MakeRandom(int *p) : p(p) { *p = rand(); }
    ~MakeRandom() { *p ^= rand(); }
};

int main()
{
    srand((unsigned) time(NULL));        // Set a random seed... not so important
    // In C++11 we could use std::random_xyz instead, that's not the point

    int x = 0;
    MakeRandom *r = …
Run Code Online (Sandbox Code Playgroud)

c++ destructor undefined-behavior language-lawyer

24
推荐指数
3
解决办法
1519
查看次数

使用std :: tie作为循环目标的范围

我想做类似以下的事情:

//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
  TypeA a;
  TypeB b;

  for (std::tie(a, b) : someInitializingFunction()) {
    // do stuff;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是有效的代码,因为正如标准所说,基于for循环的范围被定义为等效于:

{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
      __end = end-expr;
      __begin != __end;
      ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}
Run Code Online (Sandbox Code Playgroud)

其中for-range-declaration定义为:

for-range-declaration:attribute-specifier-seq_ {opt} decl-specifier-seq声明符

那么阻碍我的是decl-specifier-seq没有标记为可选的?

因此,似乎我必须依靠旧式的循环来实现这个问题:

std::vector<std::pair<TypeA, TypeB>> myList = someInitializingFunction();

{
  TypeA a;
  TypeB b;

  for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::tie(a, b) = *it;
    // do …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop tie language-lawyer std-pair

24
推荐指数
2
解决办法
5772
查看次数

abs vs std :: abs,引用说什么?

当心,我在说::abs(),不是std::abs()

根据cplusplus.com网站,abs对于stdlib.h C版本应该表现不同,如果你包括<cmath>

以下是此页面的摘录(::abs不处理std::abs):

double abs (double x); 
float abs (float x); 
long double abs (long double x);
Compute absolute value
/*
Returns the absolute value of x: |x|.
These convenience abs overloads are exclusive of C++. In C, abs is only declared
in  <cstdlib> (and operates on int values). 
The additional overloads are provided in this header (<cmath>) for the integral types: 
These overloads effectively …
Run Code Online (Sandbox Code Playgroud)

c++ cmath

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

保持std :: vector <>的前N个元素并删除其余元素

std::vector<int>我的C++应用程序中有一个变量.矢量的大小在运行时确定,但通常是约1000.

我已经对这个向量进行了排序(效果很好),排序后,我只想保留第一个50元素.

我试过了:

kpts.erase(kpts.begin() + 50, kpts.end());
Run Code Online (Sandbox Code Playgroud)

kpts我的矢量在哪里,表现太可怕了!大概是因为这种方式erase运作.

有没有办法只保留50向量的第一个元素?看起来应该是显而易见的,但我找不到办法做到这一点.

c++ vector

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

std :: swap(x,x)是否保证x不变?

这个问题是基于Scott Meyers最近发表的博客文章.

看起来"显而易见" std::swap(x, x)应该x在C++ 98和C++ 11中保持不变,但我无法在任何标准中找到任何保证.C++ 98 std::swap在复制构造和复制赋值方面进行了定义,而C++ 11则根据移动构造和移动赋值来定义它,这似乎是相关的,因为在C++ 11(和C++ 14)中,17.6 .4.9表示移动分配不需要自我分配安全:

如果函数参数绑定到右值引用参数,则实现可以假定此参数是对此参数的唯一引用.... [注意:如果程序在将左值传递给库函数时将左值转换为x值(例如通过使用参数move(x)调用函数),程序实际上要求该函数将该左值视为暂时的.实现可以自由地优化别名检查,如果参数是左值,则可能需要这些检查. - 尾注]

引起这种措辞的缺陷报告使结果清晰:

这澄清了移动赋值运算符不需要执行复制赋值运算符中常见(并且需要)的传统if(this!=&rhs)测试.

但是在C++ 11和C++ 14中,std::swap预计会使用这个实现,

template<typename T>
void swap(T& lhs, T& rhs)
{
  auto temp(std::move(lhs));
  lhs = std::move(rhs);
  rhs = std::move(temp); 
}
Run Code Online (Sandbox Code Playgroud)

并且第一个赋值是对self进行赋值,其中参数是rvalue.如果移动赋值运算符T遵循标准库的策略并且不担心赋值给自己,那么这似乎可以判断未定义的行为,这也意味着它std::swap(x, x)也会具有UB.

即使是孤立的,这也是令人担忧的,但是如果我们认为std::swap(x, x)在C++ 98中应该是安全的,那么这也意味着C++ std::swap11/14可以默默地破坏C++ 98代码.

所以std::swap(x, x)保证x保持不变?在C++ 98中?在C++ 11中?如果是,那么它如何与17.6.4.9的移动分配许可相互作用而不是自我分配安全的?

c++ swap c++11

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

如何创建半透明形状?

我想知道如何在OpenCV中绘制半透​​明的形状,类似于下图中的那些(来自http://tellthattomycamera.wordpress.com/)

在此输入图像描述

我不需要那些花哨的圆圈,但我希望能够绘制一个矩形,例如,在3通道彩色图像上,并指定矩形的透明度,类似于

rectangle (img, Point (100,100), Point (300,300), Scalar (0,125,125,0.4), CV_FILLED);
Run Code Online (Sandbox Code Playgroud)

0,125,125矩形的颜色在哪里,并0.4指定透明度.但是,OpenCV没有在其绘图功能中内置此功能.如何在OpenCV中绘制形状,以便绘制的原始图像通过形状部分可见?

c++ opencv shape alpha-transparency

24
推荐指数
2
解决办法
3万
查看次数