我在Visual Studio 2013 Ultimate中使用Windows 8.1 64位.我正在将程序从Linux移植到Windows,它使用C++,OpenGL和SDL.我在Windows上通过64位的cmake自定义编译了相应的库.当我从Visual Studio运行该程序时,IDE表示存在头部损坏.这并不奇怪,因为我正在使用指针来实例化对象,而我正在使用原始指针,我打算为了参数而改为智能指针.我稍后会做升力魔法.
与此同时,我使用我的Linux计算机通过Valgrind诊断任何内存泄漏,Valgrind没有任何严重的报告.然后我继续使用CppCheck,但那里也没有什么严重的.也许我在这里太宽容了,Windows实际上可能会采取比Linux更严重的不那么严重的事情,这是一个惊喜,因为MSVC往往比GCC更宽容.
因此,该程序适用于Linux,而不适用于Windows.(太棒了!)并且Visual Studio并没有帮助在整个地方抛出异常,这让我更加讨厌Windows.我开始谷歌搜索解决方案并遇到了这个叫做gflags或页面助手的东西,所以我安装了调试工具并试图启动gflags但我不知道如何使用它!然后我发现你必须使用一些名为adp的其他工具,然后将gflags附加到它,所以当我启动adp时它会崩溃.所以现在我不知道该做什么,并且即将中止端口(这很有趣,因为很多人都在抱怨将程序从Windows移植到Linux有多么困难,而事实恰恰相反).
所以,现在我呼吁这个社区寻求帮助:如何调试/诊断Windows上但不是Linux上发生的堆损坏错误?我真的应该使用gflags还是应该只使用我的胆量呢?
我正在创建一个资源管理器,它接受从类派生的类Resource.我的问题是typeid(..).name()返回错误的类名.
我想将像Texture这样的资源添加到地图中,如下所示:
typedef std::unordered_map<std::string, Resource*> ResourceMap;
Run Code Online (Sandbox Code Playgroud)
我希望'class + counter'的名称是Resource的字符串/名称.不幸的是,一切都最终被调用,P8Resource因为这些类派生自"资源".确实是一个不合时宜的困境,但是typeid必须知道什么texture是纹理,而不是资源.
class Resource {}; // abstract
class Texture : public Resource {};
Resource *texture = new Texture();
Texture *texture2 = new Texture();
typeid(texture).name(); // yields 'Resource'
typeid(texture2).name(); // yields 'Texture'
Run Code Online (Sandbox Code Playgroud)
如何在typeid不使用类型转换的情况下使第一个语句产生"纹理"?
我之前发布了一个关于如何让OpenGL在Qt上工作的问题,但现在我希望能够使用OpenGL的最新功能.在Qt之前,我正在使用glew; 但Qt说glew与其QtOpenGL头文件冲突.我查看了QGLWidget和QGLFunctions,但坦率地说,我很困惑我应该做什么才能简单地访问OpenGL的功能.
现在,我使用Qt Creator 3.3.0获得Qt 5.4并使用新的QOpenGLWidget; 然而,如何使用它缺乏指导会让我失望:Qt文档存在并且确实有帮助,但它只演示了如何实例化它,而不是在程序的其他位置使用它.据我所知,这个QOpenGLWidget的功能类似于QGLWidget.Qt详细说明我应该继承它; 但是我没有在它想要使用OpenGL函数的类中实例化OpenGL上下文; 发生在类'glWidget'中,它继承自QOpenGLWidget.
例如,从我的一个使用OpenGL代码的类中摘录:
void Mesh::init()
{
pNumIndices = pIndices.size();
glGenVertexArrays(1, &pVAO);
glGenBuffers(1, &pVertexBuffer);
glGenBuffers(1, &pIndexBuffer);
glBindVertexArray(pVAO);
glBindBuffer(GL_ARRAY_BUFFER, pVertexBuffer);
glBufferData(GL_ARRAY_BUFFER, pVertices.size() * sizeof(Vertex),
&pVertices[0], GL_STATIC_DRAW);
// etc..
}
Run Code Online (Sandbox Code Playgroud)
Mesh是一个不从任何东西继承的类.最初,它只使用了glew,因此它可以获得OpenGL函数的声明; 它不需要知道它们是否有效,因为那是glew的工作.然后在mainApp类中,我将实例化glew.我也明白,还有一个QOpenGLFunctions类,它的功能与glew的功能类似,但是对于所有这些GL类而言,知道要使用的内容显然令人困惑.更重要的是,我尝试寻找glGenVertexArrays(..),但在QOpenGLBuffer,QOpenGLFunctions或QOpenGLWidget中找不到它; 到目前为止,我知道,从OpenGL 4.5开始,它仍然是规范的一部分; 但我的图形驱动程序不使用OpenGL 4.5,所以我改用OpenGL 4.3.我只想说我愿意放弃采用Qt'
在各种类使用OpenGL函数的程序中,如何在不使用glew的情况下使用Qt来调用它们?Mesh是那些不实例化OpenGL但只使用其功能的类之一.
只是让人知道,我已经使用Qt一段时间了(虽然不够!)并且确实喜欢Qt; 但我确实需要知道如何将Qt与OpenGL结合使用以继续开发.大多数教程仍然使用5.4之前的东西.
我一直致力于创建一个 OpenGL 函数加载库,它将帮助我在需要时调用 OpenGL 函数。
我有一个getProcAddress使用 glX的函数。
void* getProcAddress(const char *name)
{
auto pr = reinterpret_cast<void*>(glXGetProcAddress(
reinterpret_cast<const unsigned char*>(name)));
return pr;
}
Run Code Online (Sandbox Code Playgroud)
这将返回 OpenGL 函数的地址。如果我不使用reinterpret_casts,我会收到奇怪的编译器错误,这就是它们存在的原因。
然后我在头文件中定义一个 gl* 函数原型:
typedef void _GLACTIVETEXTURE(GLenum texture);
Run Code Online (Sandbox Code Playgroud)
whereGLenum在另一个头文件中定义为枚举。然后我在一个类中声明函数指针:
_GLACTIVETEXTURE glActiveTexture;
Run Code Online (Sandbox Code Playgroud)
然后在一个名为initI的函数中:
void GLFunctions::init()
{
glActiveTexture = (_GLACTIVETEXTURE)getProcAddress("glActiveTexture");
}
Run Code Online (Sandbox Code Playgroud)
该getProcAddress函数可以自行编译,但上面的代码行无法编译。GCC 抛出这个编译器错误:
error: invalid cast to function type ‘_GLACTIVETEXTURE {aka void(GLenum)}’
Run Code Online (Sandbox Code Playgroud)
而且我不知道如何处理这种编译器错误。这是没有意义的,因为这是一个函数指针,而不是函数本身,除非我使用(). 我不太确定这里的问题是什么;无论是从我这边还是 GCC。不清楚。我试过摆弄指针和空隙,但都是徒劳的,并且出现了相同的错误消息。有谁知道这里发生了什么以及我如何正确调用 OpenGL 函数?
我已经阅读了有关鼠标事件的文档,并且也阅读了有关鼠标输入处理的教程。尽管如此,这个问题仍然存在:
我有一个相机和一个 opengl 上下文,我只是希望如果鼠标移动并单击鼠标左键,相机就会旋转。所以,很自然地我写了这段代码:
void processEvents()
{
float deltaX = 0;
float deltaY = 0;
while (SDL_PollEvent(&pEvent) != 0)
{
if (pEvent.type == SDL_QUIT)
pApp_isRunning = false;
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_LEFT)
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y;
pCamera.rotate(deltaX / REFRESH_RATE, deltaY / REFRESH_RATE);
cout << "Mouse = (" << deltaX << ", " << deltaY << ")" << endl;
}
if (pEvent.type == SDL_MOUSEMOTION && pEvent.button.button == SDL_BUTTON_RIGHT)
{
deltaX += pEvent.motion.x;
deltaY += pEvent.motion.y; …Run Code Online (Sandbox Code Playgroud) 要转换字符串并使其为小写,我们可能会执行以下操作:
#include <iostream>
#include <algorithm>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string str("Sample STRING");
cout << str << endl;
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
cout << str << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道这std::transform是怎么回事; 但是范围操作员::在功能面前做了tolower什么?
如果我删除范围运算符,则编译器会抱怨函数不匹配.如果我std在::运算符前面添加,那么编译器也会抱怨函数不匹配.范围运营商面前的目的是什么tolower?我不知道它叫什么,我到处寻找解释,但无济于事.
我创建一个HandleManager,其目的是简单地映射Handle秒(这是一个typedef的long long int)到string秒.目的是使得使用a的对象Handle也可以通过strings 识别,如果它有助于用户记住该对象.在这种情况下,在这张地图中:
typedef std::unordered_map<Handle, std::string> HandleMap;
Run Code Online (Sandbox Code Playgroud)
这对中的两种类型都是键,只要它们可用于识别任何东西.到目前为止,一切都已编译出来,需要得到的代码Handle.目的是这样当用户分配string如此:
handle("myHandle");
Run Code Online (Sandbox Code Playgroud)
Handle随机生成A ,然后string在前面的映射中将传递的内容与其配对.我现在想要的是能够获得Handle与string基于string传递的配对:
Handle HandleManager::id(const std::string &name)
{
HandleMap::iterator it = pHandles.find(name);
if (it != pHandles.end())
return it->first;
return -1;
}
Run Code Online (Sandbox Code Playgroud)
但由于一些奇怪的原因,编译器抱怨这个:
HandleManager.cpp:48:45: error: no matching function for call to ‘std::unordered_map<long long int, std::basic_string<char> >::find(const string&)’
Run Code Online (Sandbox Code Playgroud)
在上述地图中,string值是值,Handle而键是关键.所以,我怎么能拿到钥匙从unordered_map …
我一直在从 Haskell 书中做一些 Haskell 练习,其中一项任务是我过滤某种类型的值并将它们作为列表返回。
import Data.Time
data Item = DbString String
| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)
database :: [Item]
database =
[
DbDate (UTCTime (fromGregorian 1911 5 1) (secondsToDiffTime 34123)),
DbNumber 9001,
DbString "Hello World!",
DbDate (UTCTime (fromGregorian 1921 5 1) (secondsToDiffTime 34123))
]
Run Code Online (Sandbox Code Playgroud)
这是我要使用的代码,也是我的第一个任务:
Write a function that filters for DbDate values and returns a list of the UTCTime values inside them. 该函数的模板是:
filterDate :: [Item] -> [UTCTime]
filterDate = undefined
Run Code Online (Sandbox Code Playgroud)
我在这里必须使用的是折叠,因为这是这里关注的问题。
我 …