我已经根据这里的答案实现了一个自定义迭代器: 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) 在发布此帖子之前,我尝试了一些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) 滚动到底部解决方案
我见过几个类似的问题(这是最接近的),但还没有找到答案.我有一些代码可以在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)
我对这个问题有几个怀疑:
至于第二个,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) 我希望我能想到一个更具描述性的标题,但事实就是这样.我有一些代码,我想用它做一些图像处理.我还需要从那些处理过的图像中获取一些统计数据,我想在一个单独的线程上做这个,所以我的主线程可以继续进行图像处理.
除此之外,这是我的代码.除了我的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) 我见过这个问题反过来问,但是:
我是 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,但模拟器仍然启动。
我不习惯在那里看到它,这有点扰乱我的工作流程 - 有没有办法阻止它启动?