小编use*_*454的帖子

std::iterator::reference 是否必须是引用?

我已经根据这里的答案实现了一个自定义迭代器: https:
//stackoverflow.com/a/31886483/1973454

Type* _ptr但是,我的代码最终检索的是存储在某个单一位置的值,而不是成员,就好像它使用以下函数一样:

// my iterator class gets its values from this function
float globalFloat{ 0 };
float* retrieveFloat (int idx)
{
    globalFloat = (float)idx;
    return &globalFloat;
}
Run Code Online (Sandbox Code Playgroud)

这意味着为了同时使用两个迭代器(即使用 upper_bound 进行搜索),我必须在允许访问之前在本地缓存浮点数:

class Iterator : public std::iterator<std::random_access_iterator_tag, float, int>
{
public:
    Iterator () = default;
    Iterator (int idx) : _index (idx) {}

    Iterator& operator++ () noexcept { ++_index; return *this; }
    Iterator& operator-- () noexcept { --_index; return *this; }

    /// ... rest of iterator declaration

    const float& …
Run Code Online (Sandbox Code Playgroud)

c++ iterator reference

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

相当奇怪的铿锵问题

在发布此帖子之前,我尝试了一些Google搜索,但说实话,我不知道要搜索什么.我有一个C++项目,并且很高兴使用GNU编译器(g ++).今天我尝试使用clang ++进行编译并获得了段错误.

好的,好的,我可以解决这个问题.在仔细阅读我的代码并打印一些东西之后,我就能解决问题了.然而,这个解决方案让我感到非常麻烦和困惑.

这是情况:我使用的是树状数据结构,它存储了一个名为Ligament的类,但我将它存储在std :: vector中.我这样做是通过存储一个"children"的向量,它实际上只是向量中父对象和子对象之间的整数偏移量.通过这种方式,我可以使用this指针访问子节点,即

child = this[offset];
Run Code Online (Sandbox Code Playgroud)

但是,这一点都不重要.这是这个问题:我有一个Ligament :: addChild(int)函数,它接受一个整数并将其推送到作为Ligament成员的向量的后面:

void Ligament::addChild(uint32_t offset){
   children.push_back(offset);
}
Run Code Online (Sandbox Code Playgroud)

很简单的东西.一般情况下,我向addChild传递一个从名为fill的递归函数返回的参数:

//starting at root
uint32_t fill(vector<Ligament>& lVec, TiXmlElement * el){
    //store current size here, as size changes during recursion
   uint32_t curIdx = lVec.size();
   lVec.push_back(createLigament());

   //Add all of this Ligament's children
   TiXmlElement * i = el->FirstChildElement("drawable");
   for (; i; i=i->NextSiblingElement("drawable")){
      uint32_t tmp = fill(lVec, i) - curIdx;
      lVec[curIdx].addChild(tmp);

      //Does not work in clang++, but does in g++
      //lVec[curIdx].addChild(fill(lVec,i)-curIdx);
   }

   //return the ligament's index …
Run Code Online (Sandbox Code Playgroud)

c++ g++ vector clang clang++

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

Lazyfoo SDL2/GLSL代码仅在OS X上显示黑屏

滚动到底部解决方案

我见过几个类似的问题(是最接近的),但还没有找到答案.我有一些代码可以在Windows和Linux上成功运行,但是当我在OS X(10.9,Mavericks)上运行时,我只是得到一个黑屏.

我正在直接复制Lazyfoo的第51个SDL2教程,在这里找到(源代码位于页面底部).

我对他的代码所做的唯一更改是修复某些包含:

#include <SDL.h> ==> #include <SDL2/SDL.h>
#include <gl\glew.h> ==> #include <GL/glew.h>
#include <SDL_opengl.h> ==> #include <SDL2/SDL_opengl.h>
#include <gl\glu.h> ==> #include <OpenGL/glu.h>
Run Code Online (Sandbox Code Playgroud)

我用g ++编译程序,我下了brew(4.9)

g++ 51_SDL_and_modern_opengl.cpp -lSDL2 -lGLEW -framework OpenGL
Run Code Online (Sandbox Code Playgroud)

我对这个问题有几个怀疑:

  1. 我正在使用SDL2(从brew下载)的OpenGL标题.我也有GLEW的brew,但我使用Apple的默认glu.
  2. 我的OS X版本无法处理OpenGL 3.3,或者它想要3.2

至于第二个,glGetString(GL_VERSION)和glGetString(GL_SHADING_LANGUAGE_VERSION)的输出是:

GL版本:3.3 NVIDIA-8.24.16 310.90.9.05f01

GLSL版本:3.30

我尝试将SDL调用中的次要版本切换为2,但这并没有解决它.我也尝试将版本更改为#version 330而不是#version 140,但仍然没有.

没什么我的意思是我得到一个黑屏,但程序编译.为了记录,我对该样本的期望是白色方块.Lazyfoo有一个教程(前一个,编号50),他使用OpenGL 2.1绘制白色方块,并且该代码在Apple机器上按预期运行.

任何帮助表示赞赏.我正在辩论要求Lazyfoo自己,但这似乎是他现在正在努力的事情.

回答

感谢Reto Koradi的答案 - 显然核心配置文件需要使用Vertex Array Objects.我通过改变从第180行开始的代码(以及添加全局VAO GLuint)来实现它:

//Create VAO
glGenVertexArrays(1, &gVAO);
glBindVertexArray(gVAO);

//Create 2 buffers (position, indices)
GLuint buffers[2];
glGenBuffers(2, buffers);   

//Create VBO
glBindBuffer( GL_ARRAY_BUFFER, buffers[0]); …
Run Code Online (Sandbox Code Playgroud)

opengl macos sdl glsl sdl-2

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

多线程程序仅适用于print语句

我希望我能想到一个更具描述性的标题,但事实就是这样.我有一些代码,我想用它做一些图像处理.我还需要从那些处理过的图像中获取一些统计数据,我想在一个单独的线程上做这个,所以我的主线程可以继续进行图像处理.

除此之外,这是我的代码.除了我的Image类包装一个OpenCV Mat这一事实之外,它应该不是真正相关的(尽管据我所知,我没有使用OMP或任何东西):

#include <thread>
#include <iostream>
#include <vector>
using namespace std;

//Data struct
struct CenterFindData{
    //Some images I'd like to store
    Image in, bpass, bpass_thresh, local_max, tmp;
    //Some Data (Particle Data = float[8])
    vector<ParticleData> data;
    //My thread flag
    bool goodToGo{ false };
    //Constructor
    CenterFindData(const Image& m);
};

vector<ParticleData> statistics(CenterFindData& CFD);
void operate(vector<CenterFindData> v_CFD);


..........................................
..........................................
..........................................


void operate(vector<CenterFindData> v_CFD){
    //Thread function, gathers statistics on processed images
    thread T( [&](){
        int nProcessed(0);
        for (auto& cfd : v_CFD){
            //Chill while the …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading race-condition c++11

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

阻止Android模拟器启动?

我见过这个问题反过来问,但是:
我是 Windows 机器上的 Android 开发人员,使用 Google Pixel 1。我想使用 adb 调试我的代码,但是每当 adb 启动时,它都会启动一个模拟器

连接的设备列表
FA6A40303383 device
emulator-5562 offline # 我不想启动这个!

我能理解为什么有人会想要这个,但我在任何情况下都不希望这个模拟器启动。这样 adb 会自动使用我的手机,而不是让我指定设备/模拟器。

我使用 NVidia 的 CodeWorks for Android (1R7) 安装了 SDK - 我曾经安装过 Android Studio,但我卸载了它(并删除了所有 User/.android* 目录)并完全卸载/重新安装了 Codeworks for Android,但模拟器仍然启动。

我不习惯在那里看到它,这有点扰乱我的工作流程 - 有没有办法阻止它启动?

android-sdk-tools android-studio

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