小编new*_*mer的帖子

通过引用捕获异常

这个C++教程的标题为"标准异常"的部分中,有一个示例代码,它使用从STL中的标准异常类派生的类:

// standard exceptions
#include <iostream>
#include <exception>
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex; //Declares an instance of myexception outside of the main function

int main () {
  try
  {
    throw myex;
  }
  catch (exception& e) //My question is regarding this line of code
  {
    cout << e.what() << endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码打印出来My exception happened.但是,如果我删除&符号,它会打印出来std::exception,这是what() …

c++ reference exception

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

在3D图形中,什么是相机或眼睛空间?

我正在尝试通过Jason L. McKesson的"学习现代3D图形编程"来学习3D图形编程.

我还没有真正看过其他指南,但本指南似乎强调了3D图形背后的理论和数学.现在,我被困在这个页面上:

http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html

我不确定他的相机空间意味着什么,以及为什么有必要将3D世界投射到2d表面上.这个问题有点模糊,所以不是一个完整的解释,也可能会给我提供一种解释这些概念的不同方式的链接.

opengl 3d graphics

5
推荐指数
3
解决办法
7141
查看次数

使用webgl的粒子系统

对于图形课程,我们在WebGL中实现粒子系统.在JavaScript中进行粒子模拟计算会非常慢,我们的教授希望我们在GPU上进行粒子模拟.

为了做这个粒子模拟,我想我们上传一个包含我们的粒子数据(位置,速度,质量等)的顶点缓冲区,然后让我的顶点着色器为模拟做一些数学运算,并将结果写入不同的顶点缓冲区,表示粒子的下一个状态.然后我可以gl.POINTS使用不同的着色器程序渲染我的粒子进行渲染.

这似乎是变换反馈,我在这里学习:http://open.gl/feedback

但是,似乎转换反馈目前不包含在WebGL中.这篇博客文章称,WebGL 2.0将提供转换反馈.实际上,当我尝试这样的语句时gl.beginTransformFeedback;,我得到一个错误,说明方法没有定义.

如果变换反馈不可用,我应该如何在WebGL中进行粒子模拟?

opengl-es webgl particle-system

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

Scheme/Racket:用布尔折叠

(foldr + 0 '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)

回报10这是我所期望的,但是

(foldr and false '(true true false))
Run Code Online (Sandbox Code Playgroud)

给了我错误

and: expected an open parenthesis before and, but found none
Run Code Online (Sandbox Code Playgroud)

foldr采用一个函数(它有两个参数,因为我有一个列表),一个基本情况和一个列表.我希望我的第二行代码返回true如果列表的布尔值超过零并且它们都是真的,那就是我认为它会起作用的方式.但显然不是.

scheme function fold special-form racket

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

C++:对动态内存的引用

考虑到何时使用哪一个,我仍然不确定指针与引用语义.

现在,我的印象是引用本质上是指针,必须在声明时初始化,然后从那一点开始就不能指向其他任何东西.换句话说,它们就像Type* const(不Type const*),或者,它们不能被重新安置.它基本上成为该对象的"新名称".现在我听说编译器实际上并不需要使用指针来实现引用,但我认为你仍然可以用这种方式来考虑它们,关于它们的可见行为是什么.

但为什么你不能这样做:

int& foo = new int;
Run Code Online (Sandbox Code Playgroud)

我想创建一个动态内存的引用.这不编译.我收到了错误

error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*'
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义.似乎新的操作符将给定类型的指针返回给操作系统的内存地址?动态分配给我.

那么如何创建动态内存的"引用"呢?

编辑:可以理解为精确解释C++中引用和指针之间差异的资源的链接.

c++ pointers reference

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

实现锁定

我试图了解锁是如何工作的.

假设我想在C++中实现一个非常简单的锁

class Resource{
    public:
    bool lock();
    void unlock();
    ... methods to change/read the Resource ...

    private:
    bool isLocked;
}
Run Code Online (Sandbox Code Playgroud)

Resource调用的用户lock(),如果isLocked为true,则lock()返回false,并且Resource的用户必须等待或执行其他操作.如果isLocked为false,则lock()设置isLocked为true,并返回true.然后调用者可以对资源做任何他想做的事情.他之后调用unlock()资源设置isLocked为false.

但是,如果资源的两个用户lock()在同一时间呼叫怎么办?这种情况很少发生吗?我认为更正式地说,这涉及使lock()操作"原子化",尽管我不确定这个词是什么意思.

c++ multithreading locking

4
推荐指数
2
解决办法
3245
查看次数

位移和分配

这有点让我发疯.

int a = 0xffffffff;
int b = 32;
cout << (a << b) << "\n";
cout << (0xffffffff << 32) << "\n";
Run Code Online (Sandbox Code Playgroud)

我的输出是

-1
0
Run Code Online (Sandbox Code Playgroud)

为什么我没有得到

0
0
Run Code Online (Sandbox Code Playgroud)

c c++ bit-shift

4
推荐指数
2
解决办法
528
查看次数

浮点数和它的否定之和是否保证为零?

使用标准的IEEE浮点数,a + -a保证完全0适用于任何值a

我想象a并且-a具有完全相同的位表示,减去符号位,因此将它们加在一起0肯定会产生,但我不确定.

floating-point

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

嵌套的try-catch块?

int main ()
{
    try
    {
        try
        {
            throw 5;
        }
        catch (int n)
        {
            throw;
        }
    }
    catch (...)
    {
        cout << "Exception occurred";
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印出"异常发生"但是

int main ()
{
    try
    {
        try
        {
            throw;
        }
        catch (...)
        {
            throw;
        }
    }
    catch (...)
    {
        cout << "Exception occurred";
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是错误.看起来我正在尝试捕捉完全一样!唯一的区别是,在第一种情况下我抛出一个int,然后是一般异常,但在第二种情况下,我两次抛出一般异常.程序是否混淆了去哪个捕获?

c++ exception try-catch

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

C ++语法:使用typedef进行类型转换

我正在看这段代码,语法有麻烦:

struct Instance
{
    typedef glm::vec3(*OffsetFunc)(float);

    OffsetFunc CalcOffset;

    glm::mat4 ConstructMatrix(float fElapsedTime)
    {
        glm::mat4 theMat(1.0f);

        theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);

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

它是C ++代码,与OpenGL有关,但我的问题不是关于OpenGL。的glm::vec3, vec4, mat4是尺寸3和4的只是载体和MAT4是4×4的方阵。glm库中有重载的运算符,因此如下所示:

theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);

可以按您期望的那样工作,theMat用一个由1.0fcast或typedef或函数调用组成的4-d向量填充第4列,我不确定是什么,这就是我的问题。

是什么typedef glm::vec3(*OffsetFunc)(float);CalcOffset(fElapsedTime)意味着什么?

我尝试在这里阅读:http : //en.wikipedia.org/wiki/Typedef#Using_typedef_with_type_casts,但是这种解释对我而言似乎没有任何意义。

编辑:我知道typedef仅在为类型提供另一个别名时是如何工作的。

编辑2:我认为这可能是使用一个指向函数的指针来做的,因为它看起来像一个指针,并且float在那里像它的一个函数参数类型,似乎是这种情况,但我仍然不是确定这类代码究竟是做什么的。

c++ casting typedef

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

数字融合,Runge-Kutta,RK4在游戏设计中

几乎每场比赛都倾向于使用一些游戏循环.Gafferongames有一篇关于如何制作精心设计的游戏循环的精彩文章:http://gafferongames.com/game-physics/fix-your-timestep/

在他的代码中,他使用integrate( state, t, deltaTime );,我相信state包含对象的位置,速度和加速度.他用RK4将其从整合tt+deltaTime.

我的问题是,为什么使用像RK4这样的数值积分技术,当你可以使用运动学方程(这里)找到确切的值?

这些方程在加速度恒定时起作用.你似乎很少会一个时间步长改变加速度.看起来RK4是一种性能更低,精度更低,更复杂的解决方案.

编辑:我认为您可以为对象添加"混蛋"值,如果您真的想要,仍然可以找到加速度,速度和位移的精确表达式.

编辑2:嗯,我没有仔细阅读他的"集成基础知识"文章.我认为他正在对阻尼器和弹簧进行建模,这会在一个时间步长内造成非恒定的加速度.

math physics numerical-integration game-physics

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

C++中的动态内存分配需要new运算符new?

int d;
cin >> d;
int asdf[d];
Run Code Online (Sandbox Code Playgroud)

这被认为是动态内存分配吗?根据http://www.cplusplus.com/doc/tutorial/dynamic/,似乎我甚至不能编译它,因为不使用new运算符的数组只能声明为常量,也许我读错了.(我正在使用CodeBlocks和GNU CCC编译器)

它和之间的区别是什么?

int d;
int *asdf;
cin >> d;
asdf = new int[d];
Run Code Online (Sandbox Code Playgroud)

在删除之前,使用新生命创建的数组是唯一的区别,而第一个数组在离开范围后会立即释放吗?

c++ memory dynamic new-operator

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